Wie füge ich eine .def datei in meiner Dll ein



  • Hi,
    ich möchte mein Code gern als .dll kompilieren gut, funktioniert auch jedoch werden mir meine Funktionen nicht mit Dependendy Walker angezeigt.. weil ich ja eine .def hinzufügen muss wie mache ich das genau?

    Benutze Visual Studio 6

    MfG


  • Mod

    Indem Du sie anlegst und die entsprechenden Funktionen dort in der EXPORTS Sektion aufführst.
    Du kannst auch _declspec(export) verwenden.

    http://msdn.microsoft.com/de-de/library/d91k01sh.aspx
    http://msdn.microsoft.com/de-de/library/a90k134d.aspx



  • Verstehe das nicht so ganz, könntest mir ein Bsp. geben?
    Also export datei habe ich erstellt (export.def)
    darin steht:

    LIBRARY TestDll
    EXPORTS Funktion

    MfG


  • Mod

    Und was ist nun Dein Problem?
    Du hast eine Def Datei, nun sollte es auch eine Funktion mit dem Namen Funktion als extern "C" in Deinem Programm geben...



  • Mein problem ist ich weiss nicht wohin mit der .def datei...



  • Ich würde sie ins Projekt einfügen...



  • Habs hinbekommen... bloss heisst meine Funktion beim Aufruf der .dll anders als ich sie im Code genannt habe...warum?

    MfG



  • Weil Du etwas falsch gemacht hast.



  • Hi, was soll ich denn falsch gemacht haben... hier ein bsp wie ich das gemacht habe:

    _declspec(dllexport) double _stdcall Rechne(double Zahl1,double Zahl2)
    {
    double erg;
    erg = Zahl1 + Zahl2;
    return erg;
    }
    

  • Mod

    Wenn Du _declspec(dllexport) verwendest brauchst Du keine DEF Datei mehr!
    Du hast mit Sicherheit etwas falsch gemacht... :xmas1:

    http://msdn.microsoft.com/en-us/library/hyx1zcd3(VS.71).aspx

    There are three methods for exporting a definition, listed in recommended order of use:

    1. The __declspec(dllexport) keyword in the source code
    2. An EXPORTS statement in a .def file
    3. An /EXPORT specification in a LINK command

    All three methods can be used in the same program. When LINK builds a program that contains exports, it also creates an import library, unless an .exp file is used in the build.



  • Das von Martin erwähnte extern "C" fehlt.

    extern "C" _declspec(dllexport) double _stdcall Rechne(double Zahl1,double Zahl2) 
    { 
    double erg; 
    erg = Zahl1 + Zahl2; 
    return erg; 
    }
    

    Kleiner Tipp für die Zukunft: Bei Fragen immer möglichst viele Informationen zum Problem zur Verfügung stellen, dann kann auch leichter und schneller geholfen werden. Mit "es funktioniert nicht, warum?" kann kaum einer etwas anfangen.



  • Hi, deswegen habe ich ja das bsp. gegeben 🙂
    Okay nun heisst die Funktion in der .dll immer noch nicht genau wie die Funktion im source sondern: _Rechne@12

    Ist das normal oder....

    MfG



  • Probiere es mal ohne _declspec(dllexport):

    extern "C" double _stdcall Rechne(double Zahl1,double Zahl2) 
    { 
    double erg; 
    erg = Zahl1 + Zahl2; 
    return erg; 
    }
    


  • Dann zeigt mit Dependency Walker keine funktion mehr an, weil ja auch keine merh exportiert wird...

    MfG



  • das _declspec(dllexport) darfst du eigendlich so nicht benutzen, da du sonst den header nicht woanders benutzen kannst.

    Du musst das ganze in ein Makro kapseln, was je nachdem, ob der header vom eigenen source oder von fremden, entweder ein dllimport oder ein dllexport macht

    das wird normalerweise so gemacht, dass es einen defs.h gibt, der von jedem header des Projekts ein gebunden wird.
    und von einer pch.h, die von jedem sourcefiel eingebuden wird

    xyzdefs.h:

    #ifndef _XYZDEFS_H_
    #define _XYZDEFS_H_
    
    #ifndef XYZDECLSPEC
    #define XYZDECLSPEC _declspec(dllimport)
    #endif
    
    #endif
    

    xyzpch.h:

    #ifndef _XYZPCH_H_
    #define _XYZPCH_H_
    
    #define XYZDECLSPEC _declspec(dllexport)
    
    #endif
    

    deine funktionalen files sehen dann so aus:

    TolleKlasse.h

    #ifndef _TOLLEKLASSE_H_
    #define _TOLLEKLASSE_H_
    
    #include "xyzdefs.h"
    
    class XYZDECLSPEC TolleKlasse  // wenn man eine ganze klasse xportiert
    {
    
      public:
        static int tolleFunktion();
    }
    
    bool XYZDECLSPEC isKlasseToll(const TolleKlasse& i_tk); // einzelne funktion exportiert
    
    #endif
    

    TolleKlasse.cpp

    #include "xyzpch.h"
    #include "TolleKlasse.h"
    
    int TolleKlasse::tolleFunktion()
    {
      return 7;
    }
    
    bool isKlasseToll(const TolleKlasse& i_tk)
    {
      return true;  // TolleKlasse  ist immer toll
    }
    

    was passiert hier?
    wenn du den code übersetzt, wird die TolleKlasse.cpp übersetzt, welche zuerst (!!!) die pch einbindet, in dieser wird das Makro XYZDECLSPEC deklariert, so dass in der defs-headerdatei nix passiert und die Klasse exportiert wird (Es muss dafür kein extern c benutzt werden - insofern du nur funktionen exportierst ohne klassen, oder so, ist das natürlcih besser, da du die dll dann auch aus c-Code nutzen kannst)

    Wird nun in einem anderen Projekt dieses headerfile benutzt (wia #include "TolleKlasse.h") ist das XYZDECLSPEC noch nicht definiert und es wird zu einem dllimport.

    Dieser Mechanismus verhindert, dass man zwei headerdateien pflegen muss (eine zum Bauen der dll und eine zum benutzen).

    Edit:
    das 'xyz' in den Namen soll den Projektnamen darstellen. Es ist natürlich (essentiell) wichtig, dass das einbindene Projekt andere Bezeichnungen verwendet



  • xValveProX schrieb:

    Dann zeigt mit Dependency Walker keine funktion mehr an, weil ja auch keine merh exportiert wird...

    MfG

    Und was steht in der .def-Datei?


Anmelden zum Antworten