Re: наследование OVERLAPPED
От: Alex Fedotov США  
Дата: 06.09.02 15:19
Оценка:
Здравствуйте Polevi, Вы писали:

P>Люди помогите разобраться..

P>Работаю с портами завершения ввода-вывода.
P>Создаю свой класс-наследник структуры OVERLAPPED

P>[...]


P>вот так выглядит поток, выбирающий сообщения из порта завершения


P>DWORD WINAPI WorkThreadProc(LPVOID lpParameter)

P>{
P>DWORD dwNumBytes, CompKey;
P>CDispatcher *disp;
P>for (;)
P>if (GetQueuedCompletionStatus(FCompPort->Handle,&dwNumBytes,
P>&CompKey, (OVERLAPPED **)&disp,INFINITE) && (dwNumBytes>0))
P>{
disp->>Complete(dwNumBytes);
P>}
P>else
P>....
P>....
P>}

P>Все отлично работает, но !!!

P>При попытке сделать ф-ию ReadComplete виртуальной — объект портится — то есть когда в порту появляется сообщение о завершении асинхронной операции — управление передается в Complete но все поля объекта содержат мусор... (кроме OVERLAPPED !!!)
P>Давно не занимался C++ — может ошибка очевидна, но не для меня :-)

Потому что запись (OVERLAPPED **)&disp в некотором смысле эквивалентна reinterpret_cast, а ты этого не хочешь. Надо переписать этот кусок примерно так:

OVERLAPPED * pOverlapped;
CDispatcher * pDisp;

if (GetQueuedCompletionStatus(..., &pOverlapped, ...))
{
    pDisp = static_cast<CDispatcher *>(pOverlapped);
    pDisp->Complete(dwNumBytes);
}
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.