固定のサード パーティ インターフェイスを使用してコールバック (ポインター関数) として登録されている 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 になります。