运行 在桌面上创建快捷方式时出现问题

Running into issue creating shortcut on desktop

我刚刚创建了一个带有复选框的自定义对话框,询问用户是否要创建桌面快捷方式。我过去总是包含一个快捷方式,我不使用 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)的了解非常有限,但我不太确定哪里出错了。

要修复快捷方式的参数,请先确保它们正确无误。调试您的函数以验证您确实传递了您想要传递的内容。如评论所述,INSTALLDIR 可能无法直接用于 InstallScript 自定义操作。 "debug" 的一种简单方法是将 MessageBox(szCommandLine, 0); 之类的调用添加到代码中的关键点。如果您发现您正在传递类似 C:\Program Files\Company\ProductmyProgram.exe 的内容,请考虑使用 ^ 运算符来连接您的路径:szProgram = INSTALLDIR ^ "myProgram.exe";.

要卸载快捷方式,您必须了解 MSI 项目中的自定义操作不会自动撤消。所以使用不同的方法。要么在另一个操作的卸载过程中明确编写其删除代码,要么切换到纯 InstallScript,日志记录将反转您的操作,要么采用适当的基于 MSI 的方法。对于最后一个,在其自己的组件中定义快捷方式,并为组件提供一个与您在 UI 中设置的 属性 相关的条件(或现在通过 AskText),或者跳过该条件并通过将组件放入子特征来使用特征选择。然后 Windows 安装程序将为您跟踪并删除快捷方式。

事实证明,这是一个延迟的自定义操作,因此未初始化 INSTALLDIR 变量(也未初始化任何其他 Windows 安装程序内置变量)。将其更改为即时类型的自定义操作(并将其重新定位到执行顺序中的适当位置),它应该可以工作。