gpt4 book ai didi

delphi - 以管理员身份运行,阻止DropTarget的onDropped

转载 作者:行者123 更新时间:2023-12-02 09:47:14 25 4
gpt4 key购买 nike

我正试图称呼它为:

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

该程序完成了 Copy部分,但在复制后不对文件进行 Delete。我以为也许我应该使用 Administrative privileges运行我的应用程序,但是当我这样做时,我的 onDroppedDropTarget事件被阻止了。

我该如何克服这个问题?

最佳答案

我不能肯定地说为什么您的源文件没有被删除。是的,您可能没有删除它们的权限,只能复制它们。这是 MoveFileEx() 的记录的可能性:

MOVEFILE_COPY_ALLOWED
2 (0x2)

If the file is to be moved to a different volume, the function simulates the move by using the CopyFile and DeleteFile functions.

If the file is successfully copied to a different volume and the original file is unable to be deleted, the function succeeds leaving the source file intact.

This value cannot be used with MOVEFILE_DELAY_UNTIL_REBOOT.



但是,关于 DragTarget,当您提升运行的应用程序时,它以更高的完整性级别运行,并且“用户界面特权隔离”(UIPI)阻止了低完整性进程与较高完整性进程的UI通信。在这种情况下,UIPI将阻止来自完整性较低的进程的拖动到达您的窗口,因此 DragTarget不被调用,并且(我知道)没有任何方法可以防止这种情况。

您有几种选择:
  • 不再提升您的应用程序,使其与大多数其他未提升的应用程序具有相同的完整性级别。仅提升需要提升的代码,即对MoveFileEx()的调用。您可以:
  • 产生一个单独的过程,仅需将MoveFileEx()ShellExecute/Ex()动词一起使用即可调用runas。它可以是一个单独的EXE,也可以是您的主要EXE,并添加了命令行参数以指示执行该操作。
  • MoveFileEx()放入一个COM对象,您可以在需要时使用COM Elevation Moniker实例化该COM对象。
  • (如果您必须提升您的应用程序,然后实现一个单独的非提升应用程序以接受放置),然后使用UIPI不会阻止的IPC机制(例如套接字)将删除的数据传递给提升应用程序。
  • 让您的应用处理WM_DROPFILES窗口消息,而不是使用DragTarget。使用ChangeWindowMessageFilter/Ex()允许WM_COPYDATAWM_DROPFILESWM_COPYGLOBALDATA窗口消息通过UIPI传递。这样,您至少可以将文件拖到您的应用中,但不能将DragTarget允许的其他类型的数据拖到您的应用中。
  • 关于delphi - 以管理员身份运行,阻止DropTarget的onDropped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55127751/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com