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