You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中IApplicationActivationManager使用示例求助

Delphi中IApplicationActivationManager的定义与使用示例

一、接口的Delphi定义

Delphi 10.4.2默认未包含IApplicationActivationManager的定义,需手动声明COM接口:

type
  IApplicationActivationManager = interface(IUnknown)
    ['{45BA127D-10A8-46EA-8AB7-56EA9078943C}']
    function ActivateApplication(
      const pszAppUserModelId: LPCWSTR;
      const pszArguments: LPCWSTR;
      dwFlags: DWORD;
      out pdwProcessId: DWORD): HResult; stdcall;
    function ActivateForFile(
      const pszAppUserModelId: LPCWSTR;
      const pArray: IShellItemArray;
      const pszVerb: LPCWSTR;
      out pdwProcessId: DWORD): HResult; stdcall;
    function ActivateForProtocol(
      const pszAppUserModelId: LPCWSTR;
      const pArray: IShellItemArray;
      out pdwProcessId: DWORD): HResult; stdcall;
  end;

const
  CLSID_ApplicationActivationManager: TGUID = '{2e941141-7f97-4756-ba1d-9decde894a3d}';

二、完整使用示例

以下代码可实现启动应用商店应用、获取进程ID并等待应用终止,完全适配你的流程需求:

uses
  Windows, ComObj;

procedure LaunchStoreAppAndWait(const AAUMID: string; const AArgs: string = '');
var
  ActivationManager: IApplicationActivationManager;
  ProcessId: DWORD;
  hProcess: THandle;
  HR: HResult;
begin
  // 初始化COM环境
  CoInitialize(nil);
  try
    // 创建接口实例
    HR := CoCreateInstance(CLSID_ApplicationActivationManager, nil, CLSCTX_INPROC_SERVER,
      IApplicationActivationManager, ActivationManager);
    if Failed(HR) then
      raise Exception.CreateFmt('创建ActivationManager失败: 0x%.8X', [HR]);

    // 启动应用并获取进程ID
    HR := ActivationManager.ActivateApplication(PWideChar(WideString(AAUMID)), PWideChar(WideString(AArgs)), 0, ProcessId);
    if Failed(HR) then
      raise Exception.CreateFmt('启动应用失败: 0x%.8X', [HR]);

    // 打开进程同步句柄
    hProcess := OpenProcess(SYNCHRONIZE, False, ProcessId);
    if hProcess = 0 then
      raise Exception.Create('无法获取进程句柄');
    try
      // 等待进程终止
      WaitForSingleObject(hProcess, INFINITE);
    finally
      CloseHandle(hProcess);
    end;
  finally
    // 释放COM环境
    CoUninitialize;
  end;
end;

// 调用示例(替换AUMID为目标应用的实际值)
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    // 步骤1:执行前置操作(解压、解密等)
    // ...
    
    // 步骤2:启动应用商店应用并等待关闭
    LaunchStoreAppAndWait('Microsoft.WindowsNotepad_8wekyb3d8bbwe!App');
    
    // 步骤3:执行反向操作(压缩回Zip、重新加密等)
    // ...
  except
    on E: Exception do
      ShowMessage('错误提示: ' + E.Message);
  end;
end;

三、关键注意事项

  • AUMID获取:目标应用的AUMID可通过PowerShell命令Get-StartApps查询,或在Windows设置的应用详情中查看。
  • 系统兼容性:该接口仅支持Windows 8及以上系统,符合应用商店应用的运行环境要求。
  • 等待逻辑:通过OpenProcess获取进程同步句柄,WaitForSingleObject会阻塞当前线程直到应用终止,确保后续操作在应用关闭后执行。

内容的提问来源于stack exchange,提问作者dknw78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:30:13