COM-DLL importieren in C++ Projekt



  • Hallo,

    ich stehe zur Zeit vor der Herausforderung eine extern gekaufte DLL in unser Projekt einzubinden.

    Unser Projekt ist in C/++ geschrieben und ist als simples Win32 Projekt definiert.

    Die externe DLL bietet als Schnittstelle COM Methoden / Propertys. Sie liegt als .DLL und .Lib vor.

    Wenn ich nun stumpf nach der Anleitung vom DLL Hersteller vorgehe werde ich "gezwungen" das Projekt von

    "No Common Language Runtime support"
    auf
    "Common Language Runtime Support (/clr)" umzustellen um das COM Objekt via

    Rechtsklick aufs Projekt -> "Add References" | im neuen Fenster den Reiter "COM"

    in das Projekt einzubinden. Wenn ich diese Option nicht setze habe ich keine Möglichkeit ein COM Objekt einzubinden. Zumindest nicht über diesen Weg wird mir das nicht angeboten.

    Soweit ich weiß resultiert daraus aber das das Projekt in Managed C++ umgestellt wird. Das wäre nicht in meinem Interesse. Gibt es dafür andere Wege ein solches COM Objekt in ein bestehendes Projekt einzubinden?

    Eine Alternative die ich gefunden habe wäre folgendes:

    char buffer[4096];
    buffer[0] = 0;
    GetModuleFileName(NULL, buffer, 4096);
    
    HMODULE hDLL;
    
    hDLL = LoadLibrary("Name.dll"); // make sure that the path is full !!!
    if (hDLL != NULL){
      typedef HRESULT (CALLBACK *HCRET)(void);
      HCRET lpfnDllRegisterServer;
      lpfnDllRegister = (HCRET)GetProcAddress(hDLL, "DllRegister");
    
      if (lpfnDllRegister == NULL)
        ; // the com sever might be corrupt
    
      (*lpfnDllRegister )(); // cal the registration function
      FreeLibrary(hDLL);
    }
    else
     ; // the dll was not found
    

    Dort wird auf DllRegister() zugegriffen. Allerdings ist diese laut DLLViewer als "exported Function" deklariert

    DllRegister	0x0041d450	0x0001d450	3 (0x3)	xyz.dll	C:\xyz.dll	[b]Exported Function	[/b]
    

    Von interesse wären aber die COM-Propertys und COM Method´s aus dieser DLL.

    zB

    COMObjectName::Start			54 (0x36)	xyz.dll	C:\xyz.dll	COM Method
    

    Wo könnte ich hier mich weiter einlesen? Das meiste was ich gefunden habe geht von .NET Projekten in C# aus. Dort scheint der Import sehr einfach zu sein da es sich bereits um Managed Code handelt.



  • http://www.c-plusplus.net/forum/292979-full

    Eventuell hilft mir das weiter. Dort steht auch das ich einzelne Dateien auf managed umschalten kann. Das war mir vorher nicht bewusst..

    Zusatzfrage:

    Wie finde ich raus ob ich das .NET Framework dann mitausliefern muss?



  • DllImport schrieb:

    Wenn ich diese Option nicht setze habe ich keine Möglichkeit ein COM Objekt einzubinden. Zumindest nicht über diesen Weg wird mir das nicht angeboten.

    Weil dieses Menu dazu gedacht ist, analog zu VB und C#, COM-Objekte in .net Programme einzubinden.

    DllImport schrieb:

    Soweit ich weiß resultiert daraus aber das das Projekt in Managed C++ umgestellt wird.

    Das ist richtig.

    DllImport schrieb:

    Das wäre nicht in meinem Interesse.

    Warum machst du es dann ? COM ist keine .net Technologie, es kommt aus der nativen Windows Programmierung.

    Dein Problem scheint eher zu sein, dass du dich mit normaler Windows C++ Programmierung und der Bedienung von Visual Studio nicht auskennst.

    DllImport schrieb:

    Gibt es dafür andere Wege ein solches COM Objekt in ein bestehendes Projekt einzubinden?

    Natürlich, die WinAPI, den Compiler COM Support, die ATL, die MFC ...



  • DllImport schrieb:

    Wie finde ich raus ob ich das .NET Framework dann mitausliefern muss?

    Bei eingeschaltetem /clr wird das .NET Framework benötigt.

    Ich frage mich, ob Du nicht besser ein natives C++ Projekt machst und deine COM DLL via #import einbindest oder gleich C# und dann geht die COM Einbindung fast von selbst.

    Auf jeden Fall sehe ich kein Grund, warum das jetzt ausgerechnet C++/CLI sein muss - und ich würde die FInger davon lassen, wenn kein Grund besteht.

    Der von dir gezeigte (2.) Weg via GetProcAddress(..) halte ich nicht für zielführend - genausowenig wie Ansätze mit P/Invoke. COM ist dafür denkbar ungeeinet.



  • Ich habe mir jetzt mal die MSDN Einträge zu #import angeschaut und konnte dies nicht auf meinen Fall anwenden..

    Immer wenn ich die DLL via

    #import "dllname.dll" no_namespace
    oder
    #import "dllname.dll" rename_namespace("test")

    importiere kommt ein LNK Fehler

    2>dllname.lib : fatal error LNK1136: invalid or corrupt file

    Die entsprechenden .tlh und .tli Dateien liegen aber im /DEBUG Ordner vor.

    Die .Lib und .dll liegen auch in den passenden Ordnern.



  • Wenn Du eine LIB-Datei hast, warum brauchst Du dann COM????
    COM braucht man nur wenn man ein COM-Objekt hat... also eine dll oder ocx!


Anmelden zum Antworten