template<class F>
class SafeCall
{
F *funcPtr;
public:
SafeCall(F* func):funcPtr(func){}
template <typename Func, typename ...Args>
typename std::result_of<Func(Args...)>::type
Invoke(Func f, Args&&... args)
{
void* ret_addr_in_stack = _AddressOfReturnAddress();
uintptr_t temp = *(uintptr_t*)ret_addr_in_stack;
*(uintptr_t*)ret_addr_in_stack = 0;
typename std::result_of<Func(Args...)>::type && ret_val=f(args...);
*(uintptr_t*)ret_addr_in_stack = temp;
return ret_val;
}
template<class... Args>
__forceinline decltype(auto) operator()(Args&&... args)
{
return InvokeShellCode(funcPtr,std::forward<Args>(args)...);
}
};
Invoke我需要在调用时从堆栈中清除返回地址,所以我需要在函数代理结束后恢复它 : *(uintptr_t*)ret_addr_in_stack = temp;,但如果函数类型为void,则会出现错误:
typename std::result_of<Func(Args...)>::type && ret_val=f(args...);
//невозможно преобразовать "void" в "int &&"
不清楚 int 类型是从哪里来的,但也不清楚如何制作一个通用函数,在调用代理函数后,我们可以执行一些操作,也就是说,不要这样写:return f(args...)
(SafeCall<decltype(Beep)>(Beep))(500,500);//Все ок
(SafeCall<decltype(Sleep)>(Sleep))(500);//Все не ок
1 个回答