一次在调用接口函数获取快捷方式信息时,总是遇到意外,一直查来查去查了好半天,原代码如下:
function GetShortCutImf(LinkFileName:string; var ShortCutImf:TShortCutImf):boolean;
var
vShellLink: IShellLink;
vPersistFile: IPersistFile;
vUnKnown: IUnKnown;
vWin32FindData: TWin32FindData;
vBuffer: array[0..100] of Char;
pword:Word;
PCmd:integer;
ffd:WIN32_FIND_DATA;
ret:Longint;
begin
Result:=true;
try
vUnKnown := CreateComObject(CLSID_ShellLink);
vShellLink := vUnKnown as IShellLink;
vPersistFile := vUnKnown as IPersistFile;
if vPersistFile.Load(PWideChar(LinkFileName),0)=s_OK then//就在这里总是出错
begin
ret:=vShellLink.GetPath(vBuffer,SizeOf(vBuffer),ffd,SLGP_UNCPRIORITY); //Pchar(s),MAX_PATH
.......
最后终于发现一个小细节,在PWideChar(LinkFileName)上,原来以为这样简单转换,就可以把ANSI字符串转为WIDESTRING指针,结果系统豪不转换的直接把LinkFileName的指针当做widestring指针传过去了,怪不得系统老执行不下去。看来一个转换的语句还是不可少啊,增加后问题解决,特立此备忘。
function GetShortCutImf(LinkFileName:string; var ShortCutImf:TShortCutImf):boolean;
var
vShellLink: IShellLink;
vPersistFile: IPersistFile;
vUnKnown: IUnKnown;
vWin32FindData: TWin32FindData;
vBuffer: array[0..100] of Char;
pword:Word;
PCmd:integer;
ffd:WIN32_FIND_DATA;
ret:Longint;
ws:WideString;
begin
Result:=true;
try
vUnKnown := CreateComObject(CLSID_ShellLink);
vShellLink := vUnKnown as IShellLink;
vPersistFile := vUnKnown as IPersistFile;
ws:=LinkFileName;
if vPersistFile.Load(PWideChar(ws),0)=s_OK then
begin
ret:=vShellLink.GetPath(vBuffer,SizeOf(vBuffer),ffd,SLGP_UNCPRIORITY); //Pchar(s),MAX_PATH
.......
评论