Forum: PC-Programmierung COM Module could not create Instance


von Marcus W (Gast)


Lesenswert?

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.

von René König (Gast)


Lesenswert?

> 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?

von Marcus W (Gast)


Lesenswert?

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.

von René König (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.