我想创建一个使用WINAPI AddVectoredExceptionHandler的类。
我在Google上搜索了一下,每个人都说要使其静态,因为WINAPI完全是C,并且不知道类。
如果将其设为静态,则无法在静态函数内使用类成员。
此后,我在Google上搜索了“如何从相同类的静态方法调用非静态方法?c ++”
但是除了回调WINAPI函数外,什么都没找到。
如何在课堂上使用此WINAPI?因为它不是回调函数? (我还用Google搜索了回调函数)(好像不是一个吗?)
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)
}
答案 0 :(得分:1)
(几乎)您不走运。由于AddVectoredExceptionHandler
似乎无法存储该句柄之外的任何上下文,因此没有合法的C ++方法可以从中调用非静态成员函数。 (有一种骇人听闻的方法,但是我现在没有理由推荐它)。请记住,调用非静态成员函数还需要提供该类的实例,并且根本没有地方可以放置该实例。
但是,功能AddVectoredExceptionHandler
是全局的。它不应特定于任何特定的类实例,因此,使其具有每个对象的风格是没有意义的。一旦发生异常,它就会发生-它与程序中的任何特定类或对象都不相关。因此,static
类成员函数甚至全局函数对您来说就足够了。
底线:您不能,而且很可能不需要。
答案 1 :(得分:0)
感谢雷米·勒博(Remy Lebeau)向SergeyA提供了答案,他回答了我的问题,但没有提供解决方法。
一种“骇人听闻”的方法是将thunk用于实际的VEH回调,然后将类对象指针存储在该thunk中。当thunk可以通过引发的向量异常调用自身时,可以根据需要在类对象上调用方法。 – 13小时前的人头马(Remy Lebeau)
在搜索了什么“暴徒”之后
我只是听了他的评论。