2012-06-03 27 views
6

我想用COM接口使用第三方庫。 A C++示例應用程序被提供,它使用聲明爲一個函數:爲什麼導入的類型庫函數與原始源不同?

HRESULT __stdcall IMyInterface::DoSomething (BSTR id, long State) 

導入類型庫後,將所得Delphi代碼是:

procedure DoSomething (const id: WideString; State: Integer); safecall; 

在C++示例應用程序,結果( HRESULT)用於確定函數是否正確執行。
爲什麼德爾福把這個聲明轉換成一個過程,以至於我無法得到結果呢?
我能做些什麼來解決這個問題?

+0

有時候我發現Delphi生成的tlb是錯誤的。我最終手動編輯生成的tlb文件。嘗試將程序更改爲函數並查看它是否有效。 – Hendra

+1

你不需要檢查它,當結果的高位被設置時,Delphi會拋出異常,這就是爲什麼該過程被聲明爲'safecall'。看到[這個問題](http://stackoverflow.com/questions/96042/whats-safecall)和答案。 –

+1

再次想到,嘗試使用-Pt-選項(-Pt-將HRESULT映射到所有接口(-T)上的safecall)從命令提示符運行tlibimp。 – Hendra

回答

7

safecall調用約定只是HResult返回類型的轉換。如果函數返回非成功(通常不是S_OKS_False),它將被包裝成一個異常並拋出(或者如果SysUtils在任何地方都沒有被使用,則會變成reSafeCallError運行時錯誤)。詳情請查閱System._CheckAutoResult。同樣,如果您正在實施安全調用功能,則會捕獲任何異常並將其轉換爲HResult值(E_Unexpected,除非TObject.SafeCallException被覆蓋以返回其他內容)。請參閱System._HandleAutoException瞭解其工作原理。

如果需要,歡迎將程序轉回函數返回HResult。在這種情況下的調用約定應該是stdcall。用你的例子:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall; 
相關問題