wxDev-C++ 7.3.1.3: DLL in C (oder C++) erstellen; DLL-Funktion einbinden

Hallo deepthroat,

danke für Deine schnelle Erlärung meiner Fehler.
Leider klappt's noch immer nicht.

Als erstes hier mein aktueller Code; darin nutze ich nun DLLIMPORT, wie von Dir empfohlen.

..\projects\DLL_test\dll.h:
C:
#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 */

DLLIMPORT void HelloWorld (void); 

/* Deklaration der DLL-Funktion add2num() :*/
DLLIMPORT __stdcall double add2num(double a, double b);

#endif /* _DLL_H_ */

..\projects\DLL_test\dllmain.c:
C:
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DLLIMPORT void HelloWorld ()    /* Standardmäßig von wxDev-C++ angelegt */
{                               
    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. */ )
{
    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;
}

/* Hier die Definition der DLL-Funktion add2num() */
DLLIMPORT __stdcall double add2num(double a, double b)
{
    return a+b;
}

Für dll_test (DLL-Funktionen) habe ich in wxDevC++ folgendes unter "Project Options" eingestellt:
Additional Command-line options: Preprocessor Definitions: BUILDING_DLL=1
Standardmäßig ist dort "Directories" eingestellt: C:\...\projects\DLL_test\Output\MingW

Compilieren und Build der DLL-Datein erfolgen ohne Fehler, mit folgenden Ausgabedateien:
DLL_test.dll, dllmain.o und libDLL_test.a

Die DLL-Funktion add2num() möchte ich nun in main.c aufrufen.
Dazu habe ich für main.c in wxDevC++ folgendes unter "Project Options" eingestellt:
Additional Command-line options: Preprocessor Definitions: BUILDING_DLL=0
Als Library Directories habe ich: C:\Program Files\Dev-Cpp\projects\DLL_test\Output\MingW
Unter "Project Options" kann ich bei Additional Command-line options: Linker: Add Library or Object kein DLL_test.lib eingeben, da es beim REBUILD ALL der DLL-Dateien nicht erzeugt worden ist.

Was mache ich da noch falsch?

..\procjects\DLL_Aufruf\main.c:
C:
#include <stdio.h>
#include <stdlib.h>

#include "..\DLL_test\dll.h" /* Damit müsste in main.c doch die DLL-Funktion        */
                             /* double add2num(double a, double b) bekannt sein?    */

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);
                                                            
/* Die DLL-funktion add2num() ist in main.c noch immer nicht bekannt :-( */ 
erg= add2num(num1, num2); 
  printf(" %lf + %lf= %lf\n\n", num1, num2, erg);
  system("PAUSE");	
  return 0;
}

Ich freue mich auf Eure weiter Hilfe; langsam verstehe ich die Zusammenhänge der DLL-Programmierung in C; jedoch leider bei weitem noch nicht alles ...

Schöne Grüße,

BeFu
 
Hi.
Compilieren und Build der DLL-Datein erfolgen ohne Fehler, mit folgenden Ausgabedateien:
DLL_test.dll, dllmain.o und libDLL_test.a
Die libDLL_test.a ist die Import-Bibliothek.

Üblicherweise fügt man einfach das Verzeichnis in dem sich die Bibliothek befindet unter zusätzliche Linker-Verzeichnisse hinzu und trägt dann einfach die Bibliothek ohne den Präfix "lib" und ohne Endung (also in dem Fall einfach "DLL_test") als zusätzliche Bibliothek ein.

Die DLL muß zur Laufzeit natürlich verfügbar sein. Z.B. indem du die DLL in dasselbe Verzeichnis wie das Programm kopierst.

Gruß
 
Hallo deepthroat,

in wxDevC++ habe ich bei main.c unter Project obptions eingestellt:

Additional Command-line options: Add Library or Object: ../DLL_test/Output/MingW/libDLL_test.a

Das REBUILD ALL des main.c funktioniert ohne Fehler.

Bei COMPILE & RUN erhalte ich die Fehlermeldung:
"DLL_Aufruf.exe - Komponente nicht gefunden
Die Anwendung konnte nicht gestartet werden, weil DLL_test.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."

Was mache ich da noch falsch?

Danke für die Hilfe!

Schöne Grüße,

BeFu
 
Hallo deepthroat,

ich denke, dass beim wxDevC++ zwischen statischer und dynamischer Einbindung von (DLL-)Funktionen unterschieden wird.

Ich versuche gerade Deinen Vorschlag, die vom wxDevC++ bereit gestellte HelloWorld() DLL-Funktion in einem externen main.c aufzurufen.

Bei Auswahl des Projektes ist wählbar zwischen "Satic Library" und "DLL". Ich versuch's nun noch ein Mal mit "DLL". Für meine Zwecke muss ich ja in der Lage sein so geannten Wrapper-Funktionen als DLL in C zu programmieren.

Vielleicht musst Du oder ein anderer Kundiger mich doch noch in die Geheimnisse einweihen wie mit dem wxDevC++ C-DLL in C-Projekten eingebunden werden.

Danke für Eure Hilfe.

Schöne Grüße,

BeFu
 
Hallo deepthroat,

langsam bin ich mit meinem Latein am Ende.
Auch das Einbinden der *DLL*.lib in das oben beschriebene Beispiel-Projekt bringt beim Start-Versuch die System-Fehlermeldung:
"DLL_Aufruf.exe - Komponente nicht gefunden
Die Anwendung konnte nicht gestartet werden, weil DLL_test.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."

..\C_DLL\DLL_V2\dll_v2.h:
C:
#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 */

DLLIMPORT void HelloWorld (void);

#endif /* _DLL_H_ */

..\C_DLL\DLL_V2\dllmain.c:
C:
#include "dll_v2.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DLLIMPORT void HelloWorld ()
{
    MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    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;
}

..C_DLL\DLL_V2_Aufruf\main.c:
C:
#include <stdio.h>
#include <stdlib.h>
#include "..\DLL_V2\dll_v2.h"

int main(int argc, char *argv[])
{
  HelloWorld();
  system("PAUSE");	
  return 0;
}

BUILDING_DLL habe ich im jeweiligen Project-Menu definiert, wie von Dir vorgeschlagen.

Was mache ich da wohl noch falsch?

Danke für Eure Antwort.

Schöne Grüße,

BeFu
 
Bei COMPILE & RUN erhalte ich die Fehlermeldung:
"DLL_Aufruf.exe - Komponente nicht gefunden
Die Anwendung konnte nicht gestartet werden, weil DLL_test.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."

Was mache ich da noch falsch?
Du hast offenbar die DLL nicht in das Verzeichnis der DLL_Aufruf.exe kopiert.

Gruß
 
Zurück