問題:如何在Delphi中導入一個名爲「IOperation7 :: SaveAsWavFile」的DLL函數?在Delphi中使用C++類函數DLL
詳情/解釋:
我試圖寫代碼(在Delphi XE,還必須在D2007工作)導入第三方DLL文件導出的函數。 DLL文檔是C++特有的。我只有有限的經驗,這種事情。
當然,一般的方法是這樣的:
interface
function SaveAsWavFile (Handle: Cardinal; FileName: WideString): HResult; stdcall;
implementation
function SaveAsWavFile; external 'SOMELIBRARY.DLL';
我遇到的情況是,在DLL中的函數名稱已嵌入雙冒號。使用DLL Export Viewer(www.nirsoft.net/utils/dll_export_viewer.html),將導出的函數名稱報告爲「IOperation7 :: SaveAsWavFile」。
德爾福名指令好像它可能會幫助,但下面的代碼導致運行時錯誤「過程入口點IOperation7 :: SaveAsWavFile找不到......」
function SaveAsWavFile; external 'SOMELIBRARY.DLL' name 'IOperation7::SaveAsWavFile';
變化(單個冒號,點)也沒有工作。我也嘗試了Delphi 索引指令,並通過DLL導出查看器報告序號,但無濟於事。我沒有想到它會起作用,因爲看起來每個序號都被多個功能使用。這導致我下一個懷疑。
我不確定::字符的意義,但我現在懷疑它們與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;
我明白在實際的Delphi代碼中的答案可能是不可能的,因爲我可能遺漏了我沒有認識到的重要信息。我會很高興指出一般問題的體面參考資料。 – 2013-03-22 21:02:06
所以你說有些傷心的第三方決定把C++的名字作爲練習給讀者,這是你嗎?你是否意識到一個可怕的混亂的C++類的名字是怎麼回事,這是多少痛苦?我建議你在dll上運行MS dumpbin util並找出它真正叫做的東西。 http://support.microsoft.com/kb/177429?wa=wsignin1.0('DUMPBIN/EXPORTS mydll.dll')我認爲DLL中的C++ - mangled導出是無能的表現。 (不是你的,誰寫的那個DLL。)另外它不會是WideString(這是一個Delphi類型)。發佈.hpp類聲明。 – 2013-03-22 21:04:56
@Warren WideString不過是COM BSTR – 2013-03-22 21:12:32