Import von VB COM-DLL in VC++



  • Hallo allerseits,

    Ich versuche eine in VB6.0 geschriebene COM-Dll mittels der entsprechenden Typelib in ein VC++ Projekt (VS2005) einzubinden und die entsprechenden Funktionen daraus zu nutzen. Dazu habe ich ein neues Konsolenprojekt mit MFC und ATL Unterstützung erstellt.

    Im Header habe ich die .tlb importiert:

    #import "C:\test\AccessManager.tlb"
    using namespace AccessManagerLib;
    

    Der Code sieht folgendermassen aus:

    HRESULT hr;
    	long val;
    	hr = CoInitialize(NULL);
    
    	//NewServerconnection
    	IAccessManagerPtr pNewConnection;
    	hr = pNewConnection.CreateInstance(__uuidof(AccessManager));
    
    	//New User
    	IUserInfoPtr pNewObject;		
    	hr = pNewObject.CreateInstance(__uuidof(UserInfo));
    
    	//Login Info
    	BSTR Server = SysAllocString(L"192.168.7.29");
    	BSTR ServerUser = SysAllocString(L"0000");
    	BSTR ServerPassword = SysAllocString(L"1234");
    	_bstr_t WServer;
    	WServer.Assign(Server);
    	_bstr_t WServerUser;
    	WServerUser.Assign(ServerUser);
    	_bstr_t WServerPassword;
    	WServerPassword.Assign(ServerPassword);
    
    	//Login to Database
    	pNewConnection->ConnectToServer(NULL, WServer, 7331);
    	pNewConnection->get_Errorcode(&val);
    	pNewConnection->CheckAdmin(WServerUser,WServerPassword,2);
    	pNewConnection->get_Errorcode(&val);
    
    	//User Info
    	BSTR UserIDdel = SysAllocString(L"1234");
    	_bstr_t WUserIDdel;
    	WUserIDdel.Assign(UserIDdel);
    
    	//Process User Data
    	pNewObject->DeleteUserInfoByUserID(WUserIDdel,1);
    	pNewObject->get_Errorcode(&val);
    
    	//Disconnect from Server
    	pNewConnection->DisconnectServer();
    	pNewConnection->get_Errorcode(&val);
    
    	//Release Interfaces
    	pNewObject.Release();
    	pNewConnection.Release();
    	CoUninitialize();
    

    Das Problem: Versuche ich DeleteUserInfoByUserID auszuführen, dann bekomme ich eine Unhandled exception: 0xC0000005.
    Bis dahin funktioniert alles bestens, es wird zum Server verbunden (was ich daran merke, dass bei falschen Zugangsdaten ein Errorcode in der Variablen val ausgegeben wird).

    Der Fehler tritt in der generierten accessmanager.tli in der zweiten Zeile auf:

    inline HRESULT IUserInfo::DeleteUserInfoByUserID ( _bstr_t UserID, VARIANT_BOOL bForce ) {
        HRESULT _hr = raw_DeleteUserInfoByUserID(UserID, bForce);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return _hr;
    }
    

    Jetzt meine Frage: Liegt der Fehler an der falschen Initialisierung der Interfaces oder vielleicht doch eher an einer ganz anderen Stelle. Ich habe, um ehrlich zu sein, zuvor noch nie mit COM Programmierung zu tun gehabt und die Tutorials und Hilfen, die ich in den letzten zwei Tagen gelesen habe, helfen mir leider nicht mehr weiter mein Problem zu lösen.

    Vielen Dank für die Hilfe.

    Schöne Grüsse,
    m.g.


  • Mod

    Wenn Du nicht ein Stück Fehlerprüfung einbaust, weißt Du doch in keiner Weise ob die Zeiger gültig sind, die Du bekommst.
    Hat denn das Erzeugen von pNewObject geklappt?

    Ansonsten einen _bstr_t kannst Du direkt zuweisen.

    _bstr_t WUserIDdel(L"1234");
    


  • Hallo,

    Danke für den Hinweis mit _bstr_t.
    Die Variable hr vermeldet durchgehend "S_OK". Die Fehlerrückgabe der typelib meldet auch keine Fehler. Fehlerabfrage dieser Variablen habe ich mir gespart, ich beobachte manuell. Der Code ist nur zum testen da. Das Erzeugen des Zeigers hat anscheinend geklappt, da folgendes funktioniert:

    //User Info
    	BSTR UserID = SysAllocString(L"0026");
    	BSTR res_UserID;
    
    	//Process User Data
    	pNewObject->put_szUserID(UserID);
    	pNewObject->get_Errorcode(&val);
    	pNewObject->get_szUserID(&res_UserID);
    	pNewObject->get_Errorcode(&val);
    

    Es funktionieren alle put_ und get_ Funktionen von IUserInfo. Von den restlichen leider keine einzige. Ich bekomme immer eine Unhandled exception: 0xC0000005. Ich bin hier leider echt überfragt. 😕

    Schöne Grüsse,
    m.g.



  • Hallo,

    Ich hab den Fehler mittlerweile einschränken können. Die Exception tritt immer dann auf, wenn ich versuche in die Datenbank zu schreiben. Ein VC++6.0 Projekt mit dem gleichen Code meldet einen Fehler in einer DLL, die ich gar nicht direkt in meinem Projekt verwende. Daher bin ich mir mir schon gar nicht mehr sicher, ob der Fehler überhaupt in VC++ liegt oder irgendwelche anderen Komponenten nicht zusammenspielen (obwohl es in VB6.0 Problemlos funktioniert...). Ich bin jetzt dazu übergegangen direkt und ohne Umwege über die COM-DLL in die Datenbank zu schreiben. Damit ist mein Problem gelöst.

    Schöne Grüsse,
    m.g.


Log in to reply