2014-03-04 5 views
1

다음 델파이 함수를 추가 한 후 데이터 유형이 잘못 정렬 된 경우 오류가 발생합니다. Project ... faulted with message: 'datatype misalignment at 0x77a7d7d8'. Process Stopped. Use Step or Run to continue.델파이와의 데이터 유형 불일치?

내가 추가 한 기능은 다음과 같습니다. timestamp 만 실제로 파일에 쓰여지지만 함수가 실제로 성공적으로 완료됩니다.

procedure Log(msg : String); 
var 
    tempFolderChars : array [0..MAX_PATH] of Char; 
    tempFolder : string; 
    logFile : TextFile; 
    dt : TDateTime; 
begin 
    GetTempPath(SizeOf(tempFolderChars), tempFolderChars); 
    tempFolder := IncludeTrailingPathDelimiter(String(tempFolderChars)); 
    dt := Now(); 

    AssignFile(logFile, tempFolder + 'GenericHolding.txt'); 
    if FileExists(tempFolder + 'GenericHolding.txt') then 
    Append(logFile) 
    else 
    ReWrite(logFile); 

    Write(logFile, FormatDateTime('yyyy-mm-dd hh:nn:ss ', now)); 
    Write(logFile, msg); 
    Write(logFile, #13, #10); 
    CloseFile(logFile); 
end; 

편집 : 자세한 조립 출력을 추가했습니다.

ntdll.NtQueryInformationProcess: 
77BAFAC8 B816000000  mov eax,$00000016 
77BAFACD 33C9    xor ecx,ecx 
77BAFACF 8D542404   lea edx,[esp+$04] 
77BAFAD3 64FF15C0000000 call dword ptr fs:[$000000c0] 
77BAFADA 83C404   add esp,$04 
77BAFADD C21400   ret $0014 
+0

당신이 주소'0x77a7d7d8'에서 무엇을 게시하시기 바랍니다 수 있을까요? 그리고 아마 스택 추적? –

+1

코드를 사용하여 문제를 재현 할 수 없습니다 (복사/직접 D2007 프로젝트에 붙여 넣기). 어떤 델파이 버전과 OS를 사용하고 있습니까? –

+1

IIRC, 델파이 버전은 단순한 타입 캐스트가 항상 효과적이지는 않을 것이기 때문에 정말로 중요합니다. 이전 버전의 Delphi에서는 StrPas를 사용해야합니다. 도움이 될 또 다른 것은 당신이 전달하는 msg의 내용입니다. – Graymatter

답변

5

Char 델파이 2007 년 AnsiChar (SizeOf(Char)=1을)과 이전하지만, 델파이 2009 이상에서 WideChar (SizeOf(Char)=2)입니다.

GetTempPath()는 첫 번째 매개 변수가 버퍼에 저장할 수있는 문자의 수를 지정 할 것으로 예상하지만, 대신 바이트수를 지정합니다.

델파이 2007 및 이전 버전에서는 SizeOf(tempFolderChars)Length(tempFolderChars)이 같은 값이지만 델파이 2009 및 이후 버전에서는 동일하지 않습니다. 후자의 경우 GetTempPath()에 실제로 가능한 두 배의 문자를 허용 할 수 있다고 말합니다.

SizeOf(tempFolderChars)Length(tempFolderChars)으로 변경해야합니다. 반환 값 GetTempPath()에도 실제로 개의 버퍼가 얼마나 많이 쓰여 졌는지 알려주므로주의해야합니다.

대신이 시도 :

procedure Log(msg : String); 
var 
    tempFolderChars : array [0..MAX_PATH] of Char; 
    tempFolder : string; 
    len: DWORD; 
    ... 
begin 
    len := GetTempPath(Length(tempFolderChars), tempFolderChars); 
    if len = 0 then Exit; 
    SetString(tempFolder, tempFolderChars, len); 
    tempFolder := IncludeTrailingPathDelimiter(tempFolder); 
    ... 
end; 
+0

사실 저는 C++ Win32 API에서'SomeFuncA' 대'SomeFuncW' 상황에 대해 이미 알고 있습니다 만,) * Integer * 타입의'Char' ('AnsiChar'와'WideChar')가 있습니다. 감사. – magnus