2010-07-08 1 views
1

je ce code dans le projet C++/CLI:Chargement ABBYY Engine

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) 

dernière ligne lance cette exception:

RPC Server non disponible

Ce qui peut causer ce exception?

+0

Quelle version d'ABBYY FRE est-ce? Est-ce que LoadLibraryEx() et GetEngineObject réussissent? Comment vois-tu exactement l'exception? – sharptooth

+0

ABBYY Fine Reader Engine 9.0 Visual Studio me renvoie une exception lors de l'appel pGetEngineObject. –

+1

Voulez-vous dire que le débogueur dit qu'il y a eu une exception? Si tel est le cas, après le retour de GetEngineObject(), utilisez le code que vous trouvez dans la fonction check() pour récupérer le fichier IErrorInfo * et le texte de description. Ce texte va expliquer ce qui ne va pas. – sharptooth

Répondre

2

ABBYY FRE est un objet COM. GetEngineObject() se comporte comme une méthode d'interface COM normale sauf qu'il s'agit d'une fonction distincte. Ce qui signifie ce qui suit: il ne permet pas aux exceptions de se propager à l'extérieur. Pour ce faire, il saisit toutes les exceptions, les convertit en valeurs HRESULT appropriées et met éventuellement en place IErrorInfo.

Vous essayez d'analyser l'exception lancée à l'intérieur d'une méthode n'ont aucune chance de trouver quel est le problème. En effet, en interne, il pourrait fonctionner comme ceci:

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

si l'appel réel peut intercepter les exceptions et les traduire pour fournir des diagnostics significatifs. Pour obtenir les diagnostics, vous devez récupérer IErrorInfo* après le retour de la fonction. Utilisez le code de check() fonction du même exemple de projet pour cela. Ne regardez pas l'exception qui est lancée - vous n'avez aucune chance avec cela, laissez-la se propager et être traduite.