File descriptor c windows

Файловый дескриптор (file descriptor) — это уникальный числовой идентификатор, который операционная система назначает каждому открытому файлу или ресурсу (сокету, каналу, устройству). Файловые дескрипторы в Linux и других UNIX-подобных операционных системах (ОС) очень важны, хотя используются и в Windows. Они помогают управлять вводом-выводом данных, позволяя программам обращаться к файлам и другим объектам через системные вызовы.

  • Для чего нужен файловый дескриптор?
    • 1. Обеспечивают взаимодействие между программами и ОС
    • 2. Управляют открытыми файлами и ресурсами
    • 3. Унифицируют работу с разными типами данных
    • 4. Перенаправляют стандартных потоков (stdin, stdout, stderr)
    • 5. Работают с многопоточной обработкой данных
    • 6. Контролируют утечки файловых дескрипторов
  • Файловый дескриптор в программировании: работа с разными ОС
  • Заключение

Для чего нужен файловый дескриптор?

Файловый дескриптор можно сравнить с номерком в гардеробе: вместо сданного пальто посетитель получает номер, по которому забирает одежду. Аналогично операционная система дает программе дескриптор, который используется для работы с конкретным файлом. Файловые дескрипторы в Linux и других ОС решают несколько задач.

1. Обеспечивают взаимодействие между программами и ОС

Когда программа открывает файл, она запрашивает у операционной системы доступ к нему. В ответ ОС выделяет файловый дескриптор, который программа использует для выполнения операций с этим файлом.

int fd = open("example.txt", O_RDONLY); // Открытие файла только для чтения
if (fd == -1) {
    perror("Ошибка открытия файла");
    return 1;
}

Это код на C/C++ для открытия файла, типичный в UNIX-подобных системах.

Важно: файловый дескриптор может быть только положительным числом. Если число отрицательное, как в примере, появится сообщение об ошибке.

2. Управляют открытыми файлами и ресурсами

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

3. Унифицируют работу с разными типами данных

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

int sockfd = socket(AF_INET, SOCK_STREAM, 0); // Создание TCP-сокета
if (sockfd == -1) {
    perror("Ошибка создания сокета");
    return 1;
}

Это код на C/C++ для создания сетевого TCP-сокета:

  • socket() — системный вызов для создания нового сокета.
  • AF_INET указывает на использование IPv4.
  • SOCK_STREAM означает TCP-протокол (надежная потоковая передача данных).
  • Результат сохраняется в sockfd (файловый дескриптор сокета).

Читайте также:
Компьютерная сеть: что это такое, основные принципы

4. Перенаправляют стандартных потоков (stdin, stdout, stderr)

В UNIX-подобных системах три стандартных потока ввода-вывода:

  • stdin (файловый дескриптор 0) для ввода данных.
  • stdout (дескриптор 1) для вывода обычных данных.
  • stderr (дескриптор 2) для вывода сообщений об ошибках.

Файловые дескрипторы позволяют изменять стандартные потоки ввода и вывода. Например, можно перенаправить вывод программы в файл:

ls > output.txt 2> errors.txt

Здесь stdout (1) перенаправляется в output.txt, а stderr (2) — в errors.txt.

5. Работают с многопоточной обработкой данных

Серверные приложения, например веб-серверы, часто работают с сотнями соединений одновременно. Файловые дескрипторы позволяют обрабатывать множество подключений, отслеживать их состояние и закрывать неиспользуемые соединения.

fd_set readfds;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
select(sockfd + 1, &readfds, NULL, NULL, NULL); // Ожидание активности на сокете

Это код для мониторинга активности на сокете через select(), где fd_set readfds — это набор файловых дескрипторов для отслеживания. Это классический способ ожидания данных на сокете без постоянного опроса (polling).

6. Контролируют утечки файловых дескрипторов

В системе можно установить ограничение на количество файловых дескрипторов. Это ограничение проверяется командой:

ulimit -n

Если программа открывает файлы, но не закрывает их, возникает утечка дескрипторов, что может привести к нехватке ресурсов. Отладить утечки можно с помощью следующих команд:

  • lsof — показывает список открытых файлов.
  • strace — отслеживает системные вызовы программы.

Также интересно:
Что такое DFS и для чего он используется?

Файловый дескриптор в программировании: работа с разными ОС

