2009-11-25 98 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;