我有一个 WiFi 侦听器注册为具有固定第 3 方接口的回调(指针函数)。我使用函数的静态成员来注册回调函数,然后该静态函数通过静态强制转换调用非静态成员。主要问题是我无法与班级的任何成员接触生成的 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。