Файловые дескрипторы используются в UNIX-подобных системах и в OS Windows по-разному. Многие современные языки программирования, такие как Python, Java и другие, абстрагируют эти различия, предоставляя единый кросс-платформенный интерфейс для работы с файлами. Работа с дескрипторами часто скрыта за высокоуровневыми абстракциями.

Python:

with open('file.txt') as f:    # Объект файла скрывает дескриптор
    data = f.read()

Java:

try (FileInputStream fis = new FileInputStream("file.txt")) {
    // Класс FileInputStream управляет дескриптором
}

Node.js:

const fs = require('fs');
fs.readFile('file.txt', (err, data) => {
    // Асинхронное API скрывает работу с дескрипторами
});

Go:

file, err := os.Open("file.txt")
defer file.Close()
// os.File инкапсулирует дескриптор

Во всех примерах можно получить доступ к нативному дескриптору, если нужно работать с низкоуровневой операцией или системным вызовом. Вот как это сделать:

  • Python: f.fileno().
  • Java: getFD().getFD().
  • Node.js: fd свойство в некоторых объектах.
  • Go: file.Fd().

Заключение

Файловые дескрипторы лежат в основе взаимодействия программ с файлами и устройствами ввода-вывода. Хотя современные языки программирования скрывают работу с дескрипторами за удобными абстракциями, разработчикам стоит разобраться в их работе, особенно при создании системных программ, сетевых приложений или при оптимизации производительности. Детальнее узнать о том, как используются файловые дескрипторы в программировании, можно на курсе Хекслет «Python: основы текстового ввода-вывода». Студенты учатся взаимодействовать с файлами и файловой системой, используя разные режимы и менеджеры контекста. Этот материал также пригодится тем, кто изучает Python.

Если вы столкнулись с ситуацией, когда Windows не находит указанный файл, хотя теоретически он должен существовать, или файл не открывается – не беспокойтесь: есть несколько способов решения проблемы, будь то файл с текстом статьи для сайта, видеоролик, логотип и так далее.

1. Проверьте правильность пути к файлу

Убедитесь, что название файла и путь к нему указаны правильно. Кроме того, некоторые программы при использовании файлов требуют, чтобы файл находился на том же диске, что и программа (как правило, это старые программы или программы, запускаемые с помощью командной строки, например, TAR – архивирование данных). Если файл находится на другом диске, может потребоваться изменить диск или указать полный путь к файлу.

Пример использования программы tar из командной строки

