2013-06-25 26 views
1

我有一個Delphi的DLL,它的工作原理,當德爾福應用程序調用,並且出口的方法聲明爲:如何調用由C德爾福DLL WideString的參數++(包括變種參數)

Procedure ProduceOutput(request,inputs:widestring; var ResultString:widestring);stdcall; 

在C++方面我都試過:

[DllImport("ArgumentLab.dll", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.WideString)]; 
extern void ProduceOutput(WideString request, WideString inputs, WideString ResultString); 

WideString arequest = WideString(ComboBox1->Text); 
WideString ainput = "<xml> Input Text Goes Here </XML>"; 
WideString aresultstring; 
WideString &aresultstringpointer = aresultstring; 
aresultstring = " "; 
ProduceOutput(arequest, ainput, &aresultstringpointer); 

Memo1->Lines->Text = aresultstring; 

我的控制檯錯誤讀取:

Unit1.cpp(13): candidate function not viable: no known conversion from 'BSTR *' (aka 'wchar_t **') to 'System::WideString' for 3rd argument; 

我已經建立了DLL並使用Rad公司的C++測試程序Studio XE4 - 這是一個64位的DLL和APP

我應該如何去做這件事?

最好的問候,

加里

+0

沒有'DllImport' C++ Builder中。你是否使用.NET PInvoke? –

+0

Remy,如何在不使用DLLImport的情況下獲取DLL庫? btw謝謝你的迴應。 – user2521117

+0

@ user2521117如果您不使用C++ Builder,則可能無法工作,因爲C++沒有標準的二進制接口。 –

回答

2

在C中沒有DllImport ++。這是針對.NET PInvoke的。所以刪除。

您的C++函數聲明的其餘部分與Delphi函數聲明不匹配。正確的C++聲明如下:

void __stdcall ProduceOutput(WideString request, WideString inputs, WideString &ResultString); 

不要忘了靜態鏈接到DLL的進口的.lib文件(你可以使用C++ Builder的命令行工具IMPLIB.EXE創建,如果需要的話) 。

然後,在應用程序代碼,您可以調用DLL函數是這樣的:

WideString arequest = ComboBox1->Text; 
WideString ainput = "<xml> Input Text Goes Here </XML>"; 
WideString aresultstring; 
ProduceOutput(arequest, ainput, aresultstring); 

Memo1->Lines->Text = aresultstring; 

的原因,你所得到的轉換錯誤是因爲WideString類覆蓋了&運營商返回一個指向其內部BSTR成員。這樣做的原因是爲了讓WideString要像對ActiveX/COM串智能包裝類,如:

HRESULT __stdcall SomeFuncThatReturnsABStr(BSTR** Output); 

WideString output; 
SomeFuncThatReturnsABStr(&output); 

因此,它是不可能獲得一個指向WideString本身使用&運算符。正因爲如此,唯一的方法(我知道的),以獲得真正的WideString指針動態分配WideString,如:

WideString *pStr = new WideString; 
... 
delete pStr;