C++ 在c+中注册事件回调+;接收事件通知的步骤

C++ 在c+中注册事件回调+;接收事件通知的步骤,c++,winapi,callback,sdk,C++,Winapi,Callback,Sdk,我已经用C#编写代码很多年了。我在C++方面的经验有限。 背景:> VS 2017中的C++项目几乎完成了。我的项目采用了轮廓穿梭装置。要从设备接收项目中的事件通知,我必须通过windows风格的回调函数注册设备事件通知。随设备提供的SDK具有与设备通信所需的所有方法和定义(我已经在C#中创建了一个类似的项目,使用相同的SDK使用多播委托,效果非常好) 我的问题:我知道我必须使用指向我的方法的指针才能让回调正常工作。我已经试了4周来让我的代码运行。没有成功。我唯一的成功就是我使用了一个全局静态的

我已经用C#编写代码很多年了。我在C++方面的经验有限。

<强>背景:> VS 2017中的C++项目几乎完成了。我的项目采用了轮廓穿梭装置。要从设备接收项目中的事件通知,我必须通过windows风格的回调函数注册设备事件通知。随设备提供的SDK具有与设备通信所需的所有方法和定义(我已经在C#中创建了一个类似的项目,使用相同的SDK使用多播委托,效果非常好)

我的问题:我知道我必须使用指向我的方法的指针才能让回调正常工作。我已经试了4周来让我的代码运行。没有成功。我唯一的成功就是我使用了一个全局静态的void。我可以很好地注册和接收事件,但由于它是一个静态全局空,我无法访问类中的方法和变量

我只是不知道该怎么做才好。这是我的密码:

头文件:(随SDK提供)

代码文件(仅包含相关代码):

只有在全局范围内声明CALLBACK ShuttleCallback方法时,这才有效

我知道我应该提供一个指向回调函数的指针,但我还不太了解指针

有人能告诉我在我的项目中实现这一点的正确方法吗

我基本上已经考虑/工作/测试这方面的代码4周了,我无法向您解释我的挫折感


脚注:是的,我搜索过StackOverflow,谷歌,所有常见的论坛。没有一件事能与我的具体情况相联系。每个人都使用“FOO-BAR表示法”,并描述和讨论最好的方法,或者更好的方法,但我似乎找不到一个简单的上下文示例来帮助我。

你是在问如何将类成员作为回调传递吗?或者它与
命名空间
相关?
SHUTTLEEVENTPROC
是指向自由函数的指针。类成员函数指针是不同的不兼容类型。你需要找到一种不同的方式来实现你想要的。@user13510154你所尝试的根本不可能。SDK期望C样式函数指针,而不是C++非静态类方法。因此,对于回调,必须使用1)独立函数,2)静态类方法,或3)thunk。没有其他选择。而且,由于SDK似乎不允许您将用户定义的数据传递给回调,要使用
参数正确调用方法,必须使用1)全局变量,2)线程局部变量(如果回调在调用
Shuttle\u Register\u callback\u global()的同一线程中运行,或3)“砰”的一声。@RemyLebeau非常感谢您提供了这一信息丰富的评论。现在我可以讲述我正在做什么来让函数工作。我从来不知道thunk的事。一天中的大部分时间我都在阅读和使用示例代码进行练习,我觉得我现在走上了正确的道路。最后一个问题。。。thunk线程安全吗?您是否在询问如何将类成员作为回调传递?或者它与
命名空间
相关?
SHUTTLEEVENTPROC
是指向自由函数的指针。类成员函数指针是不同的不兼容类型。你需要找到一种不同的方式来实现你想要的。@user13510154你所尝试的根本不可能。SDK期望C样式函数指针,而不是C++非静态类方法。因此,对于回调,必须使用1)独立函数,2)静态类方法,或3)thunk。没有其他选择。而且,由于SDK似乎不允许您将用户定义的数据传递给回调,要使用
参数正确调用方法,必须使用1)全局变量,2)线程局部变量(如果回调在调用
Shuttle\u Register\u callback\u global()的同一线程中运行,或3)“砰”的一声。@RemyLebeau非常感谢您提供了这一信息丰富的评论。现在我可以讲述我正在做什么来让函数工作。我从来不知道thunk的事。一天中的大部分时间我都在阅读和使用示例代码进行练习,我觉得我现在走上了正确的道路。最后一个问题。。。thunk线程安全吗?
#ifndef _SHUTTLESDK_LIB_
#define _SHUTTLESDK_LIB_

#ifdef __cplusplus
#define SHUTTLESDK_API extern "C"
#else
#define SHUTTLESDK_API
#endif

typedef void (CALLBACK *SHUTTLEEVENTPROC)(DWORD event, UCHAR status, WORD type, WORD devno);

SHUTTLESDK_API int WINAPI Shuttle_Register_Callback_Global(SHUTTLEEVENTPROC shuttleproc, WORD type, WORD devno);

SHUTTLESDK_API int WINAPI Shuttle_Unregister_Callback(WORD type, WORD devno);
...//

Shuttle_Plugin::void Start()
{
   if (Shuttle_Register_Callback_Global(*ShuttleCallback, 3, 1) != SHUTTLESDK_OK)
   {
       //Handle the error here...
       return;
   }
}

Shuttle_Plugin::void CALLBACK ShuttleCallback(DWORD event, UCHAR status, WORD type, WORD devno)
{
    //Events from callback should emit values here... 
}

//...