В проге посылаю AT команду на модем. В потоке всё нормально работает в cms.cbInQue указано к примеру 45 байт. Но когда делается ReadFile ничего не читается, а GetLastError возвращает: ERROR_INVALID_PARAMETER. Почему? Код (Text): DWORD ThreadStatus(HANDLE hComPort) { char szTemp[1024]; OVERLAPPED ovpr; ovpr.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); SetCommMask(hComPort, EV_RXCHAR); while (1) { dwEventMask = 0; WaitCommEvent(hComPort, &dwEventMask, &ovpr); dwWait = WaitForSingleObject(ovpr.hEvent, INFINITE); switch (dwWait) { case WAIT_OBJECT_0: ClearCommError(hComPort, &dwError, &cms); if (cms.cbInQue > 0) { ReadFile(hComPort, &szTemp, cms.cbInQue, &dwBytes, &ovpr); ........ if (GetOverlappedResult(hComPort, &ovpr, &dwBytes, FALSE)) { MsgAdd(hDlg, IDC_LOGLIST, szTemp, 1); } } break; }
Этот код я в Visual Studio сделал. и заметил что в режиме Debug только не работает. А если скомпилировать как Release всё отлично работает. Почему так?
Используется вот Overlapped IO. А один убеждён, что OVERLAPPED-структуру при работе с портами можно [почти] не инициализировать?
так и не инициализируется он т.к. не надо. ovpr.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); - этого достаточно.
Тогда, раз отладочная версия работает, один может сравнить содержимое 'ovpr' перед вызовом ReadFile в Release и в Debug.
Ох. Это не делает материи же. Просто сравни значения параметров для ReadFile в рабочей и нерабочей версии – всё сразу будет видно.
ReadFile возвращает в обоих случаях: Код (Text): if (GetOverlappedResult(hComPort, &ovpr, &dwBytes, FALSE)) А вот это не работает в одладочной версии.