Почему нет ReadDirectoryChangesA?

#windows #winapi

#Windows #winapi

Вопрос:

В Winapis есть ReadDirectoryChangesW. Но нет ReadDirectoryChangesA.

Любопытно.
Почему это обрабатывается специально? Есть ли кто-нибудь, кто знает причину или историю?

Ответ №1:

Он никогда не существовал в Win98 / 98 / SE / Me. Многие (большинство?) Функции, Которые с самого начала были доступны только для NT (например, Net * API), доступны только в «широких» версиях (хотя в случае Net * они опустили суффикс «W»).

Комментарии:

1. Я не думаю, что это правильно. Есть много новых API, которые не существовали в Win 9x, которые имеют версии A и W. И на самом деле есть веская причина, по которой нет ReadDirectoryChangesA.

2. @John: Я думаю, что ваша логика в лучшем случае ошибочна. Ядро копирует данные в ваш буфер. Использование (эквивалента ядра) WideCharToMultibyte вместо прямого копирования было бы относительно тривиальным.

3. Ядро могло бы, но это было бы беспрецедентно. Это также нарушило бы работу существующих драйверов, поскольку на самом деле эту функциональность реализуют драйверы файловой системы.

4. @John: Это совсем не было бы беспрецедентным. Фактически, по сути, все функции *A представляют собой не что иное, как тонкую оболочку вокруг эквивалентной функции *W, которая принимает любые входные строки, преобразует их в Юникод, вызывает функцию *W, затем преобразует любые результаты Unicode обратно в многобайтовые символы и возвращает их вызывающему. Это уже было сделано сотни (если не тысячи) раз — еще один вряд ли можно считать невозможным.

5. Да, функции A являются оболочками, но они реализованы в пользовательском режиме и преобразуют выходные данные синхронного API. Насколько я знаю, нет собственного API (любой функции Nt ), который поддерживает как Unicode, так и ASCII.

Ответ №2:

Ядро внутренне использует кодировку Unicode. API Win32 с суффиксом W обычно преобразуются во внутренние API NtXxx. Версия Win32 API должна перевести из ASCII в Unicode, вызвать W-версию, а затем перевести любой вывод обратно в ASCII.

В случае ReadDirectoryChangesW последнюю часть невозможно выполнить, потому что данные считываются непосредственно из файловой системы в буфер вызывающего, и, возможно, после возврата API, поэтому невозможно реализовать ReadDirectoryChangesA.

Комментарии:

1. Я бы не осмелился сказать, что это невозможно . Возможно, сработало с каким-то установленным хуком. Я бы предпочел предположить, что MS посчитала, что это не стоит усилий…