グローバルフックを設定したいのですが、作成した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()
を呼び出した後、hookProcKeyboard
はNULL
です。
私はWINAPIを新しくしています。私はこだわっているので、本当に感謝します。
てみ 'のGetProcAddress(keyboardProcDLL、 "_PV_KeyboardProc");'またはhttpなどのツールを使用してDLLのエクスポート(名前)を参照してください:// www.nirsoft.net/utils/dll_export_viewer.html – i486
「_PV_KeyboardProc @ 12」が実際にエクスポートされました。この名前にGetProcAddressを呼び出す必要があります – RbMm
'_PV_KeyboardProc'と' _PV_KeyboardProc @ 12'を試しても、何もありません –