Funktion aus DLL 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 ?





  • 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.


Anmelden zum Antworten