6

COMインターフェイスでサードパーティのライブラリを使用しようとしています。次のように宣言された関数を使用するC++サンプルアプリケーションが提供されています。

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

タイプライブラリをインポートすると、結果のDelphiコードは次のようになります。

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

C ++サンプルアプリケーションでは、結果(HRESULT)を使用して、関数が正しく実行されたかどうかを判断します。
Delphiがこの宣言をプロシージャに変換して、結果を取り戻せないのはなぜですか?
これを修正するにはどうすればよいですか?

4

1 に答える 1

7

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

同様に、safecall 関数を実装している場合、例外はキャッチされ、HResult値に変換されます (がオーバーライドされて別の値が返されE_Unexpectedない限り)。TObject.SafeCallExceptionそれがどのように機能するかを参照System._HandleAutoExceptionしてください。

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

function DoSomething(const id: WideString; State: Integer): HResult; stdcall;
于 2012-06-03T16:01:09.340 に答える