我找到一个函数GettLnkPath可以获取一个链接文件的目录文件,
但是在处理特殊目录的时候就出现问题了,比如
获取C:\Program Files\我的测试\mytestProgramDir\Project1.exe
返回结果是C:\PROGRA~1\我的~1\mytest~1\Project1.exe
本身两个是相同,有没有办法区分啊
function  GettLnkPath(LinkFile:  WideString):  String;
var
   SL:  IShellLink;
   PF:  IPersistFile;
   FindData:  TWin32FindData;
   AStr:  array[0..MAX_PATH]  of  char;
begin
   OleCheck(CoCreateInstance(CLSID_ShellLink,  nil,  CLSCTX_INPROC_SERVER,
       IShellLink,  SL));
   PF  :=  SL  as  IPersistFile;
   OleCheck(PF.Load(PWideChar(LinkFile),  STGM_READ));
   OleCheck(SL.Resolve(0,  SLR_ANY_MATCH  or  SLR_NO_UI));
   OleCheck(SL.GetPath(AStr,  MAX_PATH,  FindData,  SLGP_SHORTPATH));
   Result  :=  AStr;
end;

解决方案 »

  1.   

    这个问题解决了,
    可以到我另外一个帖子
    http://community.csdn.net/expert/Topicview2.asp?id=4499007
    我可以再给给我回复正确的+20分
      

  2.   

    给你另一个函数
    function ExeFromLink(const linkname: string): string;
    var
    FDir,
    FName,
    ExeName: PChar;
    z: integer;
    begin
    ExeName:= StrAlloc(MAX_PATH);
    FName:= StrAlloc(MAX_PATH);
    FDir:= StrAlloc(MAX_PATH);
    StrPCopy(FName, ExtractFileName(linkname));
    StrPCopy(FDir, ExtractFilePath(linkname));
    z:= FindExecutable(FName, FDir, ExeName);
    if z > 32 then
    Result:= StrPas(ExeName)
    else
    Result:= '';
    StrDispose(FDir);
    StrDispose(FName);
    StrDispose(ExeName);
    end;
      

  3.   

    另外你的代码我这里可以编译,但是运行通不过
    csdn 今天不知道怎么回事,我开一个帖子半个小时都还没有打开
    不知道是不是我的系统的问题
      

  4.   

    to constantine(飘遥的安吉儿) 
    ...
    z:= FindExecutable(FName, FDir, ExeName);
    if z > 32 then  //这个地方老是为31
    Result:= StrPas(ExeName)
    else
    ...
    怎么回事啊