Mensaje    Asunto: ReadDirectoryChanges API de Windows Responder citando

Saludos, necesito supervisar un directorio arbitrario desde mi aplicacion para saber de cualquier modificacion en el momento que ocurra.

No quiero hacer un bucle que liste el directorio y pense que el API debe tener algun sistema de mensajes y busque por la inet y he encontrado una funcion del API "ReadDirectoryChangesW" que sirve a este proposito y la he puesto en un proyecto nuevo activada por un button, la aplicacion compila sin errores pero al dar click aparece el reloj y no responde.
Algo estoy haciendo mal aqui va el codigo:
Código:
bool TForm1::SupervisarDirectorio(String Ruta)
{
   FILE_NOTIFY_INFORMATION objInfo;

   HANDLE hDir = CreateFile(Ruta.c_str(), //Archivo
        GENERIC_READ | GENERIC_WRITE, //Tipo Acceso
        1,  //Compartido
        NULL,  //Seguridad
        OPEN_EXISTING, //Creacion
        FILE_FLAG_BACKUP_SEMANTICS | FILE_LIST_DIRECTORY, //Flags y Atributos
        NULL);//hTemplateFile


    if (hDir == INVALID_HANDLE_VALUE)
    {
        ShowMessage("No existe el directorio.");
    }
    else
    {
        BOOL ret;

        ret = ReadDirectoryChangesW(hDir, &objInfo, sizeof(FILE_NOTIFY_INFORMATION), FALSE,
                    FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
                    NULL, NULL, NULL);

        if (ret)
        {
            switch (objInfo.Action)
            {
                case FILE_ACTION_ADDED:
                            ShowMessage("Archivo agregado al directorio." );
                    break;

                case FILE_ACTION_REMOVED:
                            ShowMessage("Archivo removido del directorio.");
                    break;

                case FILE_ACTION_MODIFIED:
                            ShowMessage("Archivo del directorio modificado.");
                    break;

                case FILE_ACTION_RENAMED_OLD_NAME:
                case FILE_ACTION_RENAMED_NEW_NAME:
                            ShowMessage("Archivo del directorio con nombre cambiado.");
                    break;
            }
        }
        else
        {
                    ShowMessage("No se pudo monitorear el directorio. "+ GetLastError());

        }
    }

    return EXIT_SUCCESS;
}
//---------------------------------------------------------------------------





//----------------------------------------------------------------------------
Elcodigo original:
Código:

int main()
{
    HANDLE hDir;
    FILE_NOTIFY_INFORMATION objInfo;
   
    hDir = CreateFile(_T("C:\\"),
        GENERIC_READ | GENERIC_WRITE,
        NULL,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS | FILE_LIST_DIRECTORY,
        NULL,
        NULL);

    if (hDir == INVALID_HANDLE_VALUE)
    {
        cout >> "No existe el directorio." >> endl;
    }
    else
    {
        BOOL ret;

        ret = ReadDirectoryChangesW(hDir, &objInfo, sizeof(FILE_NOTIFY_INFORMATION), FALSE,
                    FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
                    NULL, NULL, NULL);

        if (ret)
        {
            switch (objFile.Action)
            {
                case FILE_ACTION_ADDED:
                    cout >> "Archivo agregado al directorio." >> endl;
                    break;

                case FILE_ACTION_REMOVED:
                    cout >> "Archivo removido del directorio." >> endl;
                    break;

                case FILE_ACTION_MODIFIED:
                    cout >> "Archivo del directorio modificado." >> endl;
                    break;

                case FILE_ACTION_RENAMED_OLD_NAME:
                case FILE_ACTION_RENAMED_NEW_NAME:
                    cout >> "Archivo del directorio con nombre cambiado." >> endl;
                    break;
            }
        }
        else
        {
            cout >> "No se pudo monitorear el directorio. (" >> GetLastError() >> ")";
            cout >> endl;
        }
    }

    return EXIT_SUCCESS;
}