1

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

4

2 回答 2

1

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

于 2016-06-07T15:02:44.200 回答
0

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

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

于 2016-06-07T12:17:52.367 回答