2017-07-17 6 views
-1

グローバルフックを設定したいのですが、作成したDLLからフックプロシージャのアドレスを取得する際に問題があります。GetProcAddressが正しく動作しません

私は、名前のマングリングによって問題が発生している可能性があるとstackoverflowで読んだことがあります。そして、その問題を解消するために、私はあなたの将来のdllにあなたの輸出関数をラップしなければなりません。extern "C"です。しかし、それは役に立たなかった。

ここに私のプログラムがあります:

MAIN.CPP

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, 
        _In_opt_ HINSTANCE hPrevInstance, 
        _In_ LPWSTR lpCmdLine, 
        _In_ int  nCmdShow) 
{ 
    HHOOK hHookKeyboard; 
    HINSTANCE keyboardProcDLL; 
    HOOKPROC hookProcKeyboard; 

    keyboardProcDLL = LoadLibrary(L"C:/PV_KeyboardDLL.dll"); 
    if (keyboardProcDLL == NULL) 
    { 
     MessageBox(NULL, L"Could not load library!", L"Error", MB_ICONERROR); 
     return -1; 
    } 

    hookProcKeyboard = (HOOKPROC)GetProcAddress(keyboardProcDLL, "PV_KeyboardProc"); 
    if (hHookKeyboard == NULL) 
    { 
     MessageBox(NULL, L"Could not load function from library!", L"Error", MB_ICONERROR); 
     return -1; 
    } 

    hHookKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, hookProcKeyboard, keyboardProcDLL, 0); 

    while (1) 
    { 

    } 

    return 0; 
} 

PV_KeyboardDLL.cpp

bool toggleOnOff = false; // off by default 


template<typename Type> 
inline bool highOrderBit(Type value) 
{ 
    return (value & (1 << sizeof(Type) * 8 - 1)); 
} 

template<typename Type> 
inline bool lowOrderBit(Type value) 
{ 
    return (value & 1); 
} 

extern "C" 
{ 
    __declspec(dllexport) LRESULT CALLBACK PV_KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
    { 
     // process event 
     if (nCode < 0) // do not process message 
     { 
      return CallNextHookEx(NULL, nCode, wParam, lParam); 
     } 

     if (wParam != WM_KEYDOWN) 
     { 
      return CallNextHookEx(NULL, nCode, wParam, lParam); 
     } 

     KBDLLHOOKSTRUCT* KeyBoardHookStruct = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam); 

     DWORD keyCode = KeyBoardHookStruct->vkCode; 

     bool ctrlDown, altDown; 

     // high-order is 1 - DOWN 
     ctrlDown = highOrderBit(GetKeyState(VK_LCONTROL)); 
     altDown = highOrderBit(GetKeyState(VK_MENU)); 

     // ctrl + alt + 1(key down) 
     if (ctrlDown && altDown && (keyCode == 0x31)) 
     { 
      // toggle bool 
      MessageBox(NULL, L"Workin", L"Ok", MB_OK); 

      toggleOnOff = !toggleOnOff; 
     } 

     return CallNextHookEx(NULL, nCode, wParam, lParam); 
    } 

    __declspec(dllexport) bool onOrOff() 
    { 
     return toggleOnOff; 
    } 
} 

私は、DLLをロードすることができますが、GetProcAddress()を呼び出した後、hookProcKeyboardNULLです。

私はWINAPIを新しくしています。私はこだわっているので、本当に感謝します。

+0

てみ 'のGetProcAddress(keyboardProcDLL、 "_PV_KeyboardProc");'またはhttpなどのツールを使用してDLLのエクスポート(名前)を参照してください:// www.nirsoft.net/utils/dll_export_viewer.html – i486

+0

「_PV_KeyboardProc @ 12」が実際にエクスポートされました。この名前にGetProcAddressを呼び出す必要があります – RbMm

+0

'_PV_KeyboardProc'と' _PV_KeyboardProc @ 12'を試しても、何もありません –

答えて

1

ここに小さなタイプミスのように見える(しかし重要な!):

hookProcKeyboard = (HOOKPROC)GetProcAddress(keyboardProcDLL, "PV_KeyboardProc"); 
if (hHookKeyboard == NULL) 
{ 
    MessageBox(NULL, L"Could not load function from library!", L"Error", MB_ICONERROR); 
    return -1; 
} 

あなたは(GetProcAddressを呼んでいる)、その後hHookKeyboardの値をチェックし、hookProcKeyboardを移入します。 hookProcKeyboardは間違いなくNULLになります!

その問題を調整して、あなたはこの問題を解決に近づくべきである...

関連する問題