2013-03-22 101 views
1

問題:如何在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; 
+0

我明白在實際的Delphi代碼中的答案可能是不可能的,因爲我可能遺漏了我沒有認識到的重要信息。我會很高興指出一般問題的體面參考資料。 – 2013-03-22 21:02:06

+0

所以你說有些傷心的第三方決定把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

+1

@Warren WideString不過是COM BSTR – 2013-03-22 21:12:32

回答

0

如果這是由DLL導出的C++類,那麼你需要寫一個C++包裝DLL將它轉化成一些可以由德爾福消耗。這是因爲C++類只能被C++代碼使用,就像Delphi類只能被Delphi代碼所使用一樣。

如果這是一個接口,那麼你可以直接使用該DLL。如果接口與COM兼容,那麼你的狀態可能會更好。你需要知道如何實例化對象。它是COM嗎?或者你調用DLL導出的函數?

你將無法用PE瀏覽器猜測這個。您需要研究DLL的文檔和頭文件。這是二元接口的真正規範。


關於您的更新,它看起來像來自界面的方法。這就是接口方法的樣子。但是,仍然沒有足夠的信息可以肯定地說。

+0

週一,當我的大腦新鮮時,我會回顧SDK的內容,看看我是否可以發現一個包裝DLL。可能會比較棘手,因爲SDK只是其中的一半 - 它還需要安裝SDK的商業軟件(SDK基於SDK中未包含的DLL,這已成爲激怒的重要來源爲了我)。結果是,在默認安裝路徑中,至少有4個完全不同的位置的DLL,至今我找到了。 – 2013-03-22 22:01:38

+0

當然,這個東西的文檔,不管它是什麼(爲什麼你不告訴我們?),告訴你如何調用它。它是一個COM接口嗎?它是一個C++接口嗎?我仍然在浪費你的時間尋找DLL。使用SDK,頭文件,文檔。這些DLL是您可能需要稍後知道的實現細節。首先,弄清楚這是什麼。 – 2013-03-22 22:05:01

+0

對不起,我沒有試圖隱藏SDK,我只是試圖將問題歸結爲最小數量的絨毛細節。 SDK是FileDownloadSDK_v206。這是奧林巴斯的手持式數字錄音機(用於轉錄)。我能夠以相對較小的難度獲得其他與Delphi相關的SDK(DSS&DSSProSDK_v200)。但是它沒有這個用於DLL導出的雙冒號「IOperation7 :: SaveAsWavFile」格式,並且.h文件更直接。 – 2013-03-25 14:59:39