【问题标题】:WMDropFiles problem on win7win7上的WMDropFiles问题
【发布时间】:2011-11-08 19:38:16
【问题描述】:

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

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

  1. 这是允许用户将文件拖放到应用程序的方法吗?如果没有,现在应该怎么做?
  2. 知道为什么它在#1 计算机上编译但不能在#2 计算机上编译时有效吗? (在 #1 计算机上编译时,程序在两台计算机上都能正常运行)

非常感谢任何帮助或评论。

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;

【问题讨论】:

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


    【解决方案1】:

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

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

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

    至于WM_DROPFILES是不是一个合理的方法,我觉得用它没有问题。

    【讨论】:

    • 我实际上以管理员身份运行计算机#1 (vista),但不知道计算机#2。下次我使用计算机时,我将尝试从资源管理器中运行可执行文件。运行可执行文件与从 IDE 运行有什么区别?
    • 如果您运行提升权限,那么低完整性进程将无法向您发送消息。如果您的 IDE 升级了,那么当您从 IDE 运行时,您的应用程序也会升级。
    • 您可以使用ChangeWindowMessageFilterEx 来允许WM_DROPFILES 从低特权进程接收。
    • @TOndrej 好吧,你可以,但这并不是最好的方法。
    • @David 这可能取决于您要处理的内容。 ;-)
    【解决方案2】:

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

    希望这会有所帮助, 奥拉夫

    【讨论】:

    • 您的意思不是“提升的应用程序如何从未提升的应用程序接收文件”吗?
    • 对我来说,它在 Win 8 下不起作用(来自 Listings.zip 的尝试示例)。似乎没有办法从具有较低完整性的应用程序拖放到具有较高完整性的应用程序与 Windows 8 (至少我找不到任何解决方案)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2015-10-03
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多