Funktion aus DLL ausführen
-
Hi, ich habe eine Frage zu DLLs. Wie kann man eine exportierte Funktion ausführen. Angenommen ich habe die Funktion Hallo() exportiert. Jetzt finde ich mit Hilfe von DEPENDS den Namen der Funktion in der DLL:
"?Hallo@@YAXXZ". Ich habe mir ein kleines prog zusammengestellt, das die datei sucht und die funktion sucht. Wenn ich das Programm starte, erhalte ich Info, dass das Prog. sowohl die DLL als auch die Funktion findet. Weiss Jemand, wie ich die Funktion nun ausführe ?Hier der Code des Progs. DLLstart.cpp
#include <windows.h> #include <iostream> using namespace std; HINSTANCE LoadMe; int main() { LoadMe = LoadLibrary("DLL.dll"); if (LoadMe != 0) cout<<"DLL geladen\n"<<endl; else cout<<"DLL nicht geladen\n"<<endl; if (!GetProcAddress(LoadMe,"?Hallo@@YAXXZ")) cout<<"Funktion nicht da\n"<<endl; else cout<<"Funktion gefunden\n"<<endl; system("PAUSE"); return 0; }[Ich brauche wirklich dringend Hilfe. In anderen Foren konnte mir bislang Niemand helfen.Ich will die Funktion Hallo() einfach ausgeführt bekommen
-
GetProcAddress liefert dir einen Funktionszeiger zurück.
-
Compy schrieb:
Ich brauche wirklich dringend Hilfe. In anderen Foren konnte mir bislang Niemand helfen.Ich will die Funktion Hallo() einfach ausgeführt bekommen
Muss man dazu nicht wenigstens die Deklaration der Funktion kennen? Schlagt mich, wenn ich mich täusche.

zwette
-
Hi,
die Funktion Hallo()
DLL.cpp
#include "DLL.h" #pragma once #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <iostream> using namespace std; DLL_API void Hallo() { cout<<"HALLO"<<endl; }DLL.h
#ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif DLL_API void Hallo();Reicht dir das so ?

Das sind Teile der Header und CPP-Dateien der DLL. Wie kann ich es machen, dass ich die Funktion Hallo() aus der DLL ausführe (also, dass "Hallo" erscheint) ?MFK, und wie kann ich es nun ausführen ?
-
ok, da hier niemand antwortet, denke ich, ihr wisst selbst leider net, wie man es lösen könnte.
Könnt ihr mir dann ein Programm und eine DLL schreiben ?
Die DLL soll die Funktion HalloWelt()beinhalten und exportieren. Das Programm soll auf die Funktion zugreifen und es soll am Bildschirm "Hallo" erscheinen. Nur damit ich es kapiere
Ich benutze Microsoft´s Visual C++.NET
Bitte schreibt Jamend kurz so ein Prog ?
-
Compy schrieb:
MFK, und wie kann ich es nun ausführen ?
Du musst den Funktionszeiger zuerst auf den richtigen Typ für deine Funktion casten. Danach rufst du deine Funktion über den Funktionszeiger auf.
-
Hi,
ähmm...Beispiel ? Wie mach ich das ?
-
Versuch mal die Suchfunktion:
http://www.c-plusplus.net/forum/viewtopic.php?t=96872&highlight=getprocaddress
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
// dll funktion void Hallo(void); // in deinem proggie void (dll_func*)(void); // Funktionszeiger // aufruffunktion fuer dll_funktion(void Hallo(void); void RufMitHalloFunktionInDllAuf(void) { HINSTANCE handle = LoadLibrary("meineHelloDll.dll"); FARPROC fp = GetProcessAddress(handle,"Hallo"); dll_func = (void(*)(void))fp; (*dll_func)(); FreeLibrary(handle); }ich hoff ich hab da mal keinen fehler drinnen
Meep Meep
-
Hi, danke für die Hilfe. Hab mich nun umgeschaut bei Microsoft.
Und habe meinen Code geändert:#include <stdio.h> #include <windows.h> typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer DWORD dwParam1; UINT uParam2, uReturnVal; int main() { hDLL = LoadLibrary("DLL.dll"); if (hDLL != NULL) { lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "?Hallo@@YAXXZ"); if (!lpfnDllFunc1) { // handle the error FreeLibrary(hDLL); return 0; } else { // call the function uReturnVal = lpfnDllFunc1(dwParam1,uParam2); } } system("PAUSE"); return 0; }Jetzt kommt aber noch ein Fehler:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Wisst ihr, was ich nun machen soll ? Der Fehler scheint bei "uReturnVal" zu liegen. Ausgabe kommt zwar "Hallo", aber auch leider dieser Fehler
-
Meep Meep,
Ich habe das nun so im Prog eingetragen :
#include <stdio.h> #include <windows.h> void (dll_func*)(void); void lol(void) { HINSTANCE handle = LoadLibrary("DLL.dll"); FARPROC fp = GetProcAddress(handle,"Hallo"); dll_func = (void(*)(void))fp; (*dll_func)(); FreeLibrary(handle); } int main() { lol(); system("PAUSE"); return 0; }Fehler:
...\Dllstarten\Dllstarten.cpp(10): error C2065: 'dll_func' : nichtdeklarierter Bezeichner
...\Dllstarten\Dllstarten.cpp(11): error C2100: Zeigeroperation ungültig
...\Dllstarten\Dllstarten.cpp(4): error C2629: 'void (' unerwartet
-
Hier mal ein einfaches Beispiel
#include <windows.h> #include <tchar.h> typedef void (*hallo_func_ptr)(void); int main() { HMODULE h_dll = LoadLibrary(_T("meine_dll.dll")); if (!h_dll) return whatever; hallo_func_ptr hallo_func = (hallo_func_ptr) GetProcAddress(h_dll, _T("hallo")); if (!hallo_func) // error else { // Funktion kann jetzt aufgerufen werden hallo_func(); //... } FreeLibrary(h_lib); return 0; } // ungetestet
-
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Das sagt eh schon alles. Du solltest außerdem mal extern "C" verwenden, damit du nicht diesen komplizierten Funktionsnamen nachschauen musst.