C钩子/回调系统

C钩子/回调系统,c,pointers,callback,hook,C,Pointers,Callback,Hook,我一直在想如何在C中实现一个hooks系统。有人能给我一些指针或示例吗?使用函数指针: struct callbacks { void (*somethingHappened)(void *context); bool (*shouldIDoSomething)(void *context); }; void doSomethingAwesome(void *operationData, struct callbacks callbacks) { // context

我一直在想如何在C中实现一个hooks系统。有人能给我一些指针或示例吗?

使用函数指针:

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);
    }
}

使用第二种解决方案,您可以为单个回调使用多个侦听器。

您可以看到qsort示例:

/*qsort示例*/
#包括
#包括
int值[]={40,10,100,90,20,25};
整数比较(常数无效*a,常数无效*b)
{
返回(*(int*)a-*(int*)b);
}
int main()
{
int n;
qsort(值,6,sizeof(int),比较);

对于(n=0;n我不确定你到底在寻找什么,但我一直在使用QT/C++中的钩子开发应用程序,所以我可以给你举个小例子

首先,声明函数原型,如下所示

LRESULT CALLBACK    LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
然后,您需要在main函数中设置钩子,如下所示:

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);

}

下面是一个指针:<代码> Value*(空)* /代码> .dOpen.考虑支持插件或扩展的应用程序,例如Apache HTTP服务器、LetTPD或浏览器(例如NSAPI)不,那不是指针。那是语法垃圾。@KerrekSB@KerrekSB我想有人会这么说。..xd对于一个大致通用的回调系统,提供上下文的void pointer参数非常有用。那些没有上下文的系统(例如,
qsort()
)可能会出现问题-虽然不是每个人都需要
qsort()
上下文。请参阅。第二种解决方案是我正在寻找的。我正在编写一个模块化IRC守护程序,不确定如何实现挂钩系统。谢谢!@aarontomasblakely没有问题,请确保接受答案(单击答案旁边的复选标记)。
//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);

}