2014-03-04 74 views
1

添加以下德爾福功能後,我收到有關數據類型錯位的錯誤:Project ... faulted with message: 'datatype misalignment at 0x77a7d7d8'. Process Stopped. Use Step or Run to continue.德爾福的數據類型錯位?

我添加的功能如下。請注意,該函數實際上成功完成,但只有時間戳實際寫入文件。

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項目中)。你使用的是什麼Delphi版本和操作系統? –

+1

IIRC,Delphi的版本非常重要,因爲簡單的類型轉換並不總是有效。在舊版Delphi中,您需要使用StrPas。另一個有用的信息是你傳遞的msg的內容。 – Graymatter

回答

5

CharAnsiChar在2007年德爾福(SizeOf(Char)=1)以及更早版本,但是是WideCharSizeOf(Char)=2)在2009年和以後德爾福。

GetTempPath()預期的第一個參數指定數目的字符,你的緩衝區可以容納的,但你指定字節數代替。

在德爾福2007和更早的版本中,SizeOf(tempFolderChars)Length(tempFolderChars)將是相同的值,但在Delphi 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'情況,但我只知道這適用於(我儘管是)*整型*類型'Char'('AnsiChar' vs'WideChar')。謝謝。 – magnus