从dll传递回调到EXE
Passing CALLBACK from dll to EXE
我有一个DLL,我用它来钩住记事本并捕捉击键。一切都很好,但我想从我的exe中访问KeyboardHook回调。因此,每次回调在。dll被触发,它传递它的值给。exe这是可能的吗?
** HOOK.dll (hook .cpp) **
#include "windows.h"
#pragma data_seg (".SHARED")
HHOOK keyboardHook = 0;
HINSTANCE g_hInstance = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SHARED,RWS")
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
if(0 > nCode)
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
{
MessageBox(NULL, L"Got Keyboard Event !", L"Event", 0);
}
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
extern "C" __declspec(dllexport) bool InstallKeyboardHook(unsigned long threadID)
{
keyboardHook = SetWindowsHookEx(WH_KEYBOARD, &KeyboardHook, g_hInstance, threadID);
return true;
}
extern "C" __declspec(dllexport) bool UnInstallKeyboardHook()
{
UnhookWindowsHookEx(keyboardHook);
return true;
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
g_hInstance = (HINSTANCE) hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
** Hook.exe (hook.h) **
#pragma once
#include "afxwin.h"
typedef bool(*InstallHook)(unsigned long);
typedef bool(*UnInstallHook)();
typedef LRESULT (*KeyboardHook)(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK MyCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
//Id like this to get called whenever the CALLBACK in the dll is called
MessageBox(NULL, L"test", L"test", 0);
return NULL;
}
class CTrayMeApp : public CWinApp
{
public:
CTrayMeApp(){};
~CTrayMeApp(){};
virtual BOOL InitInstance();
};
extern CTrayMeApp theApp;
** Hook.exe (hook.cpp) **
#include "hook.h"
CTrayMeApp theApp;
BOOL CTrayMeApp::InitInstance()
{
BOOL bReturn = FALSE;
CWinApp::InitInstance();
HMODULE hModule = LoadLibrary(_T("Hook.dll"));
//Get the function address which installs the keyboard events filter.
InstallHook fpKeyboardHook = (InstallHook) GetProcAddress(hModule,"InstallKeyboardHook");
//Install the Keyboard Event Hook (Filter).
fpKeyboardHook(GetTargetThreadIdFromWindow("Notepad", "Untitled - Notepad"));
//Install the Callback
KeyboardHook cpKeyboardHook = (KeyboardHook) GetProcAddress(hModule,"_KeyboardHook@12");
//OK, are callback is here, now how do we make use of it?
KeyboardHook(MyCallback); //of course this won't work, but it gives an idea of what I'm trying to do.
FreeLibrary(hModule);
Sleep(10000); //give us 10 seconds to test it out
return bReturn;
}
DLL内部:
LRESULT CALLBACK (*myCallbackRef)(int nCode, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) void InstallMyHook(LRESULT CALLBACK (*MyCallback)(int nCode, WPARAM wParam, LPARAM lParam))
{
myCallbackRef = MyCallback;
}
使用myCallbackRef
和KeyboardHook
内部的参数
在你的程序中叫
InstallMyHook(MyCallBack);
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在DLL实例之间的exe中使用回调
- 从dll传递回调到EXE