ReadDirectoryChangesW

Тема в разделе "WASM.WIN32", создана пользователем Twister, 26 июл 2007.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    [ReadDirectoryChangesW]

    Доброго всем времени суток.

    Возник нехитрый вопрос. Устанавливаю слежку за изменениями на диске. Когда возникает очередное событие, пытаюсь с помощью ReadDirectoryChangesW узнать, что же там такое произошло. Но при ее вызове поток замирает. Olly при этом пишет "Running", значит где-то что-то зацикливается. Подскажите, может я где-то ошибся с параметрами?

    Код (Text):
    1. procedure FileWatchingThread(lpParam: pointer);
    2. var
    3.   bWatchSubTree: boolean;
    4.   dwWaitStatus, dwBytesReturned: DWORD;
    5.   hDir: DWORD;
    6.   pMem: PFILE_NOTIFY_INFORMATION;
    7. begin
    8. while not bCanTerminate do
    9.   begin
    10.   dwWaitStatus := WaitForMultipleObjects(1, @dwChangeHandle, false, INFINITE);
    11.   bWatchSubTree := false;
    12.   hDir := CreateFile(PChar(szDirectories[dwWaitStatus]), FILE_LIST_DIRECTORY,
    13.                      FILE_SHARE_READ or FILE_SHARE_DELETE, nil,
    14.                      OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
    15.   if hDir <> INVALID_HANDLE_VALUE then
    16.     begin
    17.     pMem := VirtualAlloc(nil, $4000, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
    18.     asm int 3 end;
    19.     if ReadDirectoryChangesW(hDir, pMem, $4000, bWatchSubTree, FILE_NOTIFY_CHANGE_FILE_NAME,
    20.                           @dwBytesReturned, nil, nil) then
    21.       begin
    22.       ShowMessage('ReadDirectoryChangesW');
    23.       end;
    24.     VirtualFree(pMem, 0, MEM_RELEASE);
    25.     CloseHandle(hDir);
    26.     end;
    27.   FindNextChangeNotification(dwChangeHandle[dwWaitStatus]);
    28.   end;
    29. end;
     
  2. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    http://www.delphikingdom.com/asp/answer.asp?IDAnswer=33799
     
  3. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    slow
    Спасибо. Глянув на код я понял, что у меня нет ошибок в параметрах. Просто ReadDirectoryChangesW ждет изменений, так же как и WaitForMultipleObjects - получается я ждал одного события двумя функциями, естественно что возникшее событие не доходило до ReadDirectoryChangesW и она начинала ждать другое.

    Спасибо еще раз, вопрос закрыт.