Also zu meinem Problem: Ich hab ne VB6.0 DLL und die habe ich in mein C++ Programm eingebunden. Funktioniert auch Prima kann auf alle Funktionen der DLL zugreifen. Nur sobald sich in der DLL etwas an der COM Schnittstelle am Interface ändert. Bekomm ich in der C++ Anwendung Folgende Fehlermeldung: "COM module could not create instance and cannot be used. REGDB_E_CLASSNOTREG " Eine Klasse die die DLL an meinem System anmeldet und abmeldet hab ich schon geschrieben Daran liegt es also nicht.
> Eine Klasse die die DLL an meinem System anmeldet und abmeldet hab > ich schon geschrieben Du mußt die Methode zum Anmelden auch aufrufen. Fakt ist jedenfalls, daß Du ein nicht registriertes COM-Object benutzen willst. Zum Registrieren benötigst Du übrigens administrative Rechte. Kann es vielleicht sein, daß das Anmelden fehlschlägt, weil Dir Berechtigungen fehlen?
Nein bin schon Admin hier. Und ich hab ja schon alles ausprobiert. Das reggen mit der console per regsvr32 funzt soweit meldet er zumin. und in der reg sieht man auch dir einträge der dll so wie die funktionen der Dll die Public sind. frmMain::frmMain(QWidget* parent, const char* name, bool modal, WFlags fl) : frmMainBase(parent, name, modal, fl) { HRESULT hr; CLSID clsid; m_sClsName = L"ALMO.clsContent"; RegisterComponents(); //Mein Register u Unregister hr = CoInitialize(NULL); if(FAILED(hr)) { QMessageBox::critical(this, "Error", "Failed to initialize COM."); return; } hr = CLSIDFromProgID(m_sClsName, &clsid); if(FAILED(hr)) { QMessageBox::critical(this, "Error", "COM module could not be identified."); return; } hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(IContent), (LPVOID*)&pAlmoContent); if(FAILED(hr)) { QString res; if(hr & REGDB_E_CLASSNOTREG) res += "REGDB_E_CLASSNOTREG"; else if(hr & CLASS_E_NOAGGREGATION) res += "CLASS_E_NOAGGREGATION"; else if(hr & E_NOINTERFACE) res += "E_NOINTERFACE"; else res += "Unknown"; QMessageBox::critical(this, "Error", tr("COM module could not create instance and cannot be used. Reason: %1").arg(res)); pAlmoContent = NULL; return; } Falls dir das hilft ... vieleicht initialisiere ich sie ja auch falsch.
1) Während der Regisrierung muß die COM-Runtime bereits initialisiert sein. Dein CoInitialize-Aufruf kommt einen Tick zu spät. 2) Das hier funktioniert aber überhaupt nicht: if(hr & REGDB_E_CLASSNOTREG). In "hr" bekommst Du einen ErrorCode zurück, keine Bitflags. Mich würde aber der genaue Wert interessieren. Zum Übersetzten in einen String kannst Du übrigens auch die API-Funktion FormatMessage verwenden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.