2010-05-06 9 views
6

¿Por qué este código obtiene un error de acceso en el resultado: = línea de memoria intermedia en D2010, pero no D7?¿Por qué este código falla en D2010, pero no en D7?

Algo, supongo, relacionado con UniCode, pero el compilador no genera ninguna advertencia.

¿Alguna sugerencia sobre una solución elegante?

Editar: Ay: la llamada GetTempPath está destrozando la pila como lo demuestra el hecho de que la extensión está vacía después de la línea GetTempPath, pero no antes ... 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 para "extensión"? –

Respuesta

14

GetTempPath espera el número de caracteres en el almacenamiento intermedio para su primer argumento, no el tamaño en bytes. Cambie SizeOf a Length y funcionará.

+6

Sí, y funcionó en D7 porque para AnsiStrings, un carácter es de un byte. –

5

para que funcione como en D7, en lugar de "cadena" con "AnsiString" y "Char" con "AnsiChar". Además, llame a GetTempPathA y GetTempFileNameA en lugar de GetTempPath y GetTempFileName.

Pero el enfoque dado por Mason es probablemente mejor, ya que admitirá nombres de archivo Unicode.

+0

Probablemente quiere decir "hacer que funcione en ** D2010 **, reemplazar ..." ya que funciona en D7? También String y AnsiString son iguales en Delphi 7, así que esto no tendrá ningún efecto ... – DaveBoltman

+0

@DaveBoltman: No. Escribo "Para que funcione ** como ** en D7, reemplace ...". –

+0

Ah sí, lo siento, no leí su respuesta cuidadosamente :) Tiene razón – DaveBoltman

Cuestiones relacionadas