Вопрос про windows iocp - PullRequest
2 голосов
/ 06 мая 2009

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

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

code1:

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);
    }


}

1 Ответ

3 голосов
/ 06 мая 2009

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

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

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

int main() {
    OVERLAPPED o = {0}; 
    // ...
...