如何在类内使用WINAPI函数(不是Callback)?

时间:2019-01-24 21:28:36

标签: c++ class winapi methods

我想创建一个使用WINAPI AddVectoredExceptionHandler的类。

我在Google上搜索了一下,每个人都说要使其静态,因为WINAPI完全是C,并且不知道类。

如果将其设为静态,则无法在静态函数内使用类成员。

此后,我在Google上搜索了“如何从相同类的静态方法调用非静态方法?c ++”

但是除了回调WINAPI函数外,什么都没找到。

https://www.experts-exchange.com/articles/655/How-to-provide-a-CALLBACK-function-into-a-C-class-object.html

如何在课堂上使用此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)
}

2 个答案:

答案 0 :(得分:1)

(几乎)您不走运。由于AddVectoredExceptionHandler似乎无法存储该句柄之外的任何上下文,因此没有合法的C ++方法可以从中调用非静态成员函数。 (有一种骇人听闻的方法,但是我现在没有理由推荐它)。请记住,调用非静态成员函数还需要提供该类的实例,并且根本没有地方可以放置该实例。

但是,功能AddVectoredExceptionHandler是全局的。它不应特定于任何特定的类实例,因此,使其具有每个对象的风格是没有意义的。一旦发生异常,它就会发生-它与程序中的任何特定类或对象都不相关。因此,static类成员函数甚至全局函数对您来说就足够了。

底线:您不能,而且很可能不需要。

答案 1 :(得分:0)

感谢雷米·勒博(Remy Lebeau)向SergeyA提供了答案,他回答了我的问题,但没有提供解决方法。

一种“骇人听闻”的方法是将thunk用于实际的VEH回调,然后将类对象指针存储在该thunk中。当thunk可以通过引发的向量异常调用自身时,可以根据需要在类对象上调用方法。 – 13小时前的人头马(Remy Lebeau)

在搜索了什么“暴徒”之后

What is a 'thunk'?

我只是听了他的评论。