win7上的WMDropFiles问题

时间:2011-09-01 23:29:33

标签: delphi windows-7 drag-and-drop windows-vista delphi-2010

我已经实现了以下过程,当我在运行Windows Vista,计算机#1的计算机上编译它时,它可以正常工作。如果我将创建的.exe文件共享到另一台运行win7的计算机,计算机#2,它运行良好。问题是,当我让计算机#2编译它时,它不会简单地认识到应用程序上丢弃了任何东西。这段代码完全没有响应。它的构建和编译没有错误或警告。 我一直在网上搜索一段时间没有找到任何解释为什么会发生这种情况或其他人有这个问题。

两台计算机都使用安装了相同组件的Delphi 2010。

  1. 这是允许用户将文件拖放到应用程序的方法吗?如果没有,今天应该怎么做?
  2. 任何想法为什么它在计算机#1上编译而不是计算机#2编译? (在计算机#1上编译时,该程序在两台计算机上都能正常工作)
  3. 非常感谢任何帮助或评论。

    procedure TfMainForm.WMDROPFILES(var msg: TWMDropFiles);
    const
      MaxLength = 255;
    
    var
      nFiles : integer;
      i : integer;
      fileName : array [0..MaxLength] of char;
      fileNames : TStringArray;
    
    begin
      // Get number of files dropped
      nFiles := DragQueryFile(msg.Drop,  $FFFFFFFF, fileName, MaxLength);
    
      // Get filenames
      SetLength(fileNames, nFiles);
      for i := 0 to nFiles - 1 do begin
        DragQueryFile(msg.Drop, i, fileName, MaxLength);
        fileNames[i] := fileName;
      end;
    
        // Add files
      projectHandler.addFiles(fileNames);
    
      //release memory
      DragFinish(msg.Drop);
    end;
    

2 个答案:

答案 0 :(得分:5)

如果您在计算机#2上的IDE中运行,我会猜测一下。我敢打赌,如果你在计算机#2上编译但是从资源管理器而不是从IDE启动可执行文件,它就可以工作。拼图的最后一块是我打赌你是在管理员的计算机#2上运行你的IDE。

在Vista和Windows 7上,您无法向具有更高完整性级别的进程发送消息。如果您的进程以管理员身份运行,那么它将具有比资源管理器更高的完整性级别,因此不会接受删除的文件。

如果我的猜测是正确的,我建议您停止以管理员身份运行Delphi,它不需要这个。

至于WM_DROPFILES是否合理,我认为使用它没有问题。

答案 1 :(得分:1)

http://www.web-developer.de/content/download/7387/137496/file/Listings.zip,您可以找到使用Delphi XE编写的示例(也可以使用D2010编写)。子文件夹“2_WmDropFiles”包含一个项目“WmDropFiles.dpr”,该项目显示如何运行提升的应用程序可以从未运行提升的应用程序接收文件。评论等是德语,所以如有疑问请使用谷歌翻译。

希望这有帮助, 奥拉夫