如何在类中使用WINAPI函数(不是回调)?

How to use WINAPI function (that isn´t Callback) inside a class?

本文关键字:回调 函数 WINAPI      更新时间:2023-10-16

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

我用谷歌搜索了一下,每个人都说要让它成为静态的,因为 WINAPI 是纯粹的 C 并且不知道类。

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

之后,我在谷歌上搜索了一下"如何从同一类的静态方法调用非静态方法?C++"

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

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

如何在课堂上使用此 WINAPI? 因为它不是回调函数?(我也用谷歌搜索了回调函数)(好像不是一个?

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)
}

你运气不好(差不多)。由于AddVectoredExceptionHandler似乎无法存储句柄之外的任何上下文,因此没有合法C++方法可以从中调用非静态成员函数。(有一种黑客方式,但我认为现在没有理由推荐它)。请记住,调用非静态成员函数还需要提供类的实例,并且根本没有可以放置此实例的位置。

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

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

感谢 Remy Lebeau 为谢尔盖提供了答案,他回答了我的问题,但没有提供一种方法。

一种"黑客"方法是对实际的 VEH 回调使用 thunk,然后将类对象指针存储在该 thunk 中。然后,当类对象被引发的向量异常调用时,thunk 可以根据需要在类对象上调用方法。– 雷米·勒博 13小时前

在谷歌搜索什么是"笨蛋"之后

什么是"笨蛋"?

我只是听从了他的评论。