首页 > 解决方案 > 在 Inno Setup 中设置 ToastActivator CLSID 快捷方式属性

问题描述

我正在尝试为我们的 Win32 应用程序启用 Windows 10 toast 通知。根据赢文档(https://docs.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl)我需要创建一个设置了 aumi-id 和 activator-clsid 属性的开始菜单中的快捷方式。Win docs 示例使用 WiX 安装程序。有没有办法在 Inno Setup 中设置这些属性?

我尝试了 Inno Setup 和 Windows COM 组件的 Pascal 脚本功能。我设法设置了 aumi-id 但没有设置 activator-clsid。

我被困在重新创建必须IPropertyStore作为参数传递到 COM 接口的 WinAPI 结构和联合上。

C 代码 - 此结构必须传递到IPropertyStore方法中SetValue()

struct tagPROPVARIANT {
   VARTYPE vt;
   PROPVAR_PAD1 wReserved1;
   PROPVAR_PAD2 wReserved2;
   PROPVAR_PAD3 wReserved3;
   union {
   .
   .
   CLSID *puuid;
   .
   .
   }
}

Inno Pascal 脚本 -IPropertyStore接口声明和重新创建tagPROPVARIANT

[code]
type
    IPropertyStore = interface(IUnknown)
        procedure dummy;
        procedure dummy2;
        procedure dummy3;
        function SetValue(var key: PROPERTYKEY; var pv: tagPROPVARIANT): HResult;
        procedure dummy4;
    end;
    tagPROPVARIANT = record
        vt: WORD;
        res1: WORD;
        res2: WORD;
        res3: WORD;
        // now somehow recreate union with 72 members where I only need one pointer (CLSID *puuid)
    end;
    // then I use IShellLink, IPropertyStore, IPersistFile
    // interfaces to create shortcut in the start menu, where IPropertyStore must be used to set properties that I need.
    // I managed to recreate IShellLink and IPersistFile because they do not use unions nor pointers

我能够创建开始菜单快捷方式并像这样设置它的AUMI:

[Icons]
Name: "{group}\{#APP_NAME}"; Filename: "{app}\{#EXE_NAME}"; \
  AppUserModelID: "MyCompany.MyApp"

但我认为 CLSID 只能在[Code]使用 COM iterfaces 的部分中设置。

基本上我正在尝试将此 C++ 代码重写为 Inno Setup 脚本以使事情更清洁。

ComPtr<IShellLinkW> shellLink;
CoCreateInstance(
  CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink));
shellLink->SetPath(exePath);
shellLink->SetArguments(L"");
shellLink->SetWorkingDirectory(exePath);

ComPtr<IPropertyStore> propertyStore;
shellLink.As(&propertyStore);
tagPROPVARIANT appIdPropVar;
InitPropVariantFromString(L"MyComp.MyApp", &appIdPropVar);
propertyStore->SetValue(PKEY_AppUserModel_ID, appIdPropVar);

// main problem
GUID clsid = __uuidof(NotificationActivator); 
tagPROPVARIANT CLSIDofMyToastHandler;
CLSIDofMyToastHandler.vt = VT_CLSID;
CLSIDofMyToastHandler.puuid = &clsid;

propertyStore->SetValue(PKEY_AppUserModel_ToastActivatorCLSID, CLSIDofMyToastHandler)
propertyStore->Commit();

ComPtr<IPersistFile> persistFile;
shellLink.As(&persistFile);
persistFile->Save(startMenuPath, TRUE);
PropVariantClear(&appIdPropVar);

标签: inno-setuppascalscript

解决方案


Inno Setup 6.1 现在可以通过在section中指定AppUserModelToastActivatorCLSID参数Icons来设置 CLSID 。


推荐阅读