Как использовать функцию WINAPI (которая не является обратным вызовом) внутри класса? - PullRequest
0 голосов
/ 25 января 2019

Я хочу создать класс, который использует WINAPI AddVectoredExceptionHandler.

Я немного погуглил, и все говорят, чтобы он был статичным, поскольку WINAPI - это чисто C и не знает классов.

Если я сделаю его статическим, я не смогу использовать член класса внутри статической функции.

После этого я немного погуглил на тему "как вызвать нестатический метод из статического метода того же класса? C ++"

Но не нашел ничего, кроме функций Callback WINAPI.

https://www.experts -exchange.com / статьи / 655 / Как к обеспечить-а-CALLBACK-функцию-INTO-а-C-класса 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)
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Спасибо Реми Лебо за предоставление ответа SergeyA, который отвечает на мои вопросы, но не предоставил способ сделать это.

Одним из "хакерских" способов было бы использование thunk для фактического обратного вызова VEH, а затем сохранение указателя объекта класса внутри этого thunk. Затем thunk может вызывать методы объекта класса по мере необходимости, когда сам вызывается вызываемым векторным исключением. - Реми Лебо 13 часов назад

После поиска в Google, что такое "гром"

Что такое "гром"?

Я просто последовал его комментарию.

0 голосов
/ 25 января 2019

Вам не повезло (почти).Поскольку AddVectoredExceptionHandler, похоже, не в состоянии хранить какой-либо контекст вне дескриптора, не существует легального способа C ++ для вызова из него нестатической функции-члена.(Есть хакерский путь, но я не вижу причин рекомендовать его сейчас).Помните, что для вызова нестатической функции-члена также необходимо предоставить экземпляр класса, и вы просто не можете разместить этот экземпляр.

Однако функция AddVectoredExceptionHandler является глобальной.Он не должен быть специфичным для какого-либо конкретного экземпляра класса, и поэтому нет смысла иметь его для каждого объекта.Как только возникает исключение, оно происходит - и оно не связано с каким-либо конкретным классом или объектом в вашей программе.Так что static функции-члена класса или даже глобальной функции должно быть достаточно для вас.

Итог: вы не можете, и вам, скорее всего, не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...