Erstellen und einbinden einer DLL



  • Hat funktioniert jetzt linkt das Programm. Beim Aufruf der DLL Funktion gibt es jedoch einen Laufzeitfehler:

    Debug Assertion Failed
    File: appcore.cpp
    Line: 235
    ....

    Langsam hab ich ein schlechtes Gewissen weil ich keinen einzigen Schritt alleine schaffe 😡 . Ich bin dir wirklich sehr dankbar.

    Ich hab aber gemerkt das das ganze einfach zu kompliziert ist für mich. Deshalb versuch ich jetzt eine Variante ohne MFC nur ein simples Min32-Projekt.

    Hier mein Code (ich hab versucht alles so einfach wie möglich zu machen):

    //[b]DLL C-File[/b] 
    //LIB.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
    
    #include "stdafx.h"
    #include "windows.h"
    #include "lib.h"
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {    return TRUE;    }
    
    RundDLL::RundDLL() {}
    
    int Funktion()
    {    return 5; }
    
    //[b]DLL Header-File[/b]
    //lib.h
    
    #ifdef _cplusplus
    #define DllExport extern "C" __declspec(dllexport)
    #else
    #define DllExport __declspec(dllexport)
    #endif
    
    class DllExport RundDLL 
    {
    public:
    	RundDLL();
    	int Funktion();
    };
    
    //[b]Testprogramm[/b]
    ...
    #include "TEST.h"
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    
    	int g = RundDLL().Funktion(); //eingefügt
    ....
    
    //[b]Testprogramm Header File[/b]
    #pragma once
    
    #include "resource.h"
    
    #define DllImport __declspec( dllimport ) 
    class DllImport RundDLL 
    {
    public:
    	RundDLL();
    	int Funktion();
    };
    

    Jetzt hab ich wieder ein unaufgelöstes Symbol 😞

    ....
    Kompilieren...
    TEST.cpp
    Verknüpfen...
    TEST.obj : error LNK2019: Nicht aufgelöstes externes Symbol '"__declspec(dllimport) public: int __thiscall RundDLL::Funktion(void)" (__imp_?Funktion@RundDLL@@QAEHXZ)', verwiesen in Funktion '_WinMain@16'
    Debug/TEST.exe : fatal error LNK1120: 1 unaufgelöste externe Verweise
    .....

    🙄



  • Existiert in deinem DLL-Projekt eine *.def - Datei ?



  • Nein eine .def Datei hab ich nicht. Aber es sollte auch ohne sowas gehen wenn ich das richtig verstanden habe.



  • is nich kompliziert... man muss sich nur dran gewöhnen
    du hast es sogar fast geschafft 🙂

    int Funktion()
    {    return 5; }
    
    muss heissen 
    
    int RundDLL::Funktion()
    {    return 5; }
    

    dann noch folgendes:
    -öffne dein tesprogramm
    -rechtsklick im arbeitsbereich->add files to folder->füg aus dem Debug/Release ordner deiner dll die datei dllname.lib hinzu

    jetzt sollte es tun

    edit: ja geht ohne def
    wobei ich defs einfacher finde



  • Ich hab es ohne diese *.lib Datei versucht aber dann findet er den Entrypoint nicht. Muss diese Datei immer im gleichen verzeichnis liegen wie die DLL damit es funktioniert?

    Was hat diese *.lib für eine Funktion?



  • die lib muss du mit deinem programm linken
    zur laufzeit brauchst du die lib nich

    in der lib stehen infos über die dll damit das programm weiss welche funktionen verfügbar sind und wie es sie aufrufen kann

    die dll muss entweder im gleiche verzeichnis wie die exe(falls aus vc gestartet reicht auch das projektverzeichnis), in windows/system32 oder in nem ordner der in der PATH umgebungsvariable angegeben is



  • Wenn ich nun aber eine DLL gebrauchen möchte, von der ich den Sourcecode und die *.lib Datei nicht habe sonder nur die fertige DLL? Wie kann ich dann trotzdem auf die Funktionen zugreifen?



  • in etwa so

    typedef int(func*)(int) libfunc;
    
    //dll laden
    HANDLE Lib=LoadLibrary("libname.dll");
    //funktion laden
    libfunc Func=(libfunc)GetProcAddress(Lib);
    //funktion aufrufen
    Func(100);
    


  • Super hat funktioniert ich hab jetzt eine eigene DLL 😃

    Aber jetzt nochmal zu der DLL bei der ich kein *.lib File habe. Ich habe eine Funktion die wie folgt definiert worden ist.

    __declspec(dllexport) int GetDefaultPrinter( char *buffer, int len );

    Mein Code dazu um die Funktion aus der DLL zu laden sieht nun wie folgt aus:

    HINSTANCE hLib = LoadLibrary("MSDPrintDll.dll");
    
    typedef int (WINAPI *PFN_PRINTER)(char*, int);
    PFN_PRINTER pfn_printer = (PFN_PRINTER) GetProcAddress(hLib, "GetDefaultPrinter");
    
    char * text = "";
    int i = pfn_printer(text, 5 );
    

    Beim kompilieren hat er kein Problem ... läuft alles glatt. Wenn ich das Programm laufen lasse, kommt jedoch folgender Laufzeitfehler:

    Run-Time Check Failure #0 - The value of ESP was not properly saved
    across a function call.  This is usually a result of calling a function
    declared with one calling convention with a function pointer declared with a
    different calling convention.
    

    Ich bin mir aber sicher, dass der Funktionskopf stimmt! 😕



  • #define WINAPI __stdcall

    __stdcall is die standard aufrufkonvention von windows
    entweder du schreibst es bei export und import oder bei keinem von beiden


Anmelden zum Antworten