2013-06-18 225 views
1

我想調用使用Delphi XE2德爾福7(在unicode支持之前)內置的DLL。 的代碼是這樣的:DLL調用在德爾福2010年工作,但在德爾福XE2視頻

function Foo(Param1: PChar; Var Param2: DWORD; Var Param3: DWORD): PChar; stdcall; external 'bar.dll'; 

然後我打電話:

var 
    V1: PChar; 
    V2: AnsiString; 
    V3, V4: DWORD; 

begin 
    V1 := Foo(PChar(V2), V3, V4); 
    .. 

此代碼德爾福2010年,但在XE2我得到一個訪問衝突和以下堆棧:

System.UTF8ToUnicodeString(nil) 
System.UTF8ToString(nil) 
System.TObject.ClassName 
Vcl.Forms.IsClass(???,Exception) 
Vcl.Forms.TApplication.HandleException($2083120) 
Vcl.Controls.TWinControl.MainWndProc(???) 
System.Classes.StdWndProc(726196,273,6106,2365402) 
:776e77d8 ; C:\Windows\SysWOW64\user32.dll 
:776e78cb ; C:\Windows\SysWOW64\user32.dll 
:776ef139 ; C:\Windows\SysWOW64\user32.dll 
:776eaaa6 user32.SendMessageW + 0x52 
:749fb322 ; C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9200.16579_none_8937eec6860750f5\comctl32.dll 
:749fb27e ; C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9200.16579_none_8937eec6860750f5\comctl32.dll 
:776e77d8 ; C:\Windows\SysWOW64\user32.dll 
:776e78cb ; C:\Windows\SysWOW64\user32.dll 
:776ebd11 user32.ChangeWindowMessageFilterEx + 0x71 
:776ebd39 user32.CallWindowProcW + 0x1c 
Vcl.Controls.TWinControl.DefaultHandler(???) 
:0048b0c1 TWinControl.DefaultHandler + $DD 
:0048afc4 TWinControl.WndProc + $5B8 
:0049d031 TButtonControl.WndProc + $71 
:004535f2 StdWndProc + $16 
:776e77d8 ; C:\Windows\SysWOW64\user32.dll 
:776e78cb ; C:\Windows\SysWOW64\user32.dll 
:776e899d ; C:\Windows\SysWOW64\user32.dll 
:776e8a66 user32.DispatchMessageW + 0x10 

回答

6

PChar映射到D7中的PAnsiChar,但映射到D2009及更高版本中的PWideChar。您正在使用AnsiString而不是UnicodeString,但您無法將AnsiString鍵入到PWideChar。你需要類型轉換到一個PAnsiChar,而是和你需要更改D2009 +您的DLL函數聲明相匹配的PAnsiChar該DLL實際使用:

function Foo(Param1: PAnsiChar; var Param2: DWORD; var Param3: DWORD): PAnsiChar; stdcall; external 'bar.dll'; 

var 
    V1: PAnsiChar; 
    V2: AnsiString; 
    V3, V4: DWORD; 
begin 
    V1 := Foo(PAnsiChar(V2), V3, V4); 
    .. 
3

作爲一個AnsiString,在德爾福2009版以後的任何Delphi版本中輸入V2PChar是錯誤的。那是PChar成爲PWideChar而不是PAnsiChar的別名。如果該代碼在Delphi 2010中運行,那完全是偶然的。修復您的代碼以使用正確的字符類型。

在德爾福7中,PChar參數是PAnsiChar,所以在Delphi 2010和Delphi XE2導入單元中更改聲明,使其明確爲PAnsiChar。同樣的返回類型。

+0

從語義上講,將'AnsiString'強制轉換爲'PChar'總是錯誤的。語義上正確的轉換是:'PChar(string)','PAnsiChar(AnsiString)','PWideChar(UnicodeString)','PWideChar(WideString)'。 –