DLL Funktion kann nich Aufgerufen werden?
-
Hallo Zusammen,
habe mir folgende DLL Datei erstellt.
extern "C" _declspec(dllexport) int _stdcall TestDll(double TS) { return 112; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }und will die erstellte DLL Datei "TDLL.dll" in einer Konsolenanwendung starten und zwar folgendermaßen:
#include "stdafx.h" #include <windows.h> #include <winbase.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { typedef UINT (CALLBACK* LPFNDLLFUNC1)(double); HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer hDLL = LoadLibrary("TDLL.dll"); if (hDLL != NULL) { lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "_TestDll"); if (!lpfnDllFunc1) { // handle the error FreeLibrary(hDLL); return -1; } else { // call the function int rc = lpfnDllFunc1(111.0); } }Der Funktionszeiger "lpfnDllFunc1" sagt mir es wird keine Funktion gefunden. Und die Bibliothek wird mit FreeLibrary freigegeben.
Unter den .NET C# kann ich auf die Funktion zugreifen. Wo kann der Fehler liegen?
THX
-
Guck doch mal mit dem Depencies Walker nach unter welchem Namen die Funktion exportiert wurde, denn manchmal werden sie vollkommen anders expoprtiert als du es willst (zum Beispiel aus der Funktion "Testabcxyz" kann "???__?@Testabcxyz" werden)
-
Hallo jeanlebon
kannst du mir sagen was der Depencies Walker ist, ein externes Tool?
Oder wie Funktionier das ganze?
-
der walker ist ein tool das beim visual studio dabei ist oder http://www.dependencywalker.com/
so müsste es gehen
int _tmain(int argc, _TCHAR* argv[]) { typedef int (*LPFNDLLFUNC1)(double); // int nicht unsigned int / warum auf callback casten ? HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer hDLL = LoadLibrary("TDLL.dll"); if (hDLL != NULL) { lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "TestDll"); // ohne underline if (!lpfnDllFunc1) { // handle the error FreeLibrary(hDLL); return -1; } else { // call the function int rc = lpfnDllFunc1(111.0); } }
-
Hallo,
danke für die Vorschläge. Mit den Dependency Walker habe ich den Namen der Funktion herausgefinden "_TestDll@4". Jetzt kann ich auf die Funktion zugreifen. Nur frage ich mich ist das denn so richtig. Das kann doch nicht sein das ich ein externes Tool benötige um den Namen meiner selbst erzeugten Funktion herauszufinden. Oder woran liegt das und muss man da etwas einstellen?
-
nein du brauchst kein externes tool, ist nur dazu gedacht um deine dll zu überprüfen. einstellen musst du auch nix.
es geht also nicht so wie ich beschrieben habe ?
-
Nein, nur wenn ich den kompletten Namen "_TestDll@4" eingebe. Schreibe ich "TestDll", dann ist der Funktionszeiger NULL!
Ist da was Falsch in der DLL. Wie gesagt mit den C# kann ich "TestDll" eingeben
und das ganze Funktioniert!