我有一个Delphi DLL,在delphi应用程序调用时可以工作,并导出一个声明为:
的方法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;
我使用Rad Studio XE4构建了DLL和c ++测试应用程序 - 它是64位DLL和APP
我该怎么做呢?
致以最诚挚的问候,
garry
答案 0 :(得分:2)
C ++中没有DllImport
。这是针对.NET PInvoke的。所以删除它。
C ++函数声明的其余部分与Delphi函数声明不匹配。正确的C ++声明如下:
void __stdcall ProduceOutput(WideString request, WideString inputs, WideString &ResultString);
不要忘记静态链接到DLL的import .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;