Dll



  • Ich habe ein Problem mit typedef:

    • main.cpp
    // includes
    #include <windows.h>
    #include "dll/dll.h"
    #include "resource.h"
    
    // functions
    LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    // public
    HHOOK   hHook;
    HMODULE hDLL=NULL;
    
    // dll typedef
    typedef int (CALLBACK* pSH)();
    typedef int (CALLBACK* pDH)();
    typedef int (CALLBACK* pSHW)(HWND*);
    
    // dll functions
    pSH     pSetKbHook;
    pDH     pDestroyKbHook;
    pSHW    pSetHitWindow;
    
    // api entry
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
    {
        // private
        MSG message;
        WNDCLASS wc;
    
        // init wc
        ZeroMemory(&wc, sizeof(WNDCLASS));
        wc.hInstance        = hInstance;
        wc.lpfnWndProc      = (WNDPROC)MainDlgProc;
        wc.lpszClassName    = "hook";
        RegisterClass(&wc);
    
        // load the dll
        hDLL = LoadLibrary("dll.dll");
    
        // success?
        if(hDLL!=NULL){
            pSetKbHook          = reinterpret_cast<pSH>(GetProcAddress(hDLL, "SetKbHook"));
            pDestroyKbHook      = reinterpret_cast<pDH>(GetProcAddress(hDLL, "DestroyKbHook"));
            pSetHitWindow       = reinterpret_cast<pSHW>(GetProcAddress(hDLL, "SetHitWindow"));
        }
        else
            MessageBox(0, "failed to load dll", "error", 0);
    
        // show main dialog
        DialogBox(hInstance, MAKEINTRESOURCE(ID_DLG_MAIN), 0, (DLGPROC) MainDlgProc);
    
        // loop
        while(GetMessage(&message, NULL, 0, 0)){
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
    
        return 0;
    }
    
    // the window proc
    LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // switch
        switch(msg){
        // on create
        case WM_INITDIALOG:
            // set window to top
            SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    
            // success?
            if(pSetKbHook()){
                HWND temp = GetDlgItem(hWnd, ID_STATIC_HITS);
                pSetHitWindow(&temp); // HIER STÜRZT DAS PRO AB
            }
    
            return FALSE;
    
        // on close
        case WM_CLOSE:  
            pDestroyKbHook();
            PostQuitMessage(0);
            return 0;
        }
    
        // return def
        return FALSE;
    }
    
    • dll.cpp
    // includes
    #include <windows.h>
    #include "dll.h"
    
    // functions
    LRESULT CALLBACK KeyboardHookProc(int, WPARAM, LPARAM);
    
    // public
    HINSTANCE   hDllInstance;
    HHOOK       hKeyboardHook;
    long        cKeys=0;
    
    // api entry
    int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    {
    ...
    }
    
    // function to set hook
    int SetKbHook(void)
    {
    ...
    }
    
    // function to destroy the hook
    int DestroyKbHook(void)
    {
    ...
    }
    // function to destroy the hook
    // HIER STÜRZT DAS PROG AB
    int SetHitWindow(HWND *hHitWnd)
    {
        SetWindowText(hHitWnd, "AlteHure");
        return 0;
    }
    
    // callback function 
    LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    ...
    }
    
    • dll.h
    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    
    EXPORT int SetKbHook();
    EXPORT int DestroyKbHook();
    EXPORT int SetHitWindow(HWND *hHitWnd);
    

    Beim Compilieren kommen keine Fehler, beim Linken kommen ebenfalls keine Fehler.
    Aber beim Aufruf der Funktion kommt ein Fehler (Convention...)

    Also falls ihr wisst, was ich falsch mache, sagt es mir einfach.

    Danke!
    cu para
    😃



  • Wie wärs mal, wenn du überprüfst, ob die Funktionen überhaupt geladen wurden?! 😡



  • Schau dir mal die Deklaration der Funktionen in der DLL an. 🙂
    int Bla();

    In der Exe schreibst du aber
    int CALLBACK Bla();

    Lass einfach das CALLBACK weg. Das ändert nämlich die Aufrufkonvention. Das ist vollkommen überflüssig und führt zu deinem Fehler.



  • Hey. Keine Doppelpostings!

    Hier gehts weiter: Hook

    [ Dieser Beitrag wurde am 24.11.2002 um 16:43 Uhr von cd9000 editiert. ]


Anmelden zum Antworten