質問

C ++ / CLIプロジェクトにこのコードを持っています:

CSafePtr<IEngine> engine;
HMODULE libraryHandle;

libraryHandle = LoadLibraryEx("FREngine.dll", 0, LOAD_WITH_ALTERED_SEARCH_PATH);

typedef HRESULT (STDAPICALLTYPE* GetEngineObjectFunc)(BSTR, BSTR, BSTR, IEngine**);
GetEngineObjectFunc pGetEngineObject = (GetEngineObjectFunc)GetProcAddress(libraryHandle, "GetEngineObject");

pGetEngineObject( freDeveloperSN, 0, 0, &engine )
.

最終行はこの例外をスローします。

RPCサーバが利用できない

この例外を引き起こす可能性がありますか?

役に立ちましたか?

解決

Abbyy FreはCOMオブジェクトです。GetEngineObject()は、それが別の関数である以外は通常のCOMインタフェースメソッドのように動作します。これは次のことを意味します。例外は外部に伝播することはできません。これを達成するために、それはすべての例外をキャッチし、それらを適切なHRESULT値に変換し、IErrorInfoを設定します。

あなたはメソッド内でスローされた例外を分析しようとしている方法は、問題が何であるかを見つけることができません。それは内部的にそれがこのように機能するかもしれないからです:

HRESULT GetEngineObject( params )
{
    try {
       //that's for illustartion, code could be more comlex
       initializeProtection( params );
       obtainEngineObject( params );
    } catch( std::exception& e ) {
       setErrorInfo( e ); //this will set up IErrorInfo
       return translateException( e ); // this will produce a relevant HRESULT
    }
    return S_OK;
}

void intializeProtection()
{
    try {
       doInitializeProtection();//maybe deep inside that exception is thrown
       ///blahblahblah
    } catch( std::exception& e ) {
       //here it will be translated to a more meaningful one
       throw someOtherException( "Can't initialize protection: " + e.what() );
    }
}
.

だから実際の呼び出しは例外をキャッチし、それらを意味のある診断を提供することができます。THA診断を取得するには、関数の返信後にIErrorInfo*を取得する必要があります。そのために同じ例プロジェクトからcheck()関数からコードを使用してください。スローされている例外を見つめない - あなたはそれを持つチャンスを持っていません、それを伝播させて翻訳されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top