DLL Functionen exportieren

AdmiralX

Grünschnabel
hallo,

ich lese hier schon lange mit und habe auch schon viele tipps aus den thread bekommen.

diesmal konnte mir jedoch weder die foren suche noch google weiter helfen.

als compiler und IDE verwende ich jetzt visual studio 2005, zuvor habe ich mit embedde vc++ und vc 6 gearbeitet.

ich habe schon einige DLLs erstellt und sie auf die verschiedenste arten geladen, aber diesmal funktioniert einfach etwas nicht.

die DLL selbst ist in C geschrieben, aufrufen möchte ich sie aus einem Cpp programm.

zum laden der DLL und der funktionen verwende ich LoadLibrary bzw. GetProcAddress

mein problem ist daß ich mit GetProcAddress die funktion nicht laden kann da er den funktionsnamen nicht kennt, verwende ich den c++ namen so kann die funktion jedoch geladen werden.
ich bin mir sicher daß ich etwas übersehen habe und hoffe auf eure hilfe.

hier ein auszug aus dem code

DLL-header:
C:
#ifdef __cplusplus
extern "C" {
#endif


#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>


/** DLL export/import definitions */
#ifdef INTERFACE_EXPORTS
	#define I_API  __declspec(dllexport)
#else
	#define I_API __declspec(dllimport)
#endif

/** Calling Convention */
#define I_CALL WINAPI

I_API DWORD I_CALL OpenInterface(void);

#ifdef __cplusplus
}
#endif

und hier wie ich die dll/funktion lade:

C:
typedef DWORD (WINAPI *OPENINTERFACE)(VOID);
C:
OPENINTERFACE OpenInterface;
...
hIPMILib = LoadLibrary("interface.dll");
...
wenn ich
C:
OpenInterface = (OPENINTERFACE) GetProcAddress(hIPMILib,"OpenInterface");
verwende kann die funktion nicht gefunden werden

wenn ich
C:
OpenInterface = (OPENINTERFACE) GetProcAddress(hIPMILib,"_OpenInterface@0");
verwende wird die funktion richtig geladen und kann verwendet werden

die funktion steht auch in der dll mit dem namen "_OpenInterface@0"
aber nach der deklaration mit EXTERN "C" würde ich doch "OpenInterface" erwarten.

schon mal vielen dank
grüße
AdmiralX
 

AdmiralX

Grünschnabel
danke für eure antworten :)

MCoder hat gesagt.:
Ich würde eine .def-Datei verwenden und dort die zu exportierenden Funktionsnamen eintragen.
weißt du ob das vs 2005 werkzeuge dafür zur verfügung stellt? und funktioniert das auch wenn ich LoadLibrary verwende? muß gestehen ich habe noch nie über .def-dateien die namen verwendet.

Endurion hat gesagt.:
Das muß mit EXTERN "C" klappen. Prüf mal, ob #ifdef __cplusplus greift.
ja das greift, wenn ich in dem statement "absichtlich" falsch schreibe schreit der compiler, schon getestet *g*
selbst wenn ich das EXTERN "C" vor die funktion schreibe ändert das nichts.
wenn ich in den optionen einstelle, daß der c-compieler verwendet werden soll und nicht der c++ dann wird EXTERN "C" ignoriert, der funktionsname ist aber immer noch "falsch"


ich habe ja schon bald angst vor der lösung, das ist ganz sicher wieder so ein blödes problem wo ich mir dann ich den ar*** beisse und mich frage wie man nur soooo einen fehler machen kann...

[edit]
mit einer def-datei geht es, ich würde aber trotzdem gerne wissen warum es mit EXTERN "C" nicht geht
 
Zuletzt bearbeitet: