如何获取快捷方式(.lnk)的各项信息

jaxdong 2012-11-10 08:14:20
使用以下代码获取快捷方式的信息,文件名是对的,但是参数、图标文件名和索引等都是不正确的,得到的参数竟然是实际的Description,望给个正确可用的代码。

type
TLINK_FILE_INFO = record
Filename: array [0 .. MAX_PATH] of Char; { 目标文件名 }
WorkDirectory: array [0 .. MAX_PATH] of Char; { 工作目录或者起始目录 }
IconLocation: array [0 .. MAX_PATH] of Char; { 图标文件名 }
IconIndex: Integer; { 图标索引 }
Arguments: array [0 .. MAX_PATH] of Char; { 程序运行的参数 }
Description: array [0 .. 255] of Char; { 快捷方式的描述 }
ItemIDList: PItemIDList; { 只供读取使用 }
RelativePath: array [0 .. 255] of Char; { 相对目录,只能设置 }
ShowState: Integer; { 运行时的窗口状态 }
HotKey: Word; { 快捷键 }
end;

procedure TForm1.GetLinkFileInfo(LnkFileName: String; var LnkInfo: TLINK_FILE_INFO);
var
LnkObj : IUnknown;
ShellPFile : IPersistFile;
ShellLink : IShellLink;
WideFileName: WideString;
pfd : WIN32_FIND_DATA;
begin
FillChar(LnkInfo, SizeOf(LnkInfo), #0);
LnkObj := CreateComObject(CLSID_ShellLink);
ShellPFile := LnkObj as IPersistFile;
ShellLink := LnkObj as IShellLink;
WideFileName := LnkFileName;
ShellPFile.Load(PWideChar(WideFileName), 0);
ShellLink.GetPath(LnkInfo.Filename, 1024, pfd, SLGP_UNCPRIORITY); { 获取快捷方式文件路径 }
ShellLink.GetWorkingDirectory(LnkInfo.WorkDirectory, MAX_PATH); { 获取快捷方式工作目录 }
ShellLink.GetIconLocation(LnkInfo.IconLocation, MAX_PATH, LnkInfo.IconIndex); { 获取快捷方式图标文件,和图标索引 }
ShellLink.GetArguments(LnkInfo.Arguments, 1024); { 获取快捷方式运行参数 }
ShellLink.GetDescription(LnkInfo.Arguments, 1024); { 获取快捷方式描述 }
ShellLink.GetShowCmd(LnkInfo.ShowState); { 获取快捷方式运行方式,1:常规窗体;2:最小化;3:最大化 }
ShellLink.GetHotkey(LnkInfo.HotKey); { 获取快捷方式快捷键 }
ShellLink := nil;
ShellPFile := nil;
end;
...全文
1060 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
风行码上 2014-01-15
  • 打赏
  • 举报
回复
我的也是获取其他的图标都没问题 就是获取快捷方式的图标时候 获取的是程序安装的地址。。。 求解呀 !
ak200111 2013-09-24
  • 打赏
  • 举报
回复
不知楼主解决该问题没,本打算用工作目录,拼接程序名,自己创建目标路径 后来请教了下他人,发现问题所在了,我使用的是vs2012 需要修改项目->属性->最顶上配置栏右边修改配置管理器->活动解决方案平台->改为x64(默认的是win32) 我修改后,就能正确区分Program Files与Program Files (x86)了
ak200111 2013-09-24
  • 打赏
  • 举报
回复
我也遇到类似问题win7 64位系统加载出的原始路径从 C:\Program Files\Debugging Tools for Windows (x64)\windbg.exe 变为 +tszOriginPath 0x0031e800 L"C:\\Program Files (x86)\\Debugging Tools for Windows (x64)\\windbg.exe" wchar_t[260] Program Files后多了个(x86) 这个怎么解决
JPEXE 2012-11-12
  • 打赏
  • 举报
回复
结构体里两个Integer类型都应该改: IconIndex: Int32; ShowState: Int32;
JPEXE 2012-11-12
  • 打赏
  • 举报
回复
type TLINK_FILE_INFO = record Filename: array [0 .. MAX_PATH] of Char; { 目标文件名 } WorkDirectory: array [0 .. MAX_PATH] of Char; { 工作目录或者起始目录 } IconLocation: array [0 .. MAX_PATH] of Char; { 图标文件名 } IconIndex: Integer; { 图标索引 } 问题应该在这里! Arguments: array [0 .. MAX_PATH] of Char; { 程序运行的参数 } Description: array [0 .. 255] of Char; { 快捷方式的描述 } ItemIDList: PItemIDList; { 只供读取使用 } RelativePath: array [0 .. 255] of Char; { 相对目录,只能设置 } ShowState: Integer; { 运行时的窗口状态 } HotKey: Word; { 快捷键 } end;
iamduo 2012-11-12
  • 打赏
  • 举报
回复
那就坚持不懈的尝试吧。 比如 Char -> WChar
jaxdong 2012-11-12
  • 打赏
  • 举报
回复
坚持不懈的求解。
jaxdong 2012-11-11
  • 打赏
  • 举报
回复
引用 3 楼 HSFZXJY 的回复:
http://blog.csdn.net/zhouzuoji/article/details/1865411
验证了一下,效果一样。 例如"C:\Program Files\7-Zip\7zG.exe"的快捷方式,获取出来是"C:\Program Files (x86)\7-Zip\7zG.exe"
jaxdong 2012-11-10
  • 打赏
  • 举报
回复
系统win7 x64,貌似是64位系统的问题,求解。
山东蓝鸟贵薪 2012-11-10
  • 打赏
  • 举报
回复
学习中。。。。。。。。。。。。。。。。。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