如何在类中使用WINAPI函数(不是回调)?
How to use WINAPI function (that isn´t Callback) inside a class?
我想创建一个使用 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小时前
在谷歌搜索什么是"笨蛋"之后
什么是"笨蛋"?
我只是听从了他的评论。
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类