wxDev-C++ 7.3.1.3 DLL-Funktionen erstellen und in anderen C-Quellcode einbinden



  • Hallo an alle Kundigen des Compilers wxDev-C++.

    Ich möchte mit dem Compiler wxDev-C++ 7.3.1.3 DLL-Funktionen erstellen, die ich dann in anderen C(++) Programmen aufrufen kann.

    Bis jetzt habe ich vergebens versucht eines der älteren DLL-Beispiele (siehe unten) für den wxDec-C++ nach zu programmieren. Das Compilieren bricht ab mit: syntax error before "extern" in Zeile 14 von dll.h; eventuell wurden MAKRO im Laufe der Entwicklung des wxDev-C++ geändert?

    Ich würde mich freuen, wenn einer der Kundigen alle C- und Header-Dateien von einem einfach nach zu programmierendes DLL-Beispiel (DLL erstellen und DLL einbinden) hier ins Forum stellen würde. Das versuche ich dann mit dem wxDev-C++ 7.3.1.3 nach zu programmieren und nach zu vollziehen.

    So ein aktualisiertes Beispiel mit allen C- und Header-Dateien ist sicher hilfreich für viele "Unkundige".

    Der von mir angefügte Beispiel-Code zeigt, dass die Erstellung von C-DLL bzw. C++ DLL für mich noch eine große Frage ist.

    Ich freue mich auf Eure Antwort.

    Schöne Grüße,

    BeFu
    P.S.: Die DLL-Funktion, z.B. double sub(double a, double b); , sollte möglich in ein Konsolenanwendung eingebunden werden, da ich ziemlich unerfahren in Windows-Programmierung bin. - Danke.

    P.P.S.: C(++)-DLL-Funktionen sind teilweise als Wrapper-Funktionen für DLL-Funktionen von Anwendungen nötig, deren Parameter in LabVIEW weiter bearbeitet werden ... LabVIEW-Tutorien findet Ihr z.B. unter http://www.fu-net.de/lv/

    Die nachfolgenden C-Code-Dateien liegen in

    ..\projects\DLL_test\dll.h:

    #ifndef _DLL_H_
    #define _DLL_H_
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    /* 3. Wieso steht hier DLLIMPORT für die in dllmain.c definierte Funktion HelloWorld()  */
    /*    und nicht DLLEXPORT ? DLLIMPORT würde ich erst im Quellcode verwenden, in dem     */
    /*    eine Funktion aus der DLL aufgerufen wird                                         */
    DLLIMPORT void HelloWorld (void); 
    
    /* Deklaration der DLL-Funktion add2num() :*/
    DLLEXPORT extern "C" __declspec(dllexport) __stdcall double add2num(double a, double b);
    
    #endif /* _DLL_H_ */
    

    ..\projects\DLL_test\dllmain.c:

    /* Replace "dll.h" with the name of your header */
    #include "dll.h"
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    DLLIMPORT void HelloWorld ()    /* Standardmäßig von wxDev-C++ angelegt */
    {                               /* 1. Wozu dient das? MassgeBox nur auf Windows-API möglich, oder? */          
        MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
    }
    
    /*----- eigene DLL - Funktion aus CPPDLL-Tutorial von VitalDragon ---*/
    
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        /* Standardmäßig von wxDev-C++ angelegt */
        /* 2. Wozu dient der switch-Konstrukt? Müssen in den Switch-Cases DLL-Funktionen aufgerufen werden? */
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    
    /* extern "C" __declspec(dllexport) __stdcall double add2num(double a, double b); */
    /* Diese Deklaration der DLL-Funktion add2num() steht in dll.h */
    
    /* Hier die Definition der DLL-Funktion add2num() */
    extern "C" __declspec(dllexport) __stdcall double add2num(double a, double b)
    {
        return a+b;
    }
    

    ..\projects\DLL_Aufruf\main.c:

    #include <stdio.h>
    #include <stdlib.h>
    
    /* #include "..\DLL_test\dll.h" */ 
    /* Auskommentiert, da sonst DLL_Aufruf nicht startet mit Message "Invalid argument"     */
    /* Das ist eigentlich klar, da ja das Compilieren der DLL mit Fehlermeldung abbricht    */
    int main(int argc, char *argv[])
    {
      double num1, num2, erg;
    
      num1= num2= erg= 0,0;
      printf("Bitte zwei Zahlen eingeben; diese werden addiert\n");
      printf("Bitte Zahl1 eingeben: ");
      scanf("%lf", &num1);
      printf("Bitte Zahl2 eingeben:");
      scanf(" %lf", &num2);
      /* 5. Wie rufe ich die DLL-Funktion "double add2num(double, double);" auf?            */
      /* 5.1. Da gibt es ja die Möglichkeit des so genannten statischen Aufrufs oder        */
      /* 5.5  des dynamischen Aufruf, oder?                                                 */
      /* erg= add2num(num1, num2);  <-- wo muss der Code mit __declspec (dllimport) stehen? */
      printf(" %lf + %lf= %lf\n\n", num1, num2, erg);
      system("PAUSE");	
      return 0;
    }
    

Anmelden zum Antworten