Если после этого вы все еще не можете найти файл, попробуйте использовать поиск по имени файла или по расширению файла. Также необходимо проверить, что файл не защищен от записи и не используется в данный момент другим приложением (смотрим на панели задач, какие приложения запущены у вас на компьютере и не открыт ли в данный момент этот файл в другом приложении.

Если файл на флешке или на SD-карте, проверьте, нет ли на корпусе флеш-накопителя специального небольшого переключателя, блокирующего запись на накопитель, – он всегда присутствует на карточках формата SD, несколько реже встречается на типичных USB-накопителях. Нередки случайные переключения, когда флешка носится в кармане.

2. Проверьте наличие файла в «Корзине»

Удаленный файл, если он вдруг обнаружился в «Корзине», можно легко восстановить. Для этого перетащите его из «Корзины» на Рабочий стол.

Также можно кликнуть на файл в «Корзине» правой кнопкой мышки и выбрать команду «Восстановить». Тогда файл вернется в ту папку, из которой был удален.

3. Проверьте, не заблокирован ли файл антивирусом или другим пользователем

Если файл заблокирован антивирусом, то отключите защиту и попробуйте открыть его еще раз. Проверьте в антивирусной программе раздел «Карантин» – не находится ли файл там.

В случае, если файл все еще не открывается, перенесите его на другой компьютер и откройте его там.

Также файл может быть заблокирован другим пользователем (при общем доступе к папке на сервере), и стоит попросить его закрыть файл на своем компьютере. Система Windows позволяет одновременно запускать на компьютере сеансы от разных пользователей, при этом может оказаться, что разные пользователи работают с одним и тем же файлом. Чтобы посмотреть активные сеансы пользователей, нужно открыть диспетчер задач на вкладке «Пользователи», там же можно посмотреть, с какими программами работает тот или иной пользователь.

Активные пользователи

4. Проблема с компьютером

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

Часто бывает, что в системе могут быть не настроены пути среды PATH. Когда операционная система запускает ту или иную программу, она стартует новый процесс и передает ему информацию о настройках среды и окружения. PATH переводится как «тропа» или «путь», что прекрасно объясняет, почему вообще ОС может не видеть тот или иной файл. «Тропы» должны быть проложены, так сказать. Для проверки и настройки путей нужно сделать следующие шаги.

  • Нажмите клавиши Win+R на клавиатуре (в Windows 11 и Windows 10 можно нажать правой кнопкой мыши по кнопке Пуск и выбрать пункт «Выполнить»), введите sysdm.cpl в окно «Выполнить» и нажмите Enter.
  • Перейдите на вкладку «Дополнительно» и нажмите кнопку «Переменные среды».
  • Вы увидите список переменных среды пользователя (вверху) и системных переменных (внизу). PATH присутствует в обоих расположениях.
  • Если вы хотите добавить свой путь в PATH только для текущего пользователя, выберите «Path» в верхней части и нажмите «Изменить» (или дважды нажмите по переменной PATH в списке). Если путь актуален для всех пользователей — то выполните те же действия в нижней части.
  • Для добавления нового пути нажмите «Создать», а затем впишите новый путь, который требуется добавить в переменную PATH в новой строке. Вместо нажатия «Создать» можно дважды кликнуть по новой строке для ввода нового пути.
  • После ввода всех необходимых путей нажмите «Ок» — ваша папка или папки добавлены в переменную PATH.

Если это не помогло, то необходимо проверить компьютер на наличие вирусов и других проблемных программ – некоторые вредоносные программы могут прятать или маскировать файлы пользователя. Для этого всегда можно воспользоваться следующими программами:

  • ESET Online Scanner,
  • F-Secure Online Scanner,
  • Kaspersky Security Scan.

Не забудьте проверить наличие обновлений для операционной системы, которые могут улучшить ее работу и исправить ошибки. Для этого:

  • нажимаем кнопку «Пуск» в Windows,
  • набираем текст «проверить наличие обновлений»,
  • в списке выбираем «Проверить наличие обновлений»,

Меню «Пуск». Проверка наличия обновлений системы

  • откроется новое окно в котором будет представлена подробная информация о доступных обновлениях системы, нажимаем кнопку «Проверить наличие обновлений».

Системное окно проверки наличия обновлений

Далее остается только согласиться на установку обновлений.

5. Проверьте, не поврежден ли файл

Если вы заметили какие-либо повреждения (файл не открывается, вы получили сообщение об ошибке, содержимое представлено в неестественном виде и т.д.), воспользуйтесь специальными программами для восстановления поврежденных файлов (такими как: Recuva, EaseUS Data Recovery Wizard, Wise Data Recovery, MiniTool Power Data Recovery и подобных). Также убедитесь в том, что вы используете последнюю версию программы для открытия данного типа файлов (как правило, нужно посмотреть пункт «Обновления» в меню «О программе»).

Если вы проделали все вышеперечисленные действия, но проблема не была решена, то имеет смысл попробовать восстановить файл из резервной копии. Для этого нужно:

  • исследовать прежние версии в проводнике Windows,

Восстановление прежний версии файла в проводнике Windows

  • поискать файл и его версии на Яндекс Диске или Google Диске,

Восстановление прежний версии файла на Яндекс Диске

  • поискать файл и его версии на OneDrive.

Восстановление файла на OneDrive

В этом случае необходимо убедиться (смотрим дату изменения файла и содержание), что резервная копия была создана перед тем, как произошла потеря данных, иначе толку от восстановления не будет.

Заключение

Эксперты в области компьютерной техники и программного обеспечения давно знакомы с проблемой пропажи и нечитаемости файлов в Windows. Их чек-лист и приведен в статье.

Но если после всех этих действий вы так и не решили проблему, обратитесь все же к специалисту по информационным технологиям – случаи бывают разные и «на месте» разобраться с ними бывает проще.

Читайте также:

Как зайти в Инстаграм* через браузер в 2023 году: 5 способов

Умные таблицы в Excel: что это, как сделать и как все вернуть

Озон Селлер — полная инструкция для продавцов на 2023 год

Вопрос читателя сайта:

Привет, админ! Вопрос. 30 июля обновил свою Windows 8.1 до Windows 10. Получается, прошло уже три месяца её активного использования. Система с самого начала работала нормально, но заглючила, когда установил в неё много различного софта и игр (люблю забивать хламом компьютер). Короче, основные проблемы такие. Иногда Windows 10 может загрузиться с ошибкой, приходится выключать ноутбук и опять включать. Вдобавок не работает восстановление системы, при выключении компьютера происходит долгое завершение работы, не запускается браузер Internet Explorer и не открывается оснастка «Управление дисками». Как вы думаете, может сразу переустановить Windows 10 или попытаться как-то восстановить систему?

Проверка целостности системных файлов Windows 10

Привет всем. Переустановить Windows мы всегда успеем, сначала нужно попробовать одно хорошее средство и если уж оно не вернёт нашей операционной системе прежнюю надёжность, то переустановим её заново. В Windows 10, как и в других предыдущих операционках от Майкрософт, есть прекрасное средство проверки целостности компонентов, способное выполнять поиск поврежденных системных файлов и заменять их рабочими версиями в случае необходимости.


Примечание: Многие читатели часто интересуются, а где система берёт оригинальные версии файлов? Ответ. Файлы хранилища компонентов Windows 10 располагаются в папке C:\Windows\WinSxS, именно здесь винда берёт нормальный системный файл и заменяет им повреждённый.


Запустить средство проверки системных файлов очень легко. Открываем командную строку от имени администратора и вводим команду sfc /scannow, жмём Enter на клавиатуре.

 

Обычно проверка продолжается не больше 15 минут. В нашем случае всё хорошо и мы видим сообщение: Защита ресурсов Windows не обнаружила нарушений целостности. Это значит, что наша Windows 10 в идеальном состоянии.

Если же нарушения в компонентах Windows будут выявлены, то система выдаст такое предупреждение: Защита ресурсов Windows обнаружила поврежденные файлы и успешно их восстановила.  

Что делать, если средство проверки целостности системных файлов не может восстановить повреждённые компоненты Windows

Друзья, в некоторых случаях мы получим такое сообщение: Программа защиты ресурсов Windows обнаружила повреждённые файлы, но не может восстановить некоторые из них.  

Это значит, что хранилище оригинальных компонентов Windows 10 повреждено и оно препятствует восстановлению системных файлов при помощи утилиты sfc.exe. В этом случае нужно сначала восстановить само хранилище компонентов Windows 10, а затем запускать средство проверки системных файлов sfc.exe.

Восстанавливать хранилище компонентов будем с помощью средства Deployment Image & Servicing Management (Dism). Dism — это система обслуживания образов Windows.

Сначала проверим целостность хранилища оригинальных компонентов Windows 10 командой 

Dism /Online /Cleanup-Image /ScanHealth

Как видим, хранилище компонентов подлежит восстановлению,   

значит вводим следующую команду: 

Dism /Online /Cleanup-Image /RestoreHealth

При выполнении данной команды произойдёт восстановление хранилища компонентов с помощью средства Dism, использующего для получения отсутствующих файлов — Центр обновления Windows. 

Восстановление выполнено успешно. Повреждения хранилища компонентов было устранено.

Хранилище компонентов мы восстановили, теперь во второй раз запускаем проверку целостности системных файлов Windows 10 командой sfc /scannow.

В этот раз программа защиты ресурсов Windows успешно восстановила повреждённые системные файлы.

Друзья, если при проверке целостности системных файлов Windows 10 командой sfc /scannow вас будут преследовать различные ошибки, то примените для восстановления систему Dism или расширяемое средство автоматизации PowerShell, всё написано в нашей статье «Восстановление повреждённого хранилища компонентов Windows 10 с помощью PowerShell». И ещё для восстановления повреждённого хранилища системных компонентов вы можете воспользоваться программой Dism++, детали смотрите в статье «Восстановление повреждённого хранилища компонентов Windows с помощью программы Dism++«.


Примечание: друзья, если у вас не получается с помощью Dism восстановить целостность системных файлов, пробуйте это сделать путём обновления Windows 10 с сохранением установленных программ и личных файлов.


Всё рассмотренное выше мы проделали в работающей Windows 10, но бывают случаи, когда система не загружается именно из-за некорректных системных файлов, тогда запускать утилиту sfc.exe нужно в среде восстановления Win 10, как это сделать, читайте в следующей статье.

Статья по этой теме: Что делать, если при запуске sfc/scannow выдается ошибка «Защита ресурсов Windows не может выполнить запрошенную операцию»

Уязвимость BDU:2025-03926 (CVE-2025-29824) связана с ошибкой в драйвере Common Log File System (CLFS), который отвечает за управление структурированными лог-файлами в Windows. Уязвимость возникает из-за некорректной обработки объектов памяти при создании или модификации лог-файлов. Атакующий может создать специально сформированный лог-файл, который при обработке драйвером приводит к переполнению буфера или использованию неинициализированной памяти, что позволяет выполнить произвольный код в контексте системных привилегий (SYSTEM).

CVSS 3.0: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H


Технические детали уязвимости

  1. Условия эксплуатации:

    • Локальный доступ к системе (атакующий должен иметь возможность выполнить код с правами стандартного пользователя).

    • Отсутствие обновления безопасности.

    • Активный драйвер CLFS (по умолчанию включен в Windows 10/11 и серверных редакциях).

    Пример сценария: злоумышленник загружает вредоносный скрипт через фишинговое вложение, получает доступ к системе через RDP или физически, а затем запускает эксплойт.

  2. Механизм атаки:
    Эксплойт использует уязвимый метод ClfsCreateLogFile или ClfsWriteLog для манипуляции метаданными лог-файла. Например, при создании лог-файла атакующий подменяет структуру CLFS_LOG_BLOCK_HEADER, что приводит к повреждению памяти ядра.

    Пример псевдокода:

    // Создание malicious лог-файла
    HANDLE hLog = CreateFile("malicious.blf", ...);
    CLFS_LOG_BLOCK_HEADER* block = MapViewOfFile(hLog, ...);
    // Подмена размера блока для переполнения
    block->cbOffset = 0x1000; // Некорректное значение
    block->eBlockType = 0xBAD; // Невалидный тип
    // Вызов уязвимой функции
    DeviceIoControl(hDriver, IOCTL_CLFS_WRITE, block, ...);
  3. Эскалация привилегий:
    После переполнения драйвер CLFS обращается к поврежденным структурам, что позволяет атакующему перезаписать указатели в памяти ядра. Это может быть использовано для подмены токена процесса, например, замены токена пользователя на SYSTEM-токен в структуре _EPROCESS.


Где используется CLFS?

Драйвер CLFS интегрирован в компоненты Windows:

  • Система журналирования Event Viewer.

  • Службы Active Directory.

  • Приложения, использующие API WriteLog() или CreateLogFile(), например, базы данных или enterprise-решения для логирования.


Способы защиты

  1. Установка обновлений.

  2. Временная митигация:

    • Отключение драйвера CLFS через PowerShell.

    • Ограничение прав доступа к службе через групповые политики.

  3. Мониторинг:

    • Аудит вызовов clfs.sys в Sysmon.

    • Блокировка создания файлов с расширением .blf в ненадежных каталогах.

При разработке приложений на C++ для Windows разработчики неизбежно и довольно часто встречаются с такой неэкзотической сущностью как дескриптор. Их в Windows великое множество, при этом каждый обязательно после завершения работы с ним обязательно должен быть закрыт соответствующей функцией. Конечно, система после завершения процесса сама подчищает за ним, но с правильностью такого подхода лично я не согласен. Тем, кто пишет исключительно на C, позавидовать в этом случае непросто. Зато для разработчиков C++ есть масса облегчающих жизнь механизмов.

В данной статье я хочу рассмотреть универсальный класс, написанный мной, и рассчитаный на оборачивание практически любого Windows-дескриптора (возможно, я чего-то не знаю?).

Что представляют собой дескрипторы? С точки зрения Windows их можно разделить на дескрипторы объектов ядра и не-ядра, нас же интересует работа с ними на уровне C++, и, чтобы написать универсальный класс-обёртку, нам понадобится выявить их общие свойства. Далее я буду использовать словосочетание «освободить дескриптор», которое на самом деле должно звучать так: «освободить объект Windows через его дескриптор». Это чтобы избежать путаницы в терминологии — под объектом буду подразумевать объект языка C++.

Расммотрим жизненный цикл дескриптора:

1. Создание (инициализация). Все функции (или большинство), возвращающие дескриптор, в случае ошибки присваивают ему значение 0 (NULL) или -1 (0xFFFFFFFF, INVALID_HANDLE_VALUE). Значения больше ноля — успех.
2. Использование.
3. Освобождение, когда дескриптор более не нужен.

Последний пункт интересует больше всего — как освобождать дескриптор, когда сущесвует такое множество функций для этого? Могу перечислить несколько по памяти (которая в голове): CloseHandle, FindClose, closesocket, InternetCloseHandle и другие.

Ниже перечислены сигнатуры этих функций:

BOOL __stdcall CloseHandle( HANDLE );
BOOL __stdcall FindClose( HANDLE );
int __stdcall closesocket( SOCKET );
BOOL __stdcall InternetCloseHandle( HINTERNET );

Каждая из них принимает тип дескриптора и возвращает некое целое. Осталось только разобраться с тем, как научить наш класс правильно освобождать дескриптор — для этого идеально подойдёт всеядный reinterpret_cast.

Собственно, сам класс.

template class AutoHandle
{
NON_COPYABLE( AutoHandle );

public:

typedef BOOL ( WINAPI * CloseProc )( THandle );

AutoHandle( THandle handle_, CloseProc close_proc_ )
: m_handle( handle_ ),
m_close_proc( close_proc_ )
{
}

~AutoHandle() throw()
{
close();
}

int close()
{
if ( !valid() )
return false;

int ret = 0;

if ( m_close_proc )
ret = static_cast( m_close_proc( m_handle ) );

m_handle = 0;
return ret;
}

THandle handle() const
{
return m_handle;
}

bool valid() const
{
return !!m_handle && ( reinterpret_cast( INVALID_HANDLE_VALUE ) != m_handle );
}

AutoHandle& operator = ( THandle rhs_ )
{
close();
m_handle = rhs_;

return *this;
}

operator bool () const
{
return valid();
}

DWORD wait( DWORD milliseconds_ = 0 )
{
return ::WaitForSingleObject( m_handle, milliseconds_ );
}

protected:

THandle m_handle;

private:

CloseProc m_close_proc;

};

Описание класса

Это шаблонный класс, принимающий в качестве параметра шаблона тип дескриптора. NON_COPYABLE - это макрос, запрещающий копирование объекта, так как он не предполагает подсчёта ссылок.

#define NON_COPYABLE( clsname ) \
private: \
clsname( const clsname& ); \
clsname& operator = ( const clsname& );

Далее идёт объявление прототипа функции, используемой для освобождения дескриптора. С его помощью можно в конструкторе указать адрес на функцию, сделав приведение в стиле reinterpret_cast. Класс снабжён функциями для передачи типа дескриптора Win32API-функциям, проверки на валидность, а также использования WaitForSingleObject. Шаблоны хороши ещё и тем, что те методы класса, сгенерированного из шаблона, которые не вызываются в клиентском коде, не компилируются. Поэтому при работе, скажем, с сокетом, если не будете делать вызова wait (а он и не рассчитан для сокетов), ошибок не будет.
Член m_handle класса объявлен защищённым, а не закрытым, неспроста - класс расширяемый. Но при этом нет смысла в виртуальном деструкторе, так как дескриптор - не та сущность, для которой актуален полиморфизм (сравните с ЦДельфин: public ЦРыба - да-да, дельфин - это рыба!). Зато мы сэкономим память за счёт того, что у нас не будет лишних указателей на виртуальные таблицы.

Небольшой пример

AutoHandle my_event( ::OpenEvent( READ_CONTROL | SYNCHRONIZE | EVENT_MODIFY_STATE,
FALSE, _T( "COOL_EVENT_SHA_LA_LA" ) ), ::CloseHandle );

if ( my_event.valid() )
return;
else
my_event = ::CreateEvent( 0, FALSE, FALSE, _T( "COOL_EVENT_SHA_LA_LA" ) );

//.......................

if ( WAIT_OBJECT_0 == my_event.wait( INFINITE ) )
{
// Дождались
}

my_event.close(); // Не обязательно

Если сигнатура функции не совпадает с CloseProc, используйте reinterpret_cast.

Вот и всё. Спасибо, что дочитали до конца :)

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Ошибка 0x800f080c имя компонента microsoft hyper v неизвестно имя компонента windows не распознано
  • Смартфоны huawei на windows phone
  • Hp laserjet m141w драйвер windows 10
  • Отредактировать uefi windows 10
  • Топ игр для планшетов windows