我刚创建了一个自定义对话框,其中包含一个复选框,询问用户是否要创建桌面快捷方式。我以前总是包含一条我没有使用AskText()
功能的快捷方式,因为我打算稍后向此页面添加更多内容,并希望将这几个选项简化为这一页。
我跑的时候桌面上有一个项目,但这不是我的期望。目标似乎指向桌面本身的位置而不是实际的可执行文件。此外,此快捷方式不会在卸载时删除(我假设这需要单独处理),并且快捷方式需要手动删除管理员权限(出于显而易见的原因,我不想要这样做)。
以下是我的InstallScript代码。它位于InstallFiles
之后插入的自定义操作中。
function MyFunction(hMSI)
STRING szProgramFolder, szItemName, szCommandLine, szWorkingDir;
STRING szShortCutKey, szProgram, szParam, szIconPath;
NUMBER nIcon, nResult;
begin
szProgramFolder = FOLDER_DESKTOP;
szItemName = "myProgram";
szProgram = INSTALLDIR + "myProgram.exe" ;
LongPathToQuote (szProgram, TRUE);
szCommandLine = szProgram;
szWorkingDir = INSTALLDIR;
szIconPath = "";
nIcon = 0;
szShortCutKey = "";
nResult = AddFolderIcon (szProgramFolder, szItemName, szCommandLine,szWorkingDir,
szIconPath, nIcon, szShortCutKey, REPLACE);
end;
我不太确定我在哪里出错了,虽然我对InstallShield(更不用说InstallScript)的了解非常
。答案 0 :(得分:1)
事实证明,这是一个延迟的自定义操作,因此INSTALLDIR变量未初始化(也没有任何其他Windows Installer内置变量)。将其更改为立即类型的自定义操作(并将其重定位到执行顺序中的适当位置),它应该可以工作。
答案 1 :(得分:0)
要修复快捷方式的参数,首先要确保它们正确无误。调试您的函数以验证您实际上正在传递您想要的内容。如评论所述,INSTALLDIR
可能无法直接用于InstallScript自定义操作。 “调试”的一种简单方法是将MessageBox(szCommandLine, 0);
之类的调用添加到代码中的关键点。如果您发现自己正在传递C:\Program Files\Company\ProductmyProgram.exe
之类的内容,请考虑使用^
运算符来连接您的路径:szProgram = INSTALLDIR ^ "myProgram.exe";
。
要卸载快捷方式,您必须了解MSI项目中的自定义操作不会自动撤消。所以使用不同的方法。在另一个操作中卸载期间显式编写其删除代码,切换到纯安装脚本,其中日志记录将反转您的操作,或使用适当的基于MSI的方法。对于最后一个,在其自己的组件中定义快捷方式,并为组件提供与您在UI中设置的属性相关的条件(或者现在通过AskText),或者跳过条件并通过放置子功能中的组件。然后,Windows Installer将为您跟踪和删除快捷方式。