Почему WaitCommEvent не работает с win2000?
От: SSAlex  
Дата: 13.01.03 10:18
Оценка:
Почему WaitCommEvent не работает с win2000?
C win98 у меня все в порядке.

Т.е. я отправляю в порт данные и жду когда ко мне прийдет ответ или прервется связь... просто жду какогото события. И под 98 — все в порядке все заданные в setcommmask — отлавливаются.
А под 2000 — нихрена. .
Может подскажете где искать ответ?
Или хотя бы, в чем может быть проблема.
Зараннее спасибо.

16.01.03 23:09: Перенесено модератором из 'Сети, сокеты, протоколы' в WinAPI — ХД
Re: Почему WaitCommEvent не работает с win2000?
От: dodson  
Дата: 13.01.03 10:28
Оценка:
Здравствуйте, SSAlex, Вы писали:

SSA>Почему WaitCommEvent не работает с win2000?

SSA>C win98 у меня все в порядке.

SSA>Т.е. я отправляю в порт данные и жду когда ко мне прийдет ответ или прервется связь... просто жду какогото события. И под 98 — все в порядке все заданные в setcommmask — отлавливаются.

SSA>А под 2000 — нихрена. .

а по-подробнее можно? используется ли overlapped?...
Re[2]: Почему WaitCommEvent не работает с win2000?
От: SSAlex  
Дата: 13.01.03 11:32
Оценка:
Здравствуйте, dodson, Вы писали:

D>а по-подробнее можно? используется ли overlapped?...


Да, есть такое дело;
Я ему пишу:
if (WaitCommEvent(hCommPort,&dwMask,&ov))
{
....
}

А в overlapped я пишу:

OVERLAPPED ov;

ov.Offset = 0;
ov.OffsetHigh = 0;
.....
if(SetCommMask(hCommPort,EV_TXEMPTY | EV_CTS | EV_DSR |EV_RXCHAR | EV_RLSD))
ov.hEvent = CreateEvent(NULL,FALSE,NULL,NULL);
....
Re[3]: Почему WaitCommEvent не работает с win2000?
От: dodson  
Дата: 13.01.03 12:57
Оценка:
Здравствуйте, 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?
От: SSAlex  
Дата: 16.01.03 16:00
Оценка:
Здравствуйте, 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?
От: SCS  
Дата: 16.01.03 16:12
Оценка:
Здравствуйте, 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  
Дата: 16.01.03 16:28
Оценка:
вот по этому адресу и получаешь Access violation:
GetOverlappedResult(hCommPort, &ov, NULL, true);
SCS
Re[6]: Почему WaitCommEvent не работает с win2000?
От: SSAlex  
Дата: 16.01.03 16:32
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>обычный у него overlapped. только по коду ты там вроде CloseHandle делаешь, и заставляешь ждать (посл.параметр GetOverlappedResult)

Ну да, удаляю. Только это в случае WAIT_TIMEOUT

А GetOverlappedResult — в случае WAIT_OBJECT_0



SCS>см. SetEvent, PulseEvent

SCS>нет там вроде бы никаких кодов

SCS>а вот рез-т выполнения операции тебе вернет GetOverlappedResult (+GetLastError, если были ошибки)


Так мне вот что непонятно:

Когда я просто фиксирую событие
при помощи
WaitCommEvent(hCommPort,&dwMask,&ov),
То у меня в dwMask — событие
то есть из него я получаю одно из тех,
что разрешил в этих строчках


if(SetCommMask(hCommPort,EV_TXEMPTY | EV_CTS | EV_DSR |EV_RXCHAR | EV_RLSD)) 
ov.hEvent = CreateEvent(NULL,FALSE,NULL,NULL);


А как это сделать с GetOverlappedResult — неясно.

С уважением, SSAlex.
Re[7]: Почему WaitCommEvent не работает с win2000?
От: SSAlex  
Дата: 16.01.03 16:35
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>вот по этому адресу и получаешь Access violation:

SCS>
SCS>GetOverlappedResult(hCommPort, &ov, NULL, true);
SCS>


Это понятно, непонятно что нужно сделать чтобы Access violation небыло
Re[7]: Почему WaitCommEvent не работает с win2000?
От: SCS  
Дата: 16.01.03 16:40
Оценка:
Здравствуйте, SSAlex, Вы писали:
SSA>А как это сделать с GetOverlappedResult — неясно.

если GetOverlappedResult завершилась без ошибок, то dwMask содержит достоверную инф-, что произошло
SCS
Re[8]: Почему WaitCommEvent не работает с win2000?
От: SCS  
Дата: 16.01.03 16:44
Оценка:
Здравствуйте, SSAlex, Вы писали:
SSA>Это понятно, непонятно что нужно сделать чтобы Access violation небыло
DWORD tmp;
...
GetOverlappedResult(hCommPort, &ov, &tmp, true);
SCS
Re[9]: Почему WaitCommEvent не работает с win2000?
От: SSAlex  
Дата: 16.01.03 18:13
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>Здравствуйте, SSAlex, Вы писали:

SSA>>Это понятно, непонятно что нужно сделать чтобы Access violation небыло
SCS>
SCS>DWORD tmp;
SCS>...
SCS>GetOverlappedResult(hCommPort, &ov, &tmp, true);
SCS>


Да, количество переданных байт...
Но в SDK написано, что для WaitCommEvent этот параметр неопределен, значит ему должно быть все равно сколько там этих байт?

For a ConnectNamedPipe or WaitCommEvent operation, this value is undefined.
Re[8]: Почему WaitCommEvent не работает с win2000?
От: SSAlex  
Дата: 16.01.03 18:14
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>Здравствуйте, SSAlex, Вы писали:

SSA>>А как это сделать с GetOverlappedResult — неясно.

SCS>если GetOverlappedResult завершилась без ошибок, то dwMask содержит достоверную инф-, что произошло


Огромное спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.