Вопрос про windows iocp

Когда я пишу программу о порте завершения ввода-вывода в Windows Vista, первый пример не работает, и GetQueuedCompletionStatus() не может получить структуры OVERLAPPED.

Поэтому я поместил структуру OVERLAPPED в глобальную область видимости, и она отлично работает. Это почему?

КОД1:

int main()
{
    OVERLAPPED o;
    ..
    CreateIoCompletionPort(....);

    for (int i = 0; i<10; i++)
    {
        WriteFile(..,&o);

        OVERLAPPED* po;
        GetQueuedCompletionStatus(..,&po);
    }


}

КОД2:

OVERLAPPED o;

int main()
{

    ..
    CreateIoCompletionPort(....);

    for (int i = 0; i<10; i++)
    {
        WriteFile(..,&o);

        OVERLAPPED* po;
        GetQueuedCompletionStatus(..,&po);
    }


}

person Community    schedule 06.05.2009    source источник
comment
Отредактировал свой пост когда-то. Возможно, вы захотите взглянуть еще раз.   -  person dirkgently    schedule 06.05.2009


Ответы (1)


Хорошо! Это из примечаний страницы MSDN структуры OVERLAPPED. раздел:

Любые неиспользуемые элементы этой структуры всегда должны быть инициализированы нулем, прежде чем структура будет использоваться в вызове функции. В противном случае функция может завершиться ошибкой и вернуть ERROR_INVALID_PARAMETER.

Глобальные значения инициализируются нулями, а локальные — нет. Если вы планируете использовать прежний код, вам необходимо обнулить память:

int main() {
    OVERLAPPED o = {0}; 
    // ...
person dirkgently    schedule 06.05.2009
comment
В первой программе GetQueuedCompletionStatus() просто ждет, пока не истечет время. Кажется, я никак не могу вызвать GetLastError(). - person ; 06.05.2009