以管理员身份运行阻止onDropped of DropTarget

问题描述 投票:1回答:1

我试着称之为:

MoveFileEx(pChar(src), pChar(dest), MOVEFILE_COPY_ALLOWED)

该程序完成了Copy部分,但复制后它没有Delete文件。我想也许我应该用Administrative privileges运行我的应用程序,但是在我做的那一刻,我的onDroppedDropTarget事件被阻止了。

我怎样才能克服这个问题?

delphi winapi
1个回答
4
投票

我无法确定为什么你的源文件没有被删除。是的,您可能无权删除它们,只能复制它们。这是MoveFileEx()记录的可能性:

MOVEFILE_COPY_ALLOWED 2(0x2)

如果要将文件移动到其他卷,则该函数使用CopyFile和DeleteFile函数模拟移动。

如果文件已成功复制到其他卷并且无法删除原始文件,则该函数将成功保留源文件。

该值不能与MOVEFILE_DELAY_UNTIL_REBOOT一起使用。

但是,关于DragTarget,当您运行升级的应用程序时,它会以更高的完整性级别运行,并且“用户界面权限隔离”(UIPI)会阻止低完整性流程与更高完整性流程的UI进行通信。在这种情况下,UIPI阻止低完整性进程的阻力到达你的窗口,因此没有调用DragTarget,并且没有办法(我知道)阻止它。

你有几个选择:

  1. 不再提升您的应用程序,以便它以与大多数其他非提升应用程序相同的完整性级别运行。仅提升需要提升的代码,即调用MoveFileEx()。你可以: 使用带有MoveFileEx()动词的ShellExecute/Ex(),产生一个单独的过程来调用runas。它可以是一个单独的EXE,也可以是主要的EXE,并添加命令行参数来告诉它该做什么。 将MoveFileEx()放入一个COM对象,在需要时使用COM Elevation Moniker进行实例化。
  2. 如果你必须提升你的应用程序,然后实现一个单独的非提升应用程序来接受drop,然后使用UIPI不阻止的IPC机制(例如套接字)将删除的数据传递给提升的应用程序。
  3. 让你的应用程序处理WM_DROPFILES窗口消息,而不是使用DragTarget。使用ChangeWindowMessageFilter/Ex()允许WM_COPYDATAWM_DROPFILESWM_COPYGLOBALDATA窗口消息通过UIPI。这样,您至少可以将文件拖到您的应用程序中,但DragTarget不会允许其他类型的数据。
© www.soinside.com 2019 - 2024. All rights reserved.