Import einer C++ dll in C



  • Moin,

    danke erstmal. Nein das Programm nach C++ zum zustricken kommt nur als allerletzte Lösung in Frage. Ist wahrscheinlich auch gar nicht möglich da ich in dem Programm ein API verwende für die der Hersteller nur C als Entwicklungssprache unterstützt.

    Mit LoadLibrary und GetProcAdress hab ich noch nicht probiert - Hast jemand ein einfaches Beispiel?

    Mein Hauptverdacht ist eigentlich, dass man eine .lib für C braucht. Die ich habe wird wahrscheinlich für C++ sein. Kann das jemand bestätigen? Wie kann ich die .lib für C erzeugen?

    Danke und Gruß,

    Ralf



  • Ich kenne mich mit dem Thema nicht aus, aber soweit ich weiß, sollte es auch in C ein einfacher Aufruf von LoadLibrary tun:

    HINSTANCE hDll = LoadLibrary("NAME-DER-DLL");
    

    Hab gerade mal in der MSDN geschaut:
    http://msdn2.microsoft.com/en-us/library/64tkc9y5(VS.80).aspx

    da solltest du was finden.

    Du brauchst natürlich dann

    #include<windows.h>
    


  • C++ ist (naja fast) eine Erweiterung von C, also kannst du nahezu alle Sachen, die du in C machen konntest, auch noch in C++ erledigen (insbesondere ist es kein Problem, eine C-API in einem C++-Programm zu verwenden*).

    * du mußt nur wissen, wie die Funktionen angesprochen werden müssen - und eventuell die Umwandlung zwischen C-Daten und C++-Daten (z.B. char* vs. std::string) kapseln.



  • CStoll schrieb:

    C++ ist (naja fast) eine Erweiterung von C, also kannst du nahezu alle Sachen, die du in C machen konntest, auch noch in C++ erledigen (insbesondere ist es kein Problem, eine C-API in einem C++-Programm zu verwenden*).

    * du mußt nur wissen, wie die Funktionen angesprochen werden müssen - und eventuell die Umwandlung zwischen C-Daten und C++-Daten (z.B. char* vs. std::string) kapseln.

    Okay. Wie gesagt wenn alle Stricke reißen. Ich fürchte nur das ist deutlich mehr Aufwand.

    Gruß Ralf



  • SALOMON schrieb:

    Ich kenne mich mit dem Thema nicht aus, aber soweit ich weiß, sollte es auch in C ein einfacher Aufruf von LoadLibrary tun:

    HINSTANCE hDll = LoadLibrary("NAME-DER-DLL");
    

    Hab gerade mal in der MSDN geschaut:
    http://msdn2.microsoft.com/en-us/library/64tkc9y5(VS.80).aspx

    da solltest du was finden.

    Hmm, ist halt ein anderer Weg. Funktioniert im Moment nicht da ich keine .def Datei habe. Danke für den Link

    Gruß Ralf



  • Die .def Datei sollte kein Problem sein. Du musst nur eine leere .def Datei erstellen und in den Projekteigenschaften des Linkers die def Datei einstellen und fertig.

    Aber abgesehen davon, würde ich meine Applikation auch eher mit C++ erstellen als mit C.



  • SALOMON schrieb:

    Die .def Datei sollte kein Problem sein. Du musst nur eine leere .def Datei erstellen und in den Projekteigenschaften des Linkers die def Datei einstellen und fertig.

    Na leer sollte sie nicht sein oder? Da muss schon was drinstehen.

    LIBRARY   TestDLL
    EXPORTS
       Get_Test   @1
    

    hab ich mal erstellt. Wo gebe ich die den im Linker an?

    SALOMON schrieb:

    Aber abgesehen davon, würde ich meine Applikation auch eher mit C++ erstellen als mit C.

    das hat man davon wenn man im C++ forum fragt 😉

    Danke und Gruß,

    Ralf



  • Ja immerhin ist C++ eine Weiterentwicklung von C.

    Ich hab Visual Studios gerade nicht da, aber du solltest es da finden:
    Rechtsklick auf dein Projekt im Projektmappenexplorer => Eigenschaften => Linker.

    Da einfach nach "Moduldefinition" (Deutsche Version) suchen.



  • ist die Funktion als extern "C++" deklariert? Bzw. besser wäre, wenn du sie als extern "C" exportierst und für cpp programm auch mit extern "C" importierst.
    Also sowas:

    #ifdef ICH_EXPORTIERE
    #define MEINEAPI  __declspec(dllexport)
    #else  // sonst import
    #define MEINEAPI  __declspec(dllimport)
    #endif
    #ifdef __cplusplus
    extern "C"
    {
    #endif
        MEINEAPI  void foo(void);
        MEINEAPI  void bar(void);
    #ifdef __cplusplus
    }
    #endif
    

    MfG
    DDR-RAM



  • Ja kann auch sein, ich kenne mich damit nicht aus.

    Ich habe daber trotzdem bei Google mal danach gesucht ('extern "C"') und das erste, was ich fand war das:

    Und noch eine Anwendung für die Speicherklasse extern. Eine besondere Form der extern-Anweisung ist die Anweisung extern "C". Wollen Sie von einem C++ Programm aus auf Funktionen zugreifen, die mit einem C-Compiler (nicht C++ Compiler!) übersetzt worden sind, so müssen Sie diese Funktionen als extern "C" Funktionen kennzeichnen.

    Also sollte das nicht funktionieren, oder?



  • pfff.

    gelöst.

    Ich musste nur noch aus der obigen .def mit lib /DEF:testdll.def eine neue lib bauen dann ging der ganzen Rotz (wie in meinem ersten Post beschrieben).

    Ich vermute es ist weniger C/C++ spezifisch sondern hängt am Compiler (die DLL ist mit 6.0, meine App mit 7.0 übersetzt).

    Danke an Alle!

    Gruß Ralf


Anmelden zum Antworten