2009-11-25 101 views
2

如何将此功能转换为Delphi 2010(Unicode)?将功能转换为delphi 2010(unicode)

function TForm1.GetTarget(const LinkFileName:String):String; 
var 
    //Link : String; 
    psl : IShellLink; 
    ppf : IPersistFile; 
    WidePath : Array[0..260] of WideChar; 
    Info  : Array[0..MAX_PATH] of Char; 
    wfs  : TWin32FindData; 
begin 
    if UpperCase(ExtractFileExt(LinkFileName)) <> '.LNK' Then 
    begin 
    Result:='NOT a shortuct by extension!'; 
    Exit; 
    end; 

    CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl); 
    if psl.QueryInterface(IPersistFile, ppf) = 0 Then 
    Begin 
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(LinkFileName), -1, @WidePath, MAX_PATH); 
    ppf.Load(WidePath, STGM_READ); 
    psl.GetPath((@info), MAX_PATH, wfs, SLGP_UNCPRIORITY); 
    Result := info; 

    end 
    else 
    Result := ''; 
end; 

感谢

+1

说,会发生什么,如果我有一个名为一个真正的文件“不是扩展的一个简缩!“我做了一个链接呢?这个函数的调用者将如何知道其差异? – 2009-11-25 17:55:18

回答

1

据我所知,ppf.Load应该能够只是强制转换为PChar类型(也就是现在的PWideChar)把你的LinkFileName直接。删除MultiByteToWideChar行并使用PChar(LinkFileName)而不是复制到临时变量应该这样做。

这将使代码看起来是这样的:

function TForm1.GetTarget(const LinkFileName:String):String; 
var 
    //Link : String; 
    psl : IShellLink; 
    ppf : IPersistFile; 
    //WidePath : Array[0..260] of WideChar; 
    Info  : Array[0..MAX_PATH] of Char; 
    wfs  : TWin32FindData; 
begin 
    if UpperCase(ExtractFileExt(LinkFileName)) <> '.LNK' Then 
    begin 
    Result:='NOT a shortuct by extension!'; 
    Exit; 
    end; 

    CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl); 
    if psl.QueryInterface(IPersistFile, ppf) = 0 Then 
    Begin 
    ppf.Load(PChar(LinkFileName), STGM_READ); 
    psl.GetPath((@info), MAX_PATH, wfs, SLGP_UNCPRIORITY); 
    Result := info;  
    end 
    else 
    Result := ''; 
end; 

psl.GetPath被声明为在MSDN使用LPTSTR,所以我相信你应该得到的Unicode版本不改变的那部分。

1

我已经取得了一些对迈克尔的回答更多的变化使用适当的字符串转换为大写,检查错误条件,并删除不必要的东西:

function TForm1.GetTarget(const LinkFileName: String): String; 
var 
    psl: IShellLink; 
    ppf: IPersistFile; 
    wfs: TWin32FindData; 
begin 
    if Character.ToUpper(ExtractFileExt(LinkFileName)) <> '.LNK' Then 
    Exit('NOT a shortcut by extension!'); 

    OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, 
    IShellLink, psl)); 
    if psl.QueryInterface(IPersistFile, ppf) = 0 Then 
    Begin 
    OleCheck(ppf.Load(PChar(LinkFileName), STGM_READ)); 
    SetLength(Result, MAX_PATH); 
    OleCheck(psl.GetPath(PChar(Result), MAX_PATH, wfs, SLGP_UNCPRIORITY)); 
    Result := PChar(Result); 
    end; 
end;