Почему WaitCommEvent не работает с win2000?
C win98 у меня все в порядке.
Т.е. я отправляю в порт данные и жду когда ко мне прийдет ответ или прервется связь... просто жду какогото события. И под 98 — все в порядке все заданные в setcommmask — отлавливаются.
А под 2000 — нихрена. .
Может подскажете где искать ответ?
Или хотя бы, в чем может быть проблема.
Зараннее спасибо.
16.01.03 23:09: Перенесено модератором из 'Сети, сокеты, протоколы' в WinAPI — ХД
Здравствуйте, SSAlex, Вы писали:
SSA>Почему WaitCommEvent не работает с win2000? SSA>C win98 у меня все в порядке.
SSA>Т.е. я отправляю в порт данные и жду когда ко мне прийдет ответ или прервется связь... просто жду какогото события. И под 98 — все в порядке все заданные в setcommmask — отлавливаются. SSA>А под 2000 — нихрена. .
а по-подробнее можно? используется ли overlapped?...
Re[2]: Почему WaitCommEvent не работает с win2000?
Здравствуйте, SSAlex, Вы писали:
SSA>Здравствуйте, dodson, Вы писали:
D>>а по-подробнее можно? используется ли overlapped?...
SSA>Да, есть такое дело; SSA>Я ему пишу: ну так в чем его "нерабочесть" проявляется?
if (WaitCommEvent(hCommPort,&dwMask,&ov))
{
// сюда попдаем если в событие которое мы ждем уже случилось
....
}else{
if(GetLastError() == ERROR_IO_PENDING){
// обрабат. overlapped:
switch(WaitForSingleObject(overlapped.hEvent, timeoutInSeconds * 1000)){ //ждем какое-то время
case WAIT_TIMEOUT: // не дождались
CloseHandle(overlapped.hEvent);
return TimeoutExceed;
break;
case WAIT_OBJECT_0: // чего-то дождались
...
...
}
SSA>А в overlapped я пишу:
SSA> OVERLAPPED ov;
SSA> ov.Offset = 0; SSA> ov.OffsetHigh = 0; SSA> ..... SSA> if(SetCommMask(hCommPort,EV_TXEMPTY | EV_CTS | EV_DSR |EV_RXCHAR | EV_RLSD)) SSA> ov.hEvent = CreateEvent(NULL,FALSE,NULL,NULL); SSA> ....
ну да, должно
Re[4]: Почему WaitCommEvent не работает с win2000?
Здравствуйте, dodson, Вы писали:
D>ну так в чем его "нерабочесть" проявляется?
D>
D>if (WaitCommEvent(hCommPort,&dwMask,&ov))
D> {
D>// сюда попдаем если в событие которое мы ждем уже случилось
D> ....
D> }else{
D> if(GetLastError() == ERROR_IO_PENDING){
D> // обрабат. overlapped:
D> switch(WaitForSingleObject(overlapped.hEvent, timeoutInSeconds * 1000)){ //ждем какое-то время
D> case WAIT_TIMEOUT: // не дождались
D> CloseHandle(overlapped.hEvent);
D> return TimeoutExceed;
D> break;
D> case WAIT_OBJECT_0: // чего-то дождались
D> ...
D> ...
D>}
D>
А нерабочесть его проявляется по-тому, что я-придурок, написал все до "else"
а после него — ничего.
Вот и получалось, что в overlapped у меня было событие, только ни как не обрабатывалось.
Но это я уже прошел.
Теперь у меня новая проблема:
после
...
GetOverlappedResult(hCommPort, &ov, NULL, true);
...
оно выкидывает ошибку
"Access violation at address 77E95DB in module 'Kernel32.dll'. Write of address 00000000"
Может для него нужен "особенный" overlapped?
И еще, где я могу посмотреть на код происшедшего события?
Может в &dwMask, который укзывался в WaitCommEvent?
if (WaitCommEvent(hCommPort,&dwMask,&ov))
Re[5]: Почему WaitCommEvent не работает с win2000?
Здравствуйте, SSAlex, Вы писали:
SSA>Теперь у меня новая проблема: SSA>после SSA>... SSA>GetOverlappedResult(hCommPort, &ov, NULL, true); SSA>... SSA>оно выкидывает ошибку SSA>"Access violation at address 77E95DB in module 'Kernel32.dll'. Write of address 00000000"
SSA>Может для него нужен "особенный" overlapped?
обычный у него overlapped. только по коду ты там вроде CloseHandle делаешь, и заставляешь ждать (посл.параметр GetOverlappedResult)
SSA>И еще, где я могу посмотреть на код происшедшего события?
см. SetEvent, PulseEvent
нет там вроде бы никаких кодов
а вот рез-т выполнения операции тебе вернет GetOverlappedResult (+GetLastError, если были ошибки)
SCS
Re[6]: Почему WaitCommEvent не работает с win2000?
Здравствуйте, SCS, Вы писали:
SCS>обычный у него overlapped. только по коду ты там вроде CloseHandle делаешь, и заставляешь ждать (посл.параметр GetOverlappedResult)
Ну да, удаляю. Только это в случае WAIT_TIMEOUT
А GetOverlappedResult — в случае WAIT_OBJECT_0
SCS>см. SetEvent, PulseEvent SCS>нет там вроде бы никаких кодов
SCS>а вот рез-т выполнения операции тебе вернет GetOverlappedResult (+GetLastError, если были ошибки)
Так мне вот что непонятно:
Когда я просто фиксирую событие
при помощи
WaitCommEvent(hCommPort,&dwMask,&ov),
То у меня в dwMask — событие
то есть из него я получаю одно из тех,
что разрешил в этих строчках
Да, количество переданных байт...
Но в SDK написано, что для WaitCommEvent этот параметр неопределен, значит ему должно быть все равно сколько там этих байт?
For a ConnectNamedPipe or WaitCommEvent operation, this value is undefined.
Re[8]: Почему WaitCommEvent не работает с win2000?
Здравствуйте, SCS, Вы писали:
SCS>Здравствуйте, SSAlex, Вы писали: SSA>>А как это сделать с GetOverlappedResult — неясно.
SCS>если GetOverlappedResult завершилась без ошибок, то dwMask содержит достоверную инф-, что произошло