在桌面上创建快捷方式时遇到问题



我刚刚创建了一个带有复选框的自定义对话框,询问用户是否要创建桌面快捷方式。我过去总是包含一个快捷方式,我不使用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变量没有初始化(也没有初始化任何其他Windows Installer内置变量)。将其更改为即时类型的自定义操作(并将其重新定位到执行序列中的适当位置),它应该可以工作。

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

若要卸载快捷方式,您必须了解MSI项目中的自定义操作不会自动反转。因此,使用不同的方法。在另一个操作中,在卸载过程中显式地对其删除进行编码,切换到纯InstallScript,在那里日志记录将反转您的操作,或者使用正确的基于MSI的方法。对于最后一个,在其自己的组件中定义快捷方式,并为组件提供一个与您在UI中设置的特性相关的条件(或目前通过AskText),或者跳过该条件,只通过将组件放在子功能中来使用功能选择。然后Windows安装程序将为您跟踪并删除快捷方式。

最新更新