Delphi 中的IApplicationActivationManager使用示例

0h4hbjxa  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(135)

我做了很多搜索,但没有找到任何在 Delphi 中使用Windows IApplicationActivationManager的例子。接口似乎没有在我的Delphi 10.4.2社区版中定义。我需要加载Windows AppStore应用程序,并等待它们终止。
有没有人在 Delphi 中使用过这个接口,并且可以提供一个如何定义和使用它的示例?
我在这个网站上用C#找到了下面的代码,但没有成功地找到一个工作的 Delphi 等价物:
IApplicationActivationManager::ActivateApplication in C#?
我已尝试将CreateProcessShellExecuteexplorer.exe等调用用于Windows AppStore应用程序(带有AUMID的打包应用程序),但没有任何东西能按需工作。传统应用程序工作正常。通过CreateProcessShellExecute调用一个进程,explorer.exe等都终止并在所调用的应用程序本身终止之前返回到我的应用程序。我需要我的应用程序等待,直到调用的应用程序本身终止。
在我的申请中,我需要:
1.执行一些可配置操作(例如:从Zip文件提取文件、解密文件等)。
1.运行适用于步骤1中生成的文件的可配置应用程序(例如:编辑文件)。
1.对步骤1中的操作执行镜像/撤消操作(例如:将更新的文件添加回Zip文件、重新加密文件等)。
IApplicationActivationManager接口似乎完成了我的应用程序所需要的工作,因为它返回了一个ProcessID,大概是它所启动的应用程序的ProcessID,然后我可以监视该ProcessID并等待应用程序终止。

9rnv2umw

9rnv2umw1#

有没有人在 Delphi 中使用过这个接口,并且可以提供一个如何定义和使用它的示例?
试试这样的方法:

uses
  ..., System.Win.ComObj, Winapi.ShlObj;

type
  ActivateOptions = (
    None = 0,
    DesignMode = 1,
    NoErrorUI = 2,
    NoSplashScreen = 4
  );

  IApplicationActivationManager = interface(IInterface)
    ['{2e941141-7f97-4756-ba1d-9decde894a3d}']
    function ActivateApplication(appUserModelId: PWideChar; arguments: PWideChar; options: ActivateOptions; out processId: DWORD): HResult; stdcall;
    function ActivateForFile(appUserModelId: PWideChar; itemArray: IShellItemArray; verb: PWideChar; out processId: DWORD): HResult; stdcall;
    function ActivateForProtocol(appUserModelId: PWideChar; itemArray: IShellItemArray; out processId: DWORD): HResult; stdcall;
  end;

const
  CLSID_ApplicationActivationManager: TGUID = '{45BA127D-10A8-46EA-8AB7-56EA9078943C}';

...

var
  appMgr: IApplicationActivationManager;
  pid: DWORD;
begin
  appMgr := CreateComObject(CLSID_ApplicationActivationManager) as IApplicationActivationManager;
  // alternatively:
  // OleCheck(CoCreateInstance(CLSID_ApplicationActivationManager, nil, CLSCTX_LOCAL_SERVER, IApplicationActivationManager, appMgr));

  OleCheck(appMgr.ActivateApplication('AppIdHere', nil, ActivateOptions.None, pid)); 

  // use pid to wait on process as needed...
end;

传统的应用程序工作正常。通过CreateProcessShellExecuteexplorer.exe等调用进程都会在被调用的应用程序本身终止之前终止并返回到我的应用程序。我需要我的应用程序等待,直到被调用的应用程序本身终止。
CreateProcess()返回您可以等待的进程HANDLE,例如使用WaitForSingleObject()或等效命令。如果指定SEE_MASK_NOCLOSEPROCESS标志,ShellExecuteEx()可以返回类似的HANDLE
IApplicationActivationManager接口似乎完成了我的应用程序所需要的工作,因为它返回了一个ProcessID,大概是它所启动的应用程序的ProcessID,然后我可以监视该ProcessID并等待应用程序终止。
您可以将返回的ProcessID传递给OpenProcess(),以获得一个HANDLE,然后您可以等待它。

相关问题