Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在类中使用WINAPI函数(即´;t回调)?_C++_Class_Winapi_Methods - Fatal编程技术网

C++ 如何在类中使用WINAPI函数(即´;t回调)?

C++ 如何在类中使用WINAPI函数(即´;t回调)?,c++,class,winapi,methods,C++,Class,Winapi,Methods,我想创建一个使用WINAPI AddVectoredExceptionHandler的类 我在谷歌上搜索了一下,每个人都说要让它成为静态的,因为WINAPI是纯C的,不知道类 如果将其设为静态,则无法在静态函数中使用类成员 之后,我在谷歌上搜索了一下“如何从同一类的静态方法调用非静态方法?c++” 但除了回调WINAPI函数,我什么也没找到 如何在类中使用此WINAPI?因为它不是回调函数?(我还在谷歌上搜索了回调函数)(看起来不是吗?) 你运气不好(差一点)。因为 AddVectoredEx

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

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

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

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

但除了回调WINAPI函数,我什么也没找到

如何在类中使用此WINAPI?因为它不是回调函数?(我还在谷歌上搜索了回调函数)(看起来不是吗?)

你运气不好(差一点)。因为<代码> AddVectoredExceptionHandler <代码>似乎不能存储任何超出句柄的上下文,所以没有合法的C++方法从中调用非静态成员函数。(这是一种不合时宜的方式,但我认为现在没有理由推荐它)。请记住,调用非静态成员函数也需要提供该类的实例,并且没有任何地方可以放置该实例

但是,函数
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)
}