0

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

4

1 に答える 1

1

p2tObject が有効なオブジェクトではなくガベージを指しているため、アクセス違反が発生している可能性があります。p2tObject はいつ初期化されますか? それは何を指していますか?

これが機能するには、コードは次のようになります。

...
TextWifiCommunication twc;
p2tObject = reinterpret_cast<void*>(&twc);
...

文字列エラーに関しては、TCP_readData は、指定した文字配列を null で終了する可能性は低いです。C 文字列は、最初の '\0' (ヌル) 文字で終わります。C 文字列を std::string に変換すると、std::string は null ターミネータが見つかるまで、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);
...
于 2012-09-01T04:10:21.670 に答える