在桌面

时间:2016-06-06 17:12:55

标签: installshield shortcut installscript basic-msi

我刚创建了一个自定义对话框,其中包含一个复选框,询问用户是否要创建桌面快捷方式。我以前总是包含一条我没有使用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)的了解非常

2 个答案:

答案 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将为您跟踪和删除快捷方式。