Problem mit eingener DLL und GetProcAddress
-
Hi,
Ich versuche mich gerade an Pluginfähigkeit meines derzeitigen Programmes aber irgendwie scheitere ich daran, eine Pluginfähige DLL zu erstellen. In meinem Programm versuche ich folgendermasen die Funktion zu importieren:
CString filetype = CExplorer::GetFileType(filename); filetype.MakeLower(); filetype.Delete(0); typedef void (CALLBACK* LPDTIFUNC)(char*,char*,char*); LPDTIFUNC GetFileTypeInfo = NULL; filetype+=".dll"; filetype = m_rootpath + "\\Dateityp DLL\\DI " + filetype; HMODULE dll = LoadLibrary(filetype); if (dll==NULL) { MessageBox("Die DLL konnte nicht geladen werden!", "Fehler", MB_ICONERROR); return; } GetFileTypeInfo = (LPDTIFUNC)GetProcAddress(dll, "GetFiletypeInfo"); if (GetFileTypeInfo==NULL) { MessageBox("Die Funktione GetFileTypeInfo konnte in der DLL nicht gefunden werden!", "Fehler", MB_ICONERROR); return; } char* param1; char* param2; char* param3; GetFileTypeInfo(param1, param2, param3);
und meine DLL Datei sieht folgendermasen aus
#include "stdafx.h" #if defined(_MSC_VER) || defined(__BORLANDC__) # define DLL_EXPORT __declspec(dllexport) # else # define DLL_EXPORT #endif BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } DLL_EXPORT void GetFiletypeInfo(char* filename, char* beschreibungen, char* infos) { filename = "Das ist ein Dateiname"; beschreibungen = "Auflösung"; infos = "Info"; return; }
Allerdings findet er die funktion GetFiletypeInfo über GetProcAddress einfach nicht. Der zeiger steht dann immer auf NULL. Ich würde mich sehr freuen wenn mir jemand helfen könnte.
Vielen dank im voraus
GeorgeHomes[ Dieser Beitrag wurde am 22.03.2003 um 17:56 Uhr von GeorgeHomes editiert. ]
-
Hau mal das DLL_EXPORT vor der Funktion weg. Vielleicht klappts ja dann.
-
extern "C" DLL_EXPORT void GetFiletypeInfo(....)
-
Hast du deine Dateien als .c oder als .cpp abgespeichert?
Bei letzterem: Schreib mal extern "C" vor die Funktion in der DLL.
-
Schau dir auch mal das Tool an. Damit kannst du gucken, ob die Funktion richtig exportiert wurde. http://www.dependencywalker.com
-
Und zusätzlich zum EXTERN_C, da hier scheinbar der VC verwendet wird, dem Projekt noch ein Def-File hinzufügen. Wenn das ausbleibt, schlägt das '__stdcall-Mangling' zu, die Funktion wird unter dem Namen _GetFiletypeInfo@12 exportiert. Der Inhalt des Def-Files kann kurz und knapp gehalten werden:
EXPORTS GetFiletypeInfo
-
Er hat die Funktion doch garnicht als __stdcall definiert, also brauch man das auch nicht.
-
Er hat die Funktion doch garnicht als __stdcall definiert, also brauch man das auch nicht.
Da ist was dran. <rausred> Jaja, die Gewohnheit ... </rausred>
Obwohl:
[cpp]typedef void (CALLBACK* LPDTIFUNC)(char*,char*,char*);[/cpp]
[ Dieser Beitrag wurde am 22.03.2003 um 18:51 Uhr von -King- editiert. ]
-
Aber da hab ich gleich mal eine Frage: Muss man __stdcall benutzen, wenn man die DLL in anderen Sprachen benutzen will?
-
tja, beim Zeiger schon, bei der Funktion dann aber nicht. Da wäre ihm das Programm dann wohl abgestürzt.
-
Muss man __stdcall benutzen, wenn man die DLL in anderen Sprachen benutzen will?
Ja. VB beispielsweise kann nichts anderes, AFAIK.
-
Vielen dank für die superschnellen und massigen Antworten. Das mit dem extern "C" hat gleicht funktioniert. Das Problem das die DLL's in anderen sprachen verwendet werden sollten besteht bei mir ja nicht da die DLL's nur als Plugin für meinen Explorer dienen. Da braucht kein anderes programm drauf zuzugreifen