Inno Setup:使用IShellLink GetWorkingDirectory的访问冲突

标记

我正在使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从Inno Setup安装JRE?

来自分类Dev

在Inno Setup中使用Define和Constant

来自分类Dev

Inno Setup设置TInputQueryWizardPage高度

来自分类Dev

Inno Setup从CDATA创建TStringList

来自分类Dev

使用fstream的“访问冲突”

来自分类Dev

Inno Setup语法-OR,AND

来自分类Dev

Inno Setup Abs(Integer)功能

来自分类Dev

inno setup中的“ Not in a loop”错误

来自分类Dev

Inno Setup:选择组件的功能

来自分类Dev

Inno Setup隐藏日志条目

来自分类Dev

在Inno Setup中取消安装

来自分类Dev

Inno Setup更改CreateOutputMsgMemoPage字体

来自分类Dev

安装空文件夹时访问CurrentFileName时出现Inno Setup Runtime错误

来自分类Dev

Inno Setup中的TTreeView

来自分类Dev

Inno Setup中的条件DisableProgramGroupPage

来自分类Dev

未捕获Inno Setup异常

来自分类Dev

Inno Setup:从另一个控件的OnClick事件访问自定义控件

来自分类Dev

Inno Setup ComponentsList OnClick事件

来自分类Dev

缺少Inno-Setup分号

来自分类Dev

如何使用Inno Setup检查Internet连接

来自分类Dev

为什么在Inno Setup中使用“&”字符?

来自分类Dev

在Inno Setup中记录TWindowsVersion

来自分类Dev

Inno Setup更改c:\权限

来自分类Dev

使用fstream的“访问冲突”

来自分类Dev

Inno Setup:创建简化的ComponentsList

来自分类Dev

Inno Setup,检测Java版本

来自分类Dev

Inno Setup-后处理

来自分类Dev

使用Inno Setup创建透明的安装程序?

来自分类Dev

Inno Setup 中的动态密码