Problem beim importieren einer .tlb-Datei



  • Hallo zusammen,

    ich habe ein Problem beim importieren einer .tlb-Datei. Ich nutze VS9 und habe ein win32 Projekt. Das ganze Programm sieht folgendermaßen aus:

    #import "CamCtrl.tlb" no_namespace
    #include <iostream>
    
    int main(void)
    {
    	HRESULT hr = CoInitialize(NULL); // hr = S_OK
    	try{
    		_DLVCamPtr p_DLVCam;
    		hr = p_DLVCam.CreateInstance("CAMCTRL.LVCamCtrl.3"); //ebenfalls hr = IS_OK
    		_bstr_t res = p_DLVCam->GetVersion();
    
    	}
    	catch(...){
    		std::cerr<<"error...\n";
    	}
    	return 0;
    }
    

    Das Projekt kompiliert wunderbar und CoInitialize() und CreateInstance() funktionieren auch wunderbar. Aber wenn ich dann die Methode GetVersion() aufrufen, dann wirft mir das Programm eine Exception. Hat jemand eine Idee was das sein kann? Ich kenne mich mit .tlb-Dateien leider gar nicht aus. Die Funktion GetVersion() aus der durch #import erzeugten ‚camctrl.tli‘ sieht so aus:

    inline _bstr_t _DLVCam::GetVersion ( ) {
        BSTR _result = 0;
        _com_dispatch_propget(this, 0x64, VT_BSTR, (void*)&_result);
        return _bstr_t(_result, false);
    }
    

    Der Aufruf com_dispatch_propget(this, 0x64, VT_BSTR, (void*)&_result) macht hier die Probleme.

    Für Anregungen wär ich sehr dankbar. Zur Info:
    Ich habe eine Kamera, für die es ein MFC Projekt gibt. Da ich aber MFC nicht nutzen will, würde ich gerne die ActiveX Steuerung in mein win32 Projekt einbauen. Alles was ich will ist mich zur Kamera verbinden und ein Bild machen. Neben der .tlb-Datei habe ich noch eine .lic- und eine .ocx-Datei, kann ich damit was anfangen?

    Vielen Dank, los-locos



  • Fange doch mal die exception (vermutlich eine _com_error).
    Da gibts dann mehr informationen.

    Simon



  • Hallo Simon, danke für die schnelle Antwort. Mit Exceptions kenne ich mich nicht so wirklich aus, sollte ich mich aber wahrscheinlich mal einarbeiten. Wenn ich allerdings:

    ...
    catch(_com_error &e){
    std::cerr<<"error:"<<e.ErrorMessage()<<"\n";
    std::cerr<<"error:"<<e.ErrorInfo()<<"\n";
    std::cerr<<"error:"<<e.Error()<<"\n";
    std::cerr<<"error:"<<e.Description()<<"\n";
    }
    mache, dann bekomme ich:
    error:003B9DD0
    error:00000000
    error:-2147418113
    und beim letzten Aufruf (Description) kommt die Meldung:
    Unhandled exception at 0x5f11f8e0 (msvcr90d.dll) in test.exe: 0xC0000005: Access violation reading location 0x00000000.

    Wie gesagt, mit exceptions kenne ich mich nicht aus, aber ich denke, dass gerade die Description() interessant wäre.



  • Gib den e.Error() mal Hex aus und suche danach (google, msdn, etc.).
    Dort steht der eigentliche COM Error Code drin.

    Simon

    Edit: -2147418113 ➡ HRESULT 8000ffff (E_UNEXPECTED)

    E. steht in der Dokumentation der Komponente warum dieser Fehler zurückgegeben wird.



  • Ich finde leider nicht heraus warum der Fehler auftritt. In der Dokumentation der Kamera finde ich dazu auch nichts. Wie finde ich denn heraus von wo der Fehler genau kommt?


Anmelden zum Antworten