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
相关产品推荐
相关产品推荐

