2010-08-19 4 views
3

Je dois remplacer les anciens noms de chemin d'accès abrégé Win98 par des chemins longs. J'avais une routine qui fonctionnait bien avec Delphi 4, mais quand j'ai mis à jour vers Delphi 2009 et Unicode, cela ne fonctionnait pas avec les chaînes Unicode. J'ai regardé autour et je ne pouvais pas trouver une version compatible Unicode de celui-ci.Comment appeler correctement GetLongPathName à l'aide de Delphi 2009 et de chaînes Unicode?

Il semble que la routine correcte à utiliser est GetLongPathName from the WinAPI. Mais il ne semble pas être dans la bibliothèque SysUtils de Delphi 2009 et je n'ai pas réussi à comprendre comment le déclarer correctement pour accéder à la routine WinAPI.

Aussi, il semble que cela peut être difficile à appeler, parce que j'ai lu le SO Question: Delphi TPath.GetTempPath result is cropped mais cela ne m'a pas aidé à obtenir la première base.

Quelqu'un peut-il expliquer comment déclarer cette fonction et l'utiliser correctement en passant une chaîne Unicode dans Delphi 2009?

Répondre

4

Bien sûr. Vous ne devez pas une unité distincte et peut déclarer GetLongPathName partout:

function GetLongPathName(ShortPathName: PChar; LongPathName: PChar; 
    cchBuffer: Integer): Integer; stdcall; external kernel32 name 'GetLongPathNameW'; 

function ExtractLongPathName(const ShortName: string): string; 
begin 
    SetLength(Result, GetLongPathName(PChar(ShortName), nil, 0)); 
    SetLength(Result, GetLongPathName(PChar(ShortName), PChar(Result), length(Result))); 
end; 

procedure Test; 
var 
    ShortPath, LongPath: string; 
begin 
    ShortPath:= ExtractShortPathName('C:\Program Files'); 
    ShowMessage(ShortPath); 
    LongPath:= ExtractLongPathName(ShortPath); 
    ShowMessage(LongPath); 
end; 
+0

Je crois que la dernière déclaration de fonction donne: [erreur DCC] besoins de fonction type de résultat – lkessler

+3

@lkessler: Non, vous ne devez pas redéclarer arguments de la fonction et le type de résultat dans la section implémentation s'ils sont déjà déclarés dans la section interface. – kludg

+0

Merci @Serg. Cela n'a pas vraiment fonctionné dans tous les cas, mais après une légère correction j'ai réussi à le faire fonctionner. J'ai mis à jour votre réponse pour le faire correctement. Cela a vraiment aidé. – lkessler

Questions connexes