2012-06-03 10 views
6

COMインターフェイスでサードパーティライブラリを使用しようとしています。 A C++サンプルアプリケーションは以下のように宣言された関数使用が提供される:タイプライブラリをインポートした後インポートされたタイプライブラリ関数が元のソースと異なるのはなぜですか?

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

を、得られたDelphiコードは、C++サンプル・アプリケーションの

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

、結果( HRESULT)は、関数が正しく実行されたかどうかを判断するために使用されます。
なぜ私は結果を返すことができないようにこの宣言をプロシージャに変換しますか?
これを解決するにはどうすればよいですか?

+0

時々私は、Delphiで生成されたtlbが間違っていることを発見しました。私は手動で生成されたtlbファイルを編集することになります。プロシージャを関数に変更し、それが機能するかどうかを確認してください。 – Hendra

+1

これを調べる必要はありません。結果の上位ビットが設定されている場合、Delphiは例外をスローします。このため、プロシージャは 'safecall'と宣言されます。 [この質問](http://stackoverflow.com/questions/96042/whats-safecall)を参照してください。 –

+1

2番目の考えでは、コマンドプロンプトから-Pt-オプションを指定してtlibimpを実行してみてください(-Pt- HRESULTをマップしてすべてのインタフェースを安全にする(-T))。 – Hendra

答えて

7

safecall呼び出し規約は、単に戻り値HResultの変換です。関数が成功しなかった場合(通常、S_OKまたはS_False以外)、例外にラップされてスローされます(または、SysUtilsがどこでも使用されていない場合はreSafeCallErrorランタイムエラーになります)。詳細はSystem._CheckAutoResultをご覧ください。

あなたはsafecallの機能を実装している場合(TObject.SafeCallExceptionは何かを返すように上書きされない限り、E_Unexpected)同様に、任意の例外がHResult値にキャッチされ、翻訳されます。その仕組みについては、System._HandleAutoExceptionを参照してください。

場合によっては、HResultを返す関数にプロシージャを戻すこともできます。その場合の呼び出し規約はstdcallである必要があります。あなたの例を使用して:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall; 
関連する問題