Revision: 10561 https://osdn.net/projects/ttssh2/scm/svn/commits/10561 Author: zmatsuo Date: 2023-02-02 22:31:49 +0900 (Thu, 02 Feb 2023) Log Message: ----------- 送信時にエラーが発生することがあった - write() error 4317,0x10dd 識別操作子が無効です。 - 書き込みが完了済みなのに、完了結果を取得しようとしていた - 不要な GetOverlappedResult() を呼び出していた Modified Paths: -------------- branches/ttcomtester/tools/ttcomtester/device_com.cpp branches/ttcomtester/tools/ttcomtester/main.cpp -------------- next part -------------- Modified: branches/ttcomtester/tools/ttcomtester/device_com.cpp =================================================================== --- branches/ttcomtester/tools/ttcomtester/device_com.cpp 2023-02-02 11:44:19 UTC (rev 10560) +++ branches/ttcomtester/tools/ttcomtester/device_com.cpp 2023-02-02 13:31:49 UTC (rev 10561) @@ -272,8 +272,8 @@ /** * \x83y\x83\x93\x83f\x83B\x83\x93\x83O\x8F\xF3\x91Ԃ\xF0\x83`\x83F\x83b\x83N\x82\xB7\x82\xE9 * - * @param writed \x8F\x91\x82\xAB\x8D\x9E\x82܂ꂽ\x83o\x83C\x83g\x90\x94 - * 0 \x93ǂݍ\x9E\x82܂\xEA\x82Ă\xA2\x82Ȃ\xA2 + * @param writed \x8F\x91\x82\xAB\x8D\x9E\x82܂ꂽ\x83o\x83C\x83g\x90\x94 + * 0 \x93ǂݍ\x9E\x82܂\xEA\x82Ă\xA2\x82Ȃ\xA2 * @return ERROR_SUCCESS \x93ǂݍ\x9E\x82\xF1\x82\xBE (\x83y\x83\x93\x83f\x83B\x83\x93\x83O\x8F\xF3\x91ԏI\x97\xB9) * @return ERROR_IO_PENDING \x93ǂݍ\x9E\x82ݑ҂\xBF(\x90\xB3\x8F\xED) * @return etc \x83G\x83\x89\x81[ @@ -385,6 +385,10 @@ } #endif + if (writed != NULL) { + *writed = 0; + } + p->write_left = (DWORD)buf_len; DWORD writed_; BOOL r = WriteFile(h, buf, (DWORD)buf_len, &writed_, &p->wol); @@ -391,13 +395,12 @@ if (!r) { err = GetLastError(); if (err == ERROR_IO_PENDING) { - p->write_requested = true; //const DWORD timeout_ms = INFINITE; const DWORD timeout_ms = 0; DWORD wait = WaitForSingleObject(p->wol.hEvent, timeout_ms); if (wait == WAIT_TIMEOUT) { // \x82܂\xBE\x91\x97\x90M\x82\xB5\x82Ă\xA2\x82Ȃ\xA2 - *writed = 0; + p->write_requested = true; return ERROR_IO_PENDING; } else if (wait == WAIT_OBJECT_0) { @@ -405,26 +408,16 @@ r = GetOverlappedResult(h, &p->wol, &writed_, FALSE); if (r) { // \x8F\x91\x82\xAB\x8D\x9E\x82݊\xAE\x97\xB9 - *writed = writed_; - return ERROR_SUCCESS; + goto write_complete; } else { err = GetLastError(); p->state = comdata_t::STATE_ERROR; - *writed = 0; return err; } } - else if (wait == WAIT_ABANDONED) { - // \x82ǂ\xF1\x82ȂƂ\xAB\x94\xAD\x90\xB6\x82\xB7\x82\xE9? event\x88ُ\xED? + else { // wait == WAIT_ABANDONED || WAIT_FAILED p->state = comdata_t::STATE_ERROR; - *writed = 0; - return ERROR_INVALID_OPERATION; - } - else { - // WAIT_FAILED - p->state = comdata_t::STATE_ERROR; - *writed = 0; DWORD e = GetLastError(); return e; } @@ -431,21 +424,23 @@ } else { p->state = comdata_t::STATE_ERROR; - *writed = 0; DWORD e = GetLastError(); return e; } } - else { - if (writed != NULL) { - *writed = writed_; - } - p->write_left -= writed_; - if (p->write_left != 0) { - p->write_requested = true; - } - return ERROR_SUCCESS; + + // \x8F\x91\x82\xAB\x8D\x9E\x82݊\xAE\x97\xB9 +write_complete: + if (writed != NULL) { + *writed = writed_; } + p->write_left -= writed_; + if (p->write_left != 0) { + // \x82\xB7\x82ׂď\x91\x82\xAB\x8D\x9E\x82ݍς݂ł͂Ȃ\xA2,pending + p->write_requested = true; + return ERROR_IO_PENDING; + } + return ERROR_SUCCESS; } static DWORD ctrl(device_t *device, device_ctrl_request request, ...) Modified: branches/ttcomtester/tools/ttcomtester/main.cpp =================================================================== --- branches/ttcomtester/tools/ttcomtester/main.cpp 2023-02-02 11:44:19 UTC (rev 10560) +++ branches/ttcomtester/tools/ttcomtester/main.cpp 2023-02-02 13:31:49 UTC (rev 10561) @@ -486,7 +486,7 @@ else { if (state == STATE_OPEN) { if (write_pending) { - printf("writing..\n"); + printf("writing(pending)..\n"); } else { char send_text[2]; @@ -494,9 +494,10 @@ send_text[0] = (char)c; DWORD e = ope->write(dev, send_text, 1, &sent_len); if (e == ERROR_SUCCESS) { - printf("send %02x, %zu byte\n", c, sent_len); + printf("send %02x, sent %zu byte\n", c, sent_len); } else if (e == ERROR_IO_PENDING) { + printf("send %02x, sent %zu byte pending\n", c, sent_len); write_pending = true; } else {