C++;lpClientData参数中的WinSnmp回调函数和对象地址 我的C++类使用WiSNMP从设备中获取整数值。 会话初始化如下所示: snmpident::snmpident(const char* c, const char* si, const char* i,const char* o) {... sesshandle=SnmpCreateSession(NULL,NULL,snmpgetCB,this); ...}

C++;lpClientData参数中的WinSnmp回调函数和对象地址 我的C++类使用WiSNMP从设备中获取整数值。 会话初始化如下所示: snmpident::snmpident(const char* c, const char* si, const char* i,const char* o) {... sesshandle=SnmpCreateSession(NULL,NULL,snmpgetCB,this); ...},c++,winapi,winsnmp,C++,Winapi,Winsnmp,所以,我在回调函数中接收到class对象的地址,即使用它调用该对象的方法: SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd, //callback func UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData) {... reinterpret_cast<snmpident*>(lpClientData)->recv(s

所以,我在回调函数中接收到class对象的地址,即使用它调用该对象的方法:

SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd,  //callback func
    UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData)
{...
reinterpret_cast<snmpident*>(lpClientData)->recv(sv.value.sNumber); //recv is an "snmpident" class method
...}
SNMPAPI_状态回调snmpgetCB(HSNMP_会话hSession,HWND HWND,//回调函数
UINT wMsg、WPARAM WPARAM、LPARAM LPARAM、LPVOID lpClientData)
{...
reinterpret_cast(lpClientData)->recv(sv.value.sNumber);//recv是一个“snmpident”类方法
...}
如您所见,如果类的用户(在本例中为I)在回调函数完成其工作之前删除类对象,则可能会导致“访问冲突”。 我怎样才能解决这个问题? 睡眠看起来很难看。{pointer;session id}结构的数组看起来有点有趣,但我不确定它是否是最佳选择


另外,请原谅我的英语。

snmpindent
作为一个单例,并有一个全局实例。您也可以使用消息作为回调机制。如果相关窗口在消息到达之前被破坏,则不会出现访问冲突。为此,您可以创建一个只显示消息的窗口,并将
snmpident
对象附加到此窗口(额外的窗口内存可能是存储此信息的好地方)。在销毁类对象之前关闭SNMP会话。SNMP会话将在析构函数中关闭。但是回调函数可能已经在运行。使用另一个窗口查看消息看起来很有趣,谢谢。