我试着称之为:
MoveFileEx(pChar(src), pChar(dest), MOVEFILE_COPY_ALLOWED)
该程序完成了Copy
部分,但复制后它没有Delete
文件。我想也许我应该用Administrative privileges
运行我的应用程序,但是在我做的那一刻,我的onDropped
的DropTarget
事件被阻止了。
我怎样才能克服这个问题?
我无法确定为什么你的源文件没有被删除。是的,您可能无权删除它们,只能复制它们。这是MoveFileEx()
记录的可能性:
MOVEFILE_COPY_ALLOWED 2(0x2)
如果要将文件移动到其他卷,则该函数使用CopyFile和DeleteFile函数模拟移动。
如果文件已成功复制到其他卷并且无法删除原始文件,则该函数将成功保留源文件。
该值不能与MOVEFILE_DELAY_UNTIL_REBOOT一起使用。
但是,关于DragTarget
,当您运行升级的应用程序时,它会以更高的完整性级别运行,并且“用户界面权限隔离”(UIPI)会阻止低完整性流程与更高完整性流程的UI进行通信。在这种情况下,UIPI阻止低完整性进程的阻力到达你的窗口,因此没有调用DragTarget
,并且没有办法(我知道)阻止它。
你有几个选择:
MoveFileEx()
。你可以:
使用带有MoveFileEx()
动词的ShellExecute/Ex()
,产生一个单独的过程来调用runas
。它可以是一个单独的EXE,也可以是主要的EXE,并添加命令行参数来告诉它该做什么。
将MoveFileEx()
放入一个COM对象,在需要时使用COM Elevation Moniker进行实例化。WM_DROPFILES
窗口消息,而不是使用DragTarget
。使用ChangeWindowMessageFilter/Ex()
允许WM_COPYDATA
,WM_DROPFILES
和WM_COPYGLOBALDATA
窗口消息通过UIPI。这样,您至少可以将文件拖到您的应用程序中,但DragTarget
不会允许其他类型的数据。