質問: 「IOperation7::SaveAsWavFile」という名前の DLL 関数を Delphi にインポートするにはどうすればよいですか?
詳細/説明:
サード パーティの DLL ファイルによってエクスポートされた関数をインポートするコードを記述しようとしています (Delphi XE では、D2007 でも動作する必要があります)。DLL ドキュメントは C++ 固有です。私はこの種のことについて限られた経験しかありません。
もちろん、一般的なアプローチは次のようなものです。
interface
function SaveAsWavFile (Handle: Cardinal; FileName: WideString): HResult; stdcall;
implementation
function SaveAsWavFile; external 'SOMELIBRARY.DLL';
私が遭遇した状況は、DLL 内の関数名に二重コロンが埋め込まれていることです。DLL エクスポート ビューアー (www.nirsoft.net/utils/dll_export_viewer.html) を使用すると、エクスポートされた関数名は "IOperation7::SaveAsWavFile" としてレポートされます。
Delphi のnameディレクティブが役立つように見えましたが、次のコードを実行すると、「プロシージャ エントリ ポイント IOperation7::SaveAsWavFile が見つかりませんでした...」という実行時エラーが発生します。
function SaveAsWavFile; external 'SOMELIBRARY.DLL' name 'IOperation7::SaveAsWavFile';
バリエーション (単一のコロン、ドット) も機能しませんでした。また、DLL Export Viewer によって報告された序数を使用して Delphiインデックスディレクティブを試しましたが、役に立ちませんでした。各序数が複数の関数で使用されているように見えたので、うまくいくとは思っていませんでした。それが私を次の疑惑に導きました。
:: 文字の意味はよくわかりませんが、DLL 内に埋め込まれたクラスと何らかの関係があるのではないかと疑っています。したがって、私の疑いが正しければ、上記の質問はおそらく「DLL に含まれるクラス内の Delphi 関数でどのように利用できますか?」と表現したほうがよいでしょう。
編集: これは .h ファイルからの実際の参照です。上に投稿したコードと完全に一致していないことに気付きました-投稿した例を単純にしようとしていました。
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FdSaveAsWavFile(
/* [in] */ ULONG handle,
/* [in] */ BSTR newFileName,
/* [in] */ ULONG newAudioFormat,
/* [in] */ ULONG failIfExists,
/* [in] */ IOLDMFileProgressNotification *progress) = 0;