C++ 如何在类中使用WINAPI函数(即´;t回调)?
我想创建一个使用WINAPI AddVectoredExceptionHandler的类 我在谷歌上搜索了一下,每个人都说要让它成为静态的,因为WINAPI是纯C的,不知道类 如果将其设为静态,则无法在静态函数中使用类成员 之后,我在谷歌上搜索了一下“如何从同一类的静态方法调用非静态方法?c++” 但除了回调WINAPI函数,我什么也没找到 如何在类中使用此WINAPI?因为它不是回调函数?(我还在谷歌上搜索了回调函数)(看起来不是吗?) 你运气不好(差一点)。因为<代码> AddVectoredExceptionHandler <代码>似乎不能存储任何超出句柄的上下文,所以没有合法的C++方法从中调用非静态成员函数。(这是一种不合时宜的方式,但我认为现在没有理由推荐它)。请记住,调用非静态成员函数也需要提供该类的实例,并且没有任何地方可以放置该实例 但是,函数C++ 如何在类中使用WINAPI函数(即´;t回调)?,c++,class,winapi,methods,C++,Class,Winapi,Methods,我想创建一个使用WINAPI AddVectoredExceptionHandler的类 我在谷歌上搜索了一下,每个人都说要让它成为静态的,因为WINAPI是纯C的,不知道类 如果将其设为静态,则无法在静态函数中使用类成员 之后,我在谷歌上搜索了一下“如何从同一类的静态方法调用非静态方法?c++” 但除了回调WINAPI函数,我什么也没找到 如何在类中使用此WINAPI?因为它不是回调函数?(我还在谷歌上搜索了回调函数)(看起来不是吗?) 你运气不好(差一点)。因为 AddVectoredEx
addvectoredceptionhandler
是全局函数。它不应该特定于任何特定的类实例,正因为如此,它的每对象风格是没有意义的。一旦异常发生,它就会发生——并且它与程序中的任何特定类或对象都不相关。所以静态类成员函数甚至全局函数应该足够了
一句话:你不能,而且你很可能不需要这样做。你运气不好(差一点)。因为<代码> AddVectoredExceptionHandler <代码>似乎不能存储任何超出句柄的上下文,所以没有合法的C++方法从中调用非静态成员函数。(这是一种不合时宜的方式,但我认为现在没有理由推荐它)。请记住,调用非静态成员函数也需要提供该类的实例,并且没有任何地方可以放置该实例
但是,函数addvectoredceptionhandler
是全局函数。它不应该特定于任何特定的类实例,正因为如此,它的每对象风格是没有意义的。一旦异常发生,它就会发生——并且它与程序中的任何特定类或对象都不相关。所以静态类成员函数甚至全局函数应该足够了
一句话:你不能,而且你很可能不需要。感谢Remy Lebeau为SergeyA提供了答案,SergeyA回答了我的问题,但没有提供解决方法
一种“黑客”方式是对实际的VEH回调使用thunk,然后将类对象指针存储在该thunk中。当被引发的向量异常调用自身时,thunk可以根据需要调用类对象上的方法Remy Lebeau 13小时前
在谷歌搜索“砰”是什么之后
我只是听了他的评论。感谢雷米·勒博为谢尔盖亚提供了答案,他回答了我的问题,但没有提供解决方法
一种“黑客”方式是对实际的VEH回调使用thunk,然后将类对象指针存储在该thunk中。当被引发的向量异常调用自身时,thunk可以根据需要调用类对象上的方法Remy Lebeau 13小时前
在谷歌搜索“砰”是什么之后
我刚听了他的评论。矢量处理器
是全局感知函数。它不会在call中接收额外的上下文。所以您不能在这里获取指向类实例的指针(若这不是全局实例)。当然,动态分配可执行内存thunk是可能的,它调用类成员函数,但这样做毫无意义。无论如何-您是否计划有多个类实例VEH
?VectoredHandler
是全局感知函数。它不会在call中接收额外的上下文。所以您不能在这里获取指向类实例的指针(若这不是全局实例)。当然,动态分配可执行内存thunk是可能的,它调用类成员函数,但这样做毫无意义。无论如何-您是否计划拥有多个类VEH
?一种“黑客”方法是对实际的VEH回调使用thunk,然后将类对象指针存储在该thunk中。然后,thunk可以根据需要调用类对象上的方法,当它自己被一个向量异常调用时。@RemyLebeau,是的,这是我刚才提到的黑客方式,但我非常确定OP不需要它。一种“黑客”方式是在实际的VEH回调中使用thunk,然后将类对象指针存储在thunk中。thunk可以根据需要调用类对象上的方法,当它自己被一个向量化异常调用时。@RemyLebeau,是的,这是我刚才提到的黑客方式,但我非常确定OP不需要它。
class VEH
{
public:
VEH();
private:
void functionA(int a);
/*static*/ LONG ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo);
};
VEH::VEH()
{
AddVectoredExceptionHandler(2,(PVECTORED_EXCEPTION_HANDLER)ExceptionHandler); //INVALID TYPE CONVERSION (if non static)
}
void functionA(int a){
}
LONG ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo){
functionA(2); //a non-static member reference must be relative to a specific object (if static)
}