c++ - 访问属于 WiFi 监听器回调成员函数的类的成员

标签 c++ callback

我有一个 WiFi 监听器注册为具有固定的第 3 方接口(interface)的回调(指针函数)。我使用函数的静态成员来注册回调函数,然后该静态函数通过静态转换调用非静态成员。主要问题是我不能用我类(class)的任何成员接触生成的 char * buff,我什至不能更改也是我类(class)成员的 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”(空)字符结束。当您将 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);
...

关于c++ - 访问属于 WiFi 监听器回调成员函数的类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224476/

相关文章:

c++ - 有谁知道一个好的/简单/免费/开放的 3d 建模程序?

c# - 如何实现从非托管 DLL 到 .net 应用程序的回调接口(interface)?

Android:从回调中获取结果(联网KOUSH ION)

C++ 运算符重载奇怪的类型转换

c++ - 为什么我会被核心转储? (Cpp代码)

python - 如何将 git 版本信息添加到 cython 构建的 .so 文件中?

c# - 如何使用异步执行回调委托(delegate)

c++ - 将任何类的任何成员函数作为回调函数传递

javascript - "this"javascript 回调函数中的关键字

c++ - 无法将 std::min 传递给函数,std::min 的拷贝有效