2

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 サーバー

この例外の原因は何ですか?

4

1 に答える 1

2

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() );
    }
}

そのため、実際の呼び出しで例外をキャッチして変換し、意味のある診断を提供できます。診断を取得するIErrorInfo*には、関数が戻った後に取得する必要があります。check()そのためには、同じサンプル プロジェクトの関数のコードを使用します。例外がスローされるのをじっと見つめないでください。例外が発生する可能性はありません。例外が伝播して翻訳されるようにしてください。

于 2010-07-22T05:37:58.507 に答える