0

エクスポート機能を備えたdllがあります

extern "C" __declspec(dllexport) IDriver * __stdcall GetDriver() 

Delphiで書かれたプログラムがあります。関数 GetDriver() を認識できません。このプログラムのソースを取得したり変更したりできないので、二重にひどいです。

DLL のロードに成功し (ログ ファイルによる)、エクスポート関数の呼び出しに失敗した理由は何ですか? ありがとうございました。

Window 7 x64、Visual Studio 2010、x86 ターゲット用の C++ プロジェクト

4

1 に答える 1

4

最も可能性の高い説明は、関数が装飾された名前でエクスポートされるということです。という名前でエクスポートされたと思いGetDriver@0ます。したがって、次のようにインポートできます。

function GetDriver: IDriver; stdcall; external 'DllName.dll' name 'GetDriver@0';

Dependency Walkerなどのツールを使用して、関数のエクスポートに使用された正確な名前を確認します。

Delphi コードを変更できない場合は、C++ DLL を一致させる必要があります。これは、エクスポートされた名前を制御できる .def ファイルを使用して行います。


直面するもう 1 つの問題は、Delphi の戻り値の ABI が、Windows プラットフォームの他のほとんどのツールで使用されるものと異なることです。具体的には、戻り値は意味的にはvarパラメーターです。一方、C++ コンパイラは戻り値をoutパラメーターと見なします。DelphiのWideString戻り値に関する私の質問は、まさにこの問題をカバーしています。

このため、上記の関数宣言はアクセス違反につながると思います。代わりに、戻り値を a として宣言し、Pointerそれを Delphi コードのインターフェイス参照にキャストする必要があります。再確認して、参照カウントが適切に処理されていることを確認する必要があります。

繰り返しになりますが、Delphi コードを変更できない場合は、C++ コードを一致させる必要があります。Delphi インターフェイスの戻り値は、他のパラメータに続く追加varパラメータとして実装されます。したがって、C++ 関数を一致させるには、次のように宣言します。

void __stdcall GetDriver(IDriver* &retVal);
于 2012-10-26T07:57:26.600 に答える