正文

一次调用接口函数遇到麻烦后的经验教训2010-03-31 16:25:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/otot/50852.html

分享到:

一次在调用接口函数获取快捷方式信息时,总是遇到意外,一直查来查去查了好半天,原代码如下:

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
    .......

阅读(1983) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册