DLL Funktion aufrufen --> mal wieder "Probleme"



  • @Seikuassi:
    Kann es sein dass du dich ein wenig mit Hacking beschätigen willst, oder warum willst du die DLL Funkion auf eine solchen Art und Weise aufrufen? Warum nicht sicherstellen dass die richtige Lib und Header Datei eingebunden ist und die Funktion einfach so aufrufen?

    Wenn du die Funktion unbedingt per GetProcAddress aufrufen willst, dann schaue dir mal das Beispiel zu GetProcAddress an. Und schaue dir auch mal den Unterschied zwischen LoadLibrary und GetModuleHandle an.



  • @Seikuassi :
    Mal ne dumme Frage:

    Was hat es mit deinem Doppelpost Anfängerfrage DLL auf sich? Warum hast du einen neuen Thread aufgemacht?



  • Dieses Beispiel ist nicht sehr sinnvoll.
    Auf Windows Rechnern kann bzw. muss man davon ausgehen, dass User32.dll vorhanden ist und kann die Funktionen statisch linken.

    LoadLibrary ist nur dann sinnvoll, wenn man beim nicht vorhanden sein einer DLL entsprechend reagieren will, also nicht mit einer Standardmessagebox oder man dynamisch Funktionen daraus laden will, z.B. weil man DLLs als Plugins hinzugefügen kann.



  • Was hat es mit deinem Doppelpost Anfängerfrage DLL auf sich? Warum hast du einen neuen Thread aufgemacht?

    Ups... 🙄

    @Seikuassi:
    Kann es sein dass du dich ein wenig mit Hacking beschätigen willst [...]

    Ich bin noch ein blutiger Anfänger! Was soll ich da mit Hacking zu tun haben? Ich will nur gucken, wie man eine DLL dynamisch aufruft.

    Seikuassi schrieb:
    Denn durch praktisches "Herumspielen" lernt man (so ist es jedenfalls bei mir 🙂 ).

    Das denken erstaunlich viele. Ob's effizient ist, grad' bei C++, ist halt die andere Frage.

    Ich möchte zwar kein Klugscheißer sein, aber ob ich jetzt effizient arebite, ist mir eigentlich Jacke wie Hose. 😉

    Letzte Frage: Warum funktioniert der folgende Code nicht?

    #include <iostream>
    #include <windows.h>
    
    template <typename T0,typename T1>
    T0 DLL_Call (string pDLL,string function,T1 parameter) {
    	typedef int (__cdecl *MYPROC)(T1);
    	HMODULE hDLL;
    	MYPROC ProcAdd;
    	hDLL = LoadLibrary (pDLL.c_str());
    	ProcAdd = (MYPROC) /* <-- */ GetProcAddress (hDLL,function.c_str());
    	(ProcAdd) (parameter);
    	FreeLibrary (hDLL);
    	T0 result = (ProcAdd);
    	return result;
    };
    int main() {
    	DLL_Call ("D:\\WINDOWS\\system32\\kernel32.dll","Sleep",2000);
    	cout << "[Beenden]";
    	system ("pause > NUL");
    	return 0;
    };
    

    Ich bekomme folgende Fehlermedlungen (zur Erinnerung: ich benutze Dev-C++):

    16 62 D:\Dokumente und Einstellungen\Philipp Buchmann\Desktop\main.cpp [Error] no matching function for call to 'DLL_Call(const char [33], const char [6], int)'
    16 62 D:\Dokumente und Einstellungen\Philipp Buchmann\Desktop\main.cpp [Note] candidate is:
    4 4 D:\Dokumente und Einstellungen\Philipp Buchmann\Desktop\main.cpp [Note] template<class T0, class T1> T0 DLL_Call(std::string, std::string, T1)
    4 4 D:\Dokumente und Einstellungen\Philipp Buchmann\Desktop\main.cpp [Note] template argument deduction/substitution failed:
    16 62 D:\Dokumente und Einstellungen\Philipp Buchmann\Desktop\main.cpp [Note] couldn't deduce template parameter 'T0'

    Danke im Voraus!

    MfG

    Ph. Buchmann



  • ...





  • Hallo,

    ich habe jetzt die Lösung. Ich verwende einfach nur ein Template und gebe als Rückgabewert immer einen string:

    #include <iostream>
    #include <sstream>
    #include <windows.h>
    
    using namespace std;
    
    template <typename T>
    string DLL_Call (string pDLL,string function,T parameter) {
    	typedef int (__cdecl *MYPROC)(T);
    	HMODULE hDLL;
    	MYPROC ProcAdd;
    	hDLL = LoadLibrary (pDLL.c_str());
    	ProcAdd = (MYPROC) /* <-- */ GetProcAddress (hDLL,function.c_str());
    	(ProcAdd) (parameter);
    	FreeLibrary (hDLL);
    	string result_0;
    	stringstream result_1;
    	result_1 << (ProcAdd);
    	result_1 >> result_0;
    	return result_0;
    };
    int main() {
    	string x = DLL_Call ("D:\\WINDOWS\\system32\\kernel32.dll","Sleep",2500);
    	cout << x.c_str() << "\n\n\n" << "[Beenden]";
    	system ("pause > NUL");
    	return 0;
    };
    

    Danke für eure Hilfe!

    MfG

    Ph. Buchmann



  • ...



  • Hallo Swordfish,

    Tut nicht, was du glaubst.

    Stimmt. Aber wenn Sleep mir ein void zurückgibt, warum bekomme ich dann eine 1 zurück?

    Und noch eine Frage: Hier
    [url]
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms686923(v=vs.85).aspx
    [/url]
    wird ja die Verknüpfung mit einer DLL während der "Ladezeit" beschrieben. Wo kann ich denn jetzt da einen absoluten Pfad einsetzen?

    irgendeiner wird schreiben:
    Und warum willst du das tun?

    Ich will es nur wissen.

    Danke im Voraus!

    MfG

    Ph. Buchmann



  • Wo kann ich denn jetzt da einen absoluten Pfad einsetzen?

    Okay, Frage hat sich erledigt. Die DLL muss gelinkt werden.



  • ...


Anmelden zum Antworten