typedef long (WINAPI *LIB_FUNC_HOOK)( LPVOID lp, char * szAction, char * szFmt, va_list v);
typedef struct _Hook
{
char szName[256];
LIB_FUNC_HOOK func;
int nPriority;
LPVOID lp;
_Hook & operator = ( _Hook & src)
{
memcpy( this, &src, sizeof(_Hook));
return *this;
}
#if defined(_DEBUG)
char szFile[MAX_PATH];
int nLine;
#endif
}STRUCT_HOOK;
bool FUNC_CALL_TYPE LibAddHookEx( STRUCT_HOOK & hookItem)
{
STRUCT_HOOK_A hookAItem;
memset( &hookAItem, 0, sizeof(hookAItem));
strcpy( hookAItem.szName, hookItem.szName);
hookAItem.func = hookItem.func;
hookAItem.nPriority = hookItem.nPriority;
hookAItem.lp = hookItem.lp;
#ifdef _DEBUG
//strcpy( hookAItem.szFile, hookItem.szFile);
hookAItem.nLine = hookItem.nLine;
#endif
m_HookTool.AddHook( hookAItem);
return true;
}
bool FUNC_CALL_TYPE LibRemoveHookEx( STRUCT_HOOK & hookItem)
{
STRUCT_HOOK_A hookAItem;
strcpy( hookAItem.szName, hookItem.szName);
hookAItem.func = hookItem.func;
hookAItem.nPriority = hookItem.nPriority;
hookAItem.lp = hookItem.lp;
#ifdef _DEBUG
strcpy( hookAItem.szFile, hookItem.szFile);
hookAItem.nLine = hookItem.nLine;
#endif
m_HookTool.RemoveHook( hookAItem);
return true;
}
long FUNC_CALL_TYPE LibCallHook( char * szName, char * szAction, char * szFmt, ...)
{
POSITION posHookItem = (POSITION)INVALID_HANDLE_VALUE;
va_list vaList;
va_start( vaList, szFmt);
long nCall = -1;
m_HookTool.HookCall( szName, szAction, szFmt, vaList);
va_end( vaList);
return nCall;
}
实现了可变参数的钩子调用,一切都用字符串实现查找,不用定义信号变量