Funktion aus DLL ausführen
-
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.