win7上的WMDropFiles问题

发布于 2024-12-03 02:41:10 字数 1055 浏览 1 评论 0原文

我已经实现了以下过程,当我在运行 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;

I've implemented the following procedure and it works properly when I compile it on my computer running windows vista, computer #1. If I share the created .exe file to another computer running win7, computer #2, it runs fine aswell. The problem is when I let the computer #2 compile it, it wont simply recognize that anything's dropped on the application. There's no response at all in this code. It's built and compiled without errors or warnings.
I've been searching the net for a while without finding anything that explains why this happens or someone else with this problem.

Both computers use Delphi 2010 with the same components installed.

  1. Is this the way to go to allow the user to drop files onto the application? If not, how should it be done nowdays?
  2. Any ideas why it works when it's compiled on computer #1 but not computer #2? (The program works properly on both computers when compiled on computer #1)

Any help or comment is highly appreciated.

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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寻梦旅人 2024-12-10 02:41:10

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

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

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

至于WM_DROPFILES是否是一种合理的方法,我认为使用它没有问题。

I'm going to take a wild guess that if you are running from within the IDE on computer #2. I bet that if you compile on computer #2 but start the executable from explorer rather than from the IDE, it works. The final piece of the jigsaw is that I bet you are running your IDE on computer #2 as administrator.

On Vista and Windows 7 you can't send messages to a process with a higher integrity level. If your process is being run as administrator then it will have a higher integrity level than explorer and so won't accept the dropped files.

If my guess is correct I recommend that you stop running Delphi as administrator, it doesn't need this.

As for whether or not WM_DROPFILES is a reasonable approach, I see no problems with using it.

定格我的天空 2024-12-10 02:41:10

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

希望这有帮助,
奥拉夫

At http://www.web-developer.de/content/download/7387/137496/file/Listings.zip you can find an example written using Delphi XE (compiles with D2010 as well). The subfolder "2_WmDropFiles" contains a project "WmDropFiles.dpr" that shows how to an app that runs elevated can receive files from an app which does not run elevated. The comments etc. are in German, so please use Google translate when in doubt.

Hope this helps,
Olaf

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文