Funktion aus DLL ausführen



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





  • 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