2010-05-06 4 views
6

왜이 코드는 D2010의 Result : = Buffer 줄에서 액세스 오류가 발생하지만 D7에서는 그렇지 않습니까?D710이 아닌 D2010에서이 코드가 실패하는 이유는 무엇입니까?

UniCode가 포함 된 것으로 생각되지만, 컴파일러는 경고를 생성하지 않습니다.

우아한 해결 방법에 대한 제안 사항이 있으십니까?

편집 : Ouch : GetTempPath 호출은 GetTempPath 행 다음에 Extension이 비어 있지만 이전에는 그렇지 않다는 사실에 의해 입증 된대로 스택을 파기하고 있습니다. 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"? "Extension"에 오타가 있습니까? –

답변

14

GetTempPath는 바이트의 크기가 아니라 첫 번째 인수에 대해 버퍼의 문자 수를 예상합니다. SizeOfLength으로 변경하면 제대로 작동합니다.

+6

예, AnsiStrings에 대해 한 문자가 1 바이트이기 때문에 D7에서 작동했습니다. –

5

D7 에서처럼 "string"을 "AnsiString"및 "Char"를 "AnsiChar"로 바꿉니다. 또한 GetTempPath 및 GetTempFileName 대신 GetTempPathA 및 GetTempFileNameA를 호출하십시오.

그러나 Mason이 제공 한 접근 방식이 유니 코드 파일 이름을 지원하기 때문에 더 좋습니다.

+0

D7에서 작동하기 때문에 "** D2010 **에서 작동하도록하려면 ..."을 대체로 사용 하시겠습니까? 또한 String과 AnsiString은 Delphi 7에서 동일하므로 아무 효과가 없습니다. – DaveBoltman

+0

@DaveBoltman : 아니요. "D7에서 ** ** 그대로 ** 바꾸기 ..."라고 씁니다. –

+0

아, 네, 죄송합니다 - 신중하게 대답을 읽지 못했습니다 :) 맞습니다 – DaveBoltman

관련 문제