inno-setup - 在 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 Setup 6.1 现在可以通过在section中指定AppUserModelToastActivatorCLSID
参数Icons
来设置 CLSID 。
推荐阅读
- java - 从 SpringBoot 使用 SOAP 服务 - @RequestBody 获取空值
- python - 如何替换列中的重复值以使其基于 Pandas 中的另一列唯一?
- java - 从随机字符串列表中随机选择(JAVA)
- javascript - 如何过滤与字符串中特定键对应的值?
- javascript - openweathermap 上的 5 天天气预报未给出预期结果
- google-maps - Flutter - 如何使用 GMaps 将字符串值转换为 LatLng 类型?
- postgresql - 如何在 Gradle 项目中连接 PostgreSQL
- reactjs - React:formik表单,如何在回调函数中提交后使用状态
- laravel - 离子 HTTP 请求 POST(适用于邮递员)不起作用但 GET 有效
- html - Plotly + Reveal.js:情节移到我的幻灯片之外