Здравствуйте 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);
}