0

アプリケーションをマルチスレッド化するだけで、ほとんどの問題を解決できたようです。ただし、「変数 'x' の周りのスタックが壊れています」というエラーが少し発生しています。(デバッグエラーで中止を押した後)正常に動作しますが、誰かがアプリケーションを実行するたびにエラーが発生することはありません。したがって、ここに関連するコードがあります。これは、ワーカー スレッドの 1 つへのコールバックです。

DWORD WINAPI Arc_writePipe(LPVOID threadParam)
{
    Arc_Redirect ar;
    DWORD dwWrote;
    CHAR chBuf[BUFSIZE];
    HANDLE hPipe = (HANDLE)threadParam;
    HWND g1   = FindWindow("GUI",NULL);
    HWND dlg  = GetDlgItem(g1,IDO_WORLDOUT);
    //int nLength = GetWindowTextLength(GetDlgItem(g1,IDO_WORLDINPUT));

    while(bRunThread)
    {
        if(GetDlgItemText(g1,IDO_WORLDINPUT,chBuf,BUFSIZE))
        {
            chBuf[BUFSIZE] = '\0';
            if(!WriteFile(hPipe,chBuf,BUFSIZE,&dwWrote,NULL))
            {
                //SetDlgItemText(g1,IDO_WORLDINPUT,NULL); // This is to reset text when done sending to input
                if(GetLastError() == ERROR_NO_DATA)
                    break; // Normal :)
                else
                    MessageBox(g1,"Error: Could not WriteFile();","Error",MB_ICONERROR);
            }
        }
    }
    return 1;
}

このエラーが発生し続ける理由について誰か考えがありますか? データが書き込まれた後、「ERROR_NO_DATA」以外の GetLastError() 出力が得られないため、WriteFile(); と関係があると想定しています。BUFSIZE (0x1000 で定義) と組み合わせて機能します。基本的に、私は何か間違ったことをしています。編集ダイアログから情報を取得してパイプに書き込むためのより良い方法を知っている人はいますか?

助けてくれてどうもありがとう!

よろしく、
デニス M.

4

2 に答える 2

2

破損がどこで起こっているのかわからないため、正確に何が問題なのかわかりません。ただし、次の行は間違っています。

chBuf[BUFSIZE] = '\0';

インデックスが実際には配列の外側にあることを意味するchBufサイズで宣言しました。これにより、スタックが破損します。あなたが本当にしなければならないことは、BUFSIZE BUFSIZEchBuf[BUFSIZE - 1] = '\0';

于 2010-07-13T04:31:05.463 に答える
2

JS Bangs が指摘したように、末尾を超えて配列のインデックスを作成することに加えて、おそらく chBuf 全体をパイプに書き込みたくないでしょう。現在、ヌル ターミネータと、文字列の末尾を過ぎた配列の残りの部分。取得した文字列の長さを確認し、その長さだけを書き込むことができます。

于 2010-07-13T04:40:52.263 に答える