mikrocontroller.net

Forum: PC-Programmierung COM Module could not create Instance


Autor: Marcus W (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: René König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marcus W (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: René König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.