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; }