我一直在想如何在C中实现一个钩子系统。任何人都可以给我一些指针或例子吗?C挂钩/回拨系统
C挂钩/回拨系统
回答
使用函数指针:
struct callbacks {
void (*somethingHappened)(void *context);
bool (*shouldIDoSomething)(void *context);
};
void doSomethingAwesome(void *operationData, struct callbacks callbacks)
{
// context is the data you pass to the function
if (callbacks.shouldIDoSomething(context))
{
// do something
callbacks.somethingHappened(context);
}
}
或者,你可以创建一个调度服务:
struct dictionary
{
char **keys;
void **values;
int count;
};
struct list
{
void **values;
int count;
};
// functions to add, remove, etc;
struct dictionary *callbacks = NULL;
void registerForDispatch(char *key, void (*callback)(void *))
{
if (!callbacks)
{
callbacks = dictionary_create(10); // dictionary with 10 key/value pairs
}
if (!dictionary_containsKey(callbacks, key))
{
struct list *callBacksForKey = list_create(10); // default 10 callbacks, array should be auto-expanding
dictionary_setValue(callbacks, key, arr);
}
struct list *callBacksForKey = dictionary_getValue(callbacks, key);
list_addObject(callBacksForKey, callback);
}
void unregisterFromDispatch(char *key, void (*callback)(void *))
{
struct list *callBacksForKey = dictionary_getValue(callbacks, key);
list_removeObject(callback);
}
void sendNotification(char *key, void *context)
{
struct list *callBacksForKey = dictionary_getValue(callbacks, key);
for (int i = 0; list->count; i++)
{
void (*callback)(void *) = list->values[i];
callback(context);
}
}
随着第二个解决方案,您有多个听众的优势一个回调。
对于或多或少的一般回调系统,提供上下文的void指针参数非常有帮助。那些没有这种背景的人(例如'qsort()')可以证明是有问题的 - 尽管并不是每个人都需要'qsort()'的上下文。参见['qsort_r()'](https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/qsort_r.3.html)。 – 2012-03-03 17:21:31
第二种解决方案是我正在寻找的。我正在编写一个模块化的IRC守护进程,并不确定如何实现一个钩子系统。谢谢! – 2012-03-03 19:21:58
@AaronThomasBlakely没问题,只要确定接受答案(点击答案旁边的复选标记)。 – 2012-03-03 22:21:38
你可以看到的qsort例如: http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
/* qsort example */
#include <stdio.h>
#include <stdlib.h>
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return (*(int*)a - *(int*)b);
}
int main()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
的qsort需要的函数指针是用于排序的回调。
我不确定你在找什么东西,但是我一直在使用QT/C++开发应用程序,所以我可以给你举个小例子。
首先,声明函数原型,这样
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
然后,你需要设置挂钩,在主要功能,如:
HHOOK mouseHook;
HINSTANCE appInstance = GetModuleHandle(NULL);
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, appInstance, 0); //set global mouse hook
,然后你需要定义回调函数,我可以给你我的代码>
//Mouse hook callback function.
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode == HC_ACTION) {
switch(wParam){
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MOUSEWHEEL:
#ifdef DEBUG
w->printText("Scrolling or click");
#endif
w->save_key("MOUSE");
i++;
break;
default: break;
}
}
return CallNextHookEx(mouseHook, nCode, wParam, lParam);
}
- 1. 全系统ShellExecute挂钩?
- 2. Android文件系统挂钩
- 3. 挂钩系统调用在Windows
- 4. 挂钩读取系统调用
- 5. 在系统级挂钩[NSEvent mouseLocation]?
- 6. 系统调用挂钩的问题
- 7. 从win32事件挂钩C++回调
- 8. 挂钩C函数
- 9. 关闭挂钩C++
- 10. WH_JOURNALPLAYBACK挂钩在C#
- 11. C++回拨系统。指向成员函数
- 12. 挂钩或不挂钩 - git
- 13. API无挂钩挂钩
- 14. 在Windows中挂钩系统电源按钮
- 15. 从.NET使用非托管DLL的系统范围挂钩
- 16. 应用程序挂钩:: x64操作系统
- 17. 挂钩我自己的RTEMS文件系统功能
- 18. 连接时在iOS上的挂钩系统(libc)功能
- 19. 系统音量与铃声音量挂钩
- 20. 挂钩到系统调用表与模块
- 21. 我怎样才能从系统DLL挂钩一个Api函数?
- 22. C++ JournalPlayback和Bluescreen 0x0000008E(挂钩)
- 23. C++ __usercall在IDA挂钩
- 24. C#SetSystemTime(WIN API)挂钩
- 25. 在C和windows中挂钩
- 26. 挂钩新/删除C++
- 27. PHP系统()挂起?
- 28. C++系统功能挂起应用
- 29. android系统调用钩子
- 30. 净LuaInterface钩系统/活动
这是一个指针:'void *(*)(void *)'。 – 2012-03-03 16:47:14
dlopen?考虑支持插件或扩展的应用程序,例如apache http服务器,lighttpd或浏览器(例如nsapi) – qrtt1 2012-03-03 16:48:18
不,这不是指针。这是句法垃圾。 – Swiss 2012-03-03 16:48:38