2016-05-06 101 views
1

我不能在delphi中使用dll的函數。我在轉換類型時遇到了一些問題。從C++傳遞var字符串到Delphi dll

這是我想打電話給德爾福DLL中的函數:

function SyncFunc(var Type:string; var MaxUsers:integer; var ErrCode :Word):boolean; 

C++代碼:

unsigned char(WINAPI *SyncFunc)(PCHAR Type, INT *MaxUsers, WORD *ErrCode); 

HMODULE hLib; 
BOOL Res = FALSE; 
WORD ErrCode = 0; 
INT MaxUsers = 0; 
CHAR Type[256]; 
hLib = LoadLibrary("delphi.dll"); 
Res = SyncFunc(Type, &MaxUsers, &ErrCode); 

有人請幫助。 P.S.這裏類似的問題C++ consuming delphi DLL(但我的函數使用字符串,而不是WideString的)

+0

你可以改變字符串爲pchar? – Passella

+0

您只能從使用構建該DLL的相同版本的Delphi編譯的代碼中調用該函數。與sharemem也。在繼續之前,您需要修復您的DLL。你需要了解的是,本地字符串類型是一個Delphi特定類型。使用WideString是解決問題的好方法。 –

+0

我無法更改dll(從以前的開發人員'按原樣'從源代碼中獲取此信息) –

回答

1
function SyncFunc(var Type:string; var MaxUsers:integer; var ErrCode :Word):boolean; 

有你在這裏面臨兩個問題:

  1. string是隻能被創建和Embarcadero的消耗原生的Delphi類型工具。此外,由於它使用Delphi運行時堆,因此必須使用ShareMem或類似的代碼。
  2. 該函數使用默認的register調用約定,該約定只能使用Embarcadero工具使用。

明顯的方法是修復DLL並安排它使用標準的平臺互操作類型和調用約定。您可以使用BSTR(德爾福中的WideString)作爲調用約定,而stdcall作爲調用約定。

如果您不能更改DLL,那麼您唯一的希望就是使用與編譯此錯誤DLL相同的編譯器編寫適配器DLL。但是,只有在使用共享內存管理器編譯錯誤的DLL的情況下,這才能工作。如果情況並非如此,那麼你的任務幾乎是不可能的。