2009-11-25 6 views
2

Comment convertir cette fonction à Delphi 2010 (Unicode)?convert pour 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; 

Merci

+1

Dites, ce qui se passe si j'ai un vrai fichier nommé " PAS un raccourci par extension! " et je fais un lien avec? Comment l'appelant de cette fonction la différence? –

Répondre

1

Pour autant que je peux dire, ppf.Load devraient être en mesure de prendre juste votre LinkFileName directement avec un casting à PChar (qui est maintenant PWideChar). Retrait de la ligne MultiByteToWideChar et en utilisant PChar (LinkFileName) au lieu de copier à une variable temporaire devrait le faire.

Cela rendrait le regard de code comme ceci:

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 est déclarée au moyen d'un LPTSTR dans MSDN, donc je crois que vous devriez obtenir la version Unicode sans changer cette partie.

1

J'ai fait d'autres changements à la réponse de Michael à utiliser la conversion de chaîne appropriée en majuscules, vérifier les conditions d'erreur et de supprimer des choses inutiles:

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;