2010-05-06 2 views
6

Pourquoi ce code obtient-il une erreur d'accès sur la ligne Result: = Buffer dans D2010, mais pas D7?Pourquoi ce code échoue-t-il dans D2010, mais pas dans D7?

Quelque chose, je suppose, impliquant UniCode, mais le compilateur ne génère aucun avertissement.

Des suggestions sur une solution de contournement élégante?

Édition: Ouch: l'appel GetTempPath est en train de détruire la pile comme en témoigne le fait que l'extension est vide après la ligne GetTempPath, mais pas avant ... Yikes.

function GetTempPathAndFileName(const Extension: string): string; 
    var 
     Buffer: array[0..MAX_PATH] of Char; 
    begin 
     repeat 
     GetTempPath(SizeOf(Buffer) - 1, Buffer); 
     GetTempFileName(Buffer, '~', 0, Buffer); 
     Result := Buffer; // <--- crashes on this line, 
     Result := ChangeFileExt(Result, Extension); 
     until not FileExists(Result); 
    end; { GetTempPathAndFileName } 
+0

"aExtension"? Typo pour "Extension"? –

Répondre

14

GetTempPath attend le nombre de caractères dans le tampon pour son premier argument, pas la taille en octets. Remplacez SizeOf par Length et cela fonctionnera.

+6

Oui, et cela a fonctionné dans D7 car pour AnsiStrings, un caractère est un octet. –

5

Pour le faire fonctionner comme dans D7, remplacer "string" avec "AnsiString" et "Char" avec "AnsiChar". En outre, appelez GetTempPathA et GetTempFileNameA plutôt que GetTempPath et GetTempFileName.

Mais l'approche donnée par Mason est probablement meilleure, car elle supportera les noms de fichiers Unicode.

+0

Vraisemblablement, vous voulez dire "pour le faire fonctionner dans ** D2010 **, remplacer ...", car il fonctionne en D7? Aussi String et AnsiString sont les mêmes dans Delphi 7, donc cela n'aura aucun effet ... – DaveBoltman

+0

@DaveBoltman: Non. J'écris "Pour que ça marche ** comme ** dans D7, remplacez ...". –

+0

Ah oui désolé - je n'ai pas lu votre réponse attentivement :) Vous avez raison – DaveBoltman

Questions connexes