6 votes

Pourquoi ce code échoue-t-il en D2010, mais pas en D7 ?

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

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

Avez-vous des suggestions sur une solution de contournement élégante ?

Edit : Ouch : l'appel GetTempPath détruit la pile comme le prouve le fait qu'Extension est vide après la ligne GetTempPath, mais pas avant... Aïe.

    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 }

14voto

Mason Wheeler Points 52022

GetTempPath attend le nombre de caractères dans le tampon pour son premier argument, et non la taille en octets. Changez SizeOf a Length et ça marchera.

5voto

Andreas Rejbrand Points 57164

Pour que cela fonctionne comme en D7, remplacez "string" par "AnsiString" et "Char" par "AnsiChar". De même, 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X