COM dll einbinden



  • Hallo zusammen,
    ich habe eine einfache DLL Datei und möchte diese mittels COM in mein Projekt einbinden, allerdings krieg ich es einfach nicht hin.

    1. Klassenassistent -> Neue Klasse -> Aus Typbibliothek, DLL ausgewählt und schon hatte ich die Klassen in meinem Programm, konnte dann auch Objekte erstellen, aber immer wenn ich auf Methoden Zugriff kamen Laufzeitfehler.

    2. #import "meinedll.dll" -> Hierbei enstand der selbe Fehler.

    Gibt es noch eine weitere möglichkeit die Dll einzubinden, bzw. muss ich noch weitere Schritte machen, bis ich sie verwenden kann ?!

    Ich habe in diesem Zusammenhang jetzt schon öfters von IUnkown und IDispatch gelesen, muss ich damit noch vorher was machen, bevor ich auf meine eingebungenen Klassen zugreifen kann ?

    Ich habe auch noch eine IDL Datei, aus dieser lässt sich allerdings leider keine header oder c-file erstellen. Ich habe bereits versucht aus der dll header und c file zu erstellen, geht auch nicht.

    Also ich komme zwar an die Klassen aus der dll ran, aber kann sie wegen Laufzeitfehlern leider nicht verwenden...

    danke im Vorraus
    -hever-



  • Die DLL die du einbinden willst. Handelt es sich dabei um eine "gewöhnliche" DLL oder eine COM-Komponente?? Ein "gewöhnliche" DLL kannst du NICHT mittels COM einbinden. Und aus einer COM-DLL kannst du keine Funktionen importieren.
    Eine "gewöhnliche" DLL exportiert eine Reihe von Funktion siehe User32.dll, Kernel32, u.a. Eine COM-DLL stellt COM-Objekte zur Verfügung siehe *.ocx.
    Also, was solls denn sein ??

    mfg JJ



  • Es handelt sich um eine COM Komponente. Da bin ich mir ziemlich sicher!

    -hever-



  • Ich kenn mich nicht so gut mit MFC aus. Hast du vor der Verwendung der Komponente ein COInitialize() aufgerufen und damit die COM-Library initialisiert? Bei welchem Aufruf genau entsteht der Fehler, wie lautet der Fehlertext bzw. die Fehlernummer? Wenn es geht vielleicht mit Code-Beispiel.

    mfg JJ



  • Hallo nochmal,
    ich arbeite mich gerade mühselig dahin CoCreateInstance zu verwenden. Ich habe die IDL Datei mittlerweile eingebunden (Projekt - Datei hinzufügen) und die DLL habe ich ebenfalls mit #import hinzugefügt. Jetzt hat er mir auch endlich einige neue header und c files erstellt.
    In der Klassenansicht sehe ich jetzt auch die normalen Klassen und diese IDL-Interfaces.

    Mein aktuelles Problem:

    ICustomer *customer = NULL;
    HRESULT hr = CoCreateInstance(CLSID_Customer,NULL,CLSCTX_ALL,IID_ICustomer , (void**) &customer);
    

    Er kennt CLSID_Customer und IID_ICustomer nicht.

    error C2065: 'CLSID_Customer' : nichtdeklarierter Bezeichner
    error C2065: 'IID_ICustomer' : nichtdeklarierter Bezeichner

    Problem ist mir schon klar, nur ich kann die vom compiler erstellte header Datei nicht einbinden, weil er dann einige sachen neu schreiben möchte (Mehrdeutiges Symbol). (In dieser Datei sind die beiden Makros definiert) *grübel* n00b, so schwer kann des doch nicht sein...

    thx
    -hever-



  • Ok ok, ich hab die definition der beiden Makros nun noch woanders hin gepackt und das Programm startet... alerdings gibt es mir leider notOK aus:
    (hr = -2147221231)

    ICustomer *customer = NULL;
    	HRESULT hr = CoCreateInstance(CLSID_Customer,NULL,CLSCTX_ALL,IID_ICustomer, (void**) &customer);
    
    	if(SUCCEEDED(hr)){
    		AfxMessageBox("itsOK");
    	}
    	else{
    		AfxMessageBox("notOK");
    	}
    

    danke für die Hilfe
    -hever-



  • [edit] war Quatsch [/edit]



  • Hannst dir im Debugger den Fehlercode mit
    hr, hr
    angucken, oder das "Error Lookup" Tool im VC6-Menü verwenden
    (und COM error codes bitte bitte hexadezimal angeben)

    der Fehler ist "Class Factory kann angegebene Klasse nicht erstellen" - die DLL scheint also den CLSID_Customer nicht zu kennen. Sicher das DLL und IDL zusammenpassen?



    1. Guck erstmal, ob das DLL die 4 "Grundfunktionen" exportiert: DllGetClassObject, DllRegisterServer, DllUnregisterServer, und DllCanUnloadNow
      (z.B. mit Dependency walker)

    wenn nein --> kein (normales) COM-Objekt

    1. Checken ob das DLL ne Typelib enthält. OLE View starten, im Menü "View Typelib" wählen und di DLL öffnen. Wenn Fehler --> keine Typelib, müssen wir die woanders her bekommen

    2. lad mal die IDL irgendwo hoch und poste heir einen link. vielleicht fehlt nur der LIBRARY block, doer ein paar passende Includes

    1. ja sind drinne
    2. ja enthält sie, hab daraus auch mal IDLs erstellt
    3. Kannst du mir evtl deine Email Adresse schicken ?! Oder ICQ ?! Wäre dir sehr verbunden. (Ich lads gleich hoch)



  • Sonork:11378
    Trillian muß ich erst noch installieren und meine alten accounts wiederfinden (oder vielleicht besser nicht) ... 🕶



  • kewl, wie hast du das rausgefunden mit der Fehlermeldung MSDN oder Error Lookup?

    Mit ErrorLookup komm ich noch nicht so klar, hab ich gerade zum ersten mal ausprobiert und das Debuggen läuft zu Zeit ziemlich dumm, weil er immer wieder fragt ob er die Dateien die extern geändert wurden neu laden soll, so kommt man ja nicht weiter.

    Also die IDL Dateien die ich zu Zeit verwende gehören auf jeden Fall zusammen. Die waren bei der DLL dabei. Bzw. hab auch mal selbst welche aus der DLL erstellt.

    Ich find dich im ICQ nicht 😢

    Kann ich dir das Testprojekt mal für VC++ 6.0 schicken ?!

    Danke für die bisherige Hilfe
    -hever-



  • OK schick mal (hauptmannp@yahoo.com) aber versprochen wird nix 😉

    [edit] du findest mich nicht auf ICQ weil das ein Sonork-ID ist 😃 [/edit]



  • Hever schrieb:

    Ok ok, ich hab die definition der beiden Makros nun noch woanders hin gepackt und das Programm startet... alerdings gibt es mir leider notOK aus:
    (hr = -2147221231)

    ICustomer *customer = NULL;
    	HRESULT hr = CoCreateInstance(CLSID_Customer,NULL,CLSCTX_ALL,IID_ICustomer, (void**) &customer);
    
    	if(SUCCEEDED(hr)){
    		AfxMessageBox("itsOK");
    	}
    	else{
    		AfxMessageBox("notOK");
    	}
    

    danke für die Hilfe
    -hever-

    ClassFactory kann angeforderte Klasse nicht liefern

    versuch mal in einer Dos-Box in das Verzeichnis zu gehen wo deine dll ist und
    folgendes aufzurufen:

    regsvr32 *deinedll*
    

    Danach dürfte der Fehler nicht mehr kommen.

    Dieser Fehler sagt folgendes aus:



  • Stalin schrieb:

    versuch mal in einer Dos-Box in das Verzeichnis zu gehen wo deine dll ist und
    folgendes aufzurufen:

    regsvr32 *deinedll*
    

    Danach dürfte der Fehler nicht mehr kommen.

    Hab ich gerade gemacht, lief auch erfolgreich, nur leider kommt immer noch die selbst erstellte Fehlermeldung in der Aplikation. "hr" gibt immer noch den selben Wert zurück.



  • Dann versuchs doch mal, so dass du dir ein neues COM-Projekt mit dem Wizard machst und dort deine Klassen einbindest. Dann müsste es auf jeden Fall funktionieren.


Log in to reply