【问题标题】:How to use WINAPI function (that isn´t Callback) inside a class?如何在类中使用 WINAPI 函数(不是回调)?
【发布时间】:2019-01-24 21:28:36
【问题描述】:

我想创建一个使用 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)
}

【问题讨论】:

  • VectoredHandler 是全局感知函数。它不会在调用中接收额外的上下文。所以你不能在这里获得指向类实例的指针(如果这不是全局实例)。当然可能动态分配可执行内存thunk,它调用你的类成员函数,但这样做真的没有意义。无论如何 - 你打算有 multipleVEH 的实例吗?

标签: c++ class winapi methods


【解决方案1】:

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

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

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

【讨论】:

  • 一种“hackish”方式是使用 thunk 进行实际的 VEH 回调,然后将类对象指针存储在该 thunk 中。然后,thunk 可以在引发的向量异常调用自身时根据需要调用类对象上的方法。
  • @RemyLebeau,是的,这是我提到的骇人听闻的方式,但我非常确定 OP 不需要它。
【解决方案2】:

感谢 Remy Lebeau 向 SergeyA 提供答案,他回答了我的问题,但没有提供方法。

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

在谷歌上搜索“thunk”是什么之后

What is a 'thunk'?

我只是关注他的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多