gpt4 book ai didi

c++ - 如何从 C++ 调用 Delphi DLL WideString 参数(包括 var 参数)

转载 作者:行者123 更新时间:2023-11-30 04:17:06 35 4
gpt4 key购买 nike

我有一个 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 和应用程序

我应该怎么做呢?

最好的问候,

加里

最佳答案

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;

关于c++ - 如何从 C++ 调用 Delphi DLL WideString 参数(包括 var 参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303831/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com