1

Delphiアプリから呼び出されたときに機能するDelphi DLLがあり、次のように宣言されたメソッドをエクスポートします。

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 です。

これを行うにはどうすればよいでしょうか?

よろしくお願いします、

ギャリー

4

1 に答える 1

2

DllImportC++ にはありません。これは、代わりに .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;
于 2013-06-25T17:43:54.327 に答える