最も可能性の高い説明は、関数が装飾された名前でエクスポートされるということです。という名前でエクスポートされたと思い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);