我有一个WiFi Listener注册为具有固定第三方接口的回调(指针功能)。我使用函数的静态成员来注册回调函数,然后静态函数通过静态强制转换调用非静态成员。主要问题是我不能用我班级的任何成员触摸生成的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。
答案 0 :(得分:1)
您可能会遇到访问冲突,因为p2tObject不指向有效对象而是指向垃圾。什么时候p2tObject初始化?它指出了什么?
为此,您的代码应如下所示:
...
TextWifiCommunication twc;
p2tObject = reinterpret_cast<void*>(&twc);
...
关于字符串错误,TCP_readData不可能以空值终止您提供的字符数组。 C字符串以第一个'\ 0'(null)字符结束。当您将C字符串转换为std :: string时,std :: string将从C字符串指针中复制字节,直到找到空终止符。在你的情况下,碰巧在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);
...