我正在使用Inno Setup。已安装的应用程序可以进行多次安装,因此会创建多个“开始”菜单快捷方式。我遇到的麻烦是,在同一应用程序位置创建了多个图标(重复项)。我的解决方案是在安装过程中检查现有的“开始”菜单快捷方式,读取快捷方式的“工作”或“目标”目录属性,然后根据当前安装目录进行检查。如果其中一个快捷方式匹配,则不要安装快捷方式。
我使用示例文件“ CodeAutomation2.iss”作为读取快捷链接上的工作目录的起点。示例文件中的IShellLink代码是我一直在使用的,但是当我尝试使用“ GetWorkingDirectory”时,出现以下错误。
下面是我正在使用的代码。“ GetWorkingDirectory”怎么了?
var
ShortcutFile: String;
WorkingDir: String;
Obj: IUnknown;
SL: IShellLinkW;
PF: IPersistFile;
begin
{ Create the main ShellLink COM Automation object }
Obj := CreateComObject(StringToGuid(CLSID_ShellLink));
{ Set the shortcut properties }
SL := IShellLinkW(Obj);
PF := IPersistFile(Obj);
NumFiles := 1
ShortcutFile := ExpandConstant('{#MyAppName}');
Log('File is: ' + ExpandConstant('{group}') + '\' + ShortcutFile + '.lnk');
OleCheck(PF.Load(ExpandConstant(ExpandConstant('{group}') + '\' + ShortcutFile + '.lnk'), 0));
OleCheck(SL.GetWorkingDirectory(WorkingDir, 250));
Log('WorkingDir: ' + WorkingDir);
WorkingDir
在传递内存之前,您需要为其分配内存。您已经告诉IShellLinkW.GetWorkingDir
您正在分配250个字符的空间供其使用,但实际上并未这样做。
SetLength(WorkingDir, 250);
OleCheck(SL.GetWorkingDir(WorkingDir, 250));
更好的解决方案可能是先实际填充返回缓冲区,以消除在字符串末尾出现多余内容的可能性。首先用空(#0)字符预GetWorkingDir
填充它,然后从左侧填充它:
WorkingDir := StringOfChar(#0, 250);
OleCheck(SL.GetWorkingDir(WorkingDir, 250);
WorkingDir := Trim(WorkingDir);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句