我正在编写一个应用程序分析库,它基本上挂钩 Windows API 并记录参数和结果。我试图想出一种方法来使用 C++ 模板生成这些钩子,这种方式需要最少的努力来添加新的钩子。基本上,我的每个钩子都如下所示:
BOOL HookCloseHandle(HANDLE h)
{
BOOL result = RealCloseHandle(h);
if(g_profiling) record(result, h);
return result;
}
我想通过模板来概括这一点,以便可以为任何 Windows API 函数生成这些函数decltype
,例如decltype(CreateFileW)
. 这甚至可能吗?我一直function_traits
在 Boost 中查看,似乎我能够想出一些接近的东西:
decltype(&CloseHandle) RealCloseHandle = &::CloseHandle;
template <typename R, typename P1, R(*F)(P1)>
R perform_1(P1 value)
{
R result = F(value);
if (profiling) record(result, value);
return result;
}
template <typename T>
T* call(const T& original)
{
typedef boost::function_traits<T> traits;
switch (traits::arity)
{
case 1:
return &perform_1<traits::result_type, traits::arg1_type, RealCloseHandle>;
// ...
}
return nullptr;
};
// setup code
Hook(RealCloseHandle, call<decltype(CloseHandle)>());
Hook
挂钩库提供了 哪里,它用我的挂钩版本替换了“真实”功能。
唯一的事情是,我不确定如何删除CloseHandle
当前在call
函数内部的模板参数。有任何想法吗?