访问作为WiFi侦听器回调成员函数一部分的类的成员
Accessing the member of a class that is part of a WiFi listener callback member function
我有一个注册为回调(指针函数)的WiFi侦听器,具有固定的第三方接口。我使用函数的一个静态成员来注册回调函数,然后该静态函数通过静态强制转换调用一个非静态成员。主要的问题是,我不能用我的类的任何成员触摸得到的char*buff,甚至不能更改也是我的类成员的int标志。所有这些都会导致运行时访问冲突。我能做什么?请参阅下面的一些代码。其他问题在代码后面描述。
void *pt2Object;
TextWiFiCommunication::TextWiFiCommunication()
{
networkDeviceListen.rawCallback = ReceiveMessage_thunkB;
/* some other initializing */
}
int TextWiFiCommunication::ReceiveMessage_thunkB(int eventType, NETWORK_DEVICE *networkDevice)
{
if (eventType == TCP_CLIENT_DATA_READY)
static_cast<TextWiFiCommunication *>(pt2Object)->ReceiveMessageB(eventType,networkDevice);
return 1;
}
int TextWiFiCommunication::ReceiveMessageB(int eventType, NETWORK_DEVICE *networkDevice)
{
unsigned char outputBuffer[8];
// function from an API that reads the WiFi socket for incoming data
TCP_readData(networkDevice, (char *)outputBuffer, 0, 8);
std::string tempString((char *)outputBuffer);
tempString.erase(tempString.size()-8,8); //funny thing happens the outputBuffer is double in size and have no idea why
if (tempString.compare("facereco") == 0)
cmdflag = 1;
return 1;
}
因此,如果在运行时没有访问冲突,我就无法更改变量cmdflag。我不能将outputBuffer声明为类成员,因为没有任何内容被写入,所以我必须在函数中执行。我无法将outputBuffer复制到类的字符串类型成员。调试器显示strlen.asm代码。不知道为什么。我该怎么绕过这个?我似乎被囚禁在这个函数ReceiveMessageB中。
提前感谢!
其他一些奇怪的问题包括:尽管我称缓冲区大小为8。当我使用outputBuffer并用它初始化一个字符串时,该字符串的大小为16。
您可能会遇到访问冲突,因为p2tObject不是指向有效对象,而是指向垃圾。p2tObject何时初始化?它指向什么?
为了实现这一点,您的代码应该如下所示:
...
TextWifiCommunication twc;
p2tObject = reinterpret_cast<void*>(&twc);
...
关于字符串错误,TCP_readData不太可能以null终止您给它的字符数组。C字符串以第一个"\0"(null)字符结束。当您将C字符串转换为std::字符串时,std::string会从C字符串指针复制字节,直到找到null终止符。在您的情况下,它恰好在16个字符之后找到它。
要从TCP字节流中读取最多8个字符,缓冲区的长度应为9个字符,并且缓冲区的所有字节都应初始化为"\0":
...
unsigned char outputBuffer[9] = { 0 };
// function from an API that reads the WiFi socket for incoming data
TCP_readData(networkDevice, (char *)outputBuffer, 0, 8);
std::string tempString((char *)outputBuffer);
...
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法