Что означает название всех функций с заглавной буквы в WinAPI?

#windows #winapi #projfs

#Windows #winapi #projfs

Вопрос:

Сообщает поставщику, что начинается перечисление каталогов

`

 PRJ_START_DIRECTORY_ENUMERATION_CB PrjStartDirectoryEnumerationCb;

HRESULT PrjStartDirectoryEnumerationCb(
  const PRJ_CALLBACK_DATA *callbackData,
  const GUID *enumerationId
)
{...}
  

`
Я не понимаю, как использовать эту функцию.

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

1. Имя функции — PrjStartDirectoryEnumerationCb , которое не более заглавное, чем обычно, не так ли? В любом случае, это, похоже, функция обратного вызова, так что это не функция в Windows API, а функция, которую вы (или какой-либо другой разработчик приложения) написали самостоятельно. Вот официальная документация по функции обратного вызова: learn.microsoft.com/en-us/windows/desktop/api/projectedfslib /…

2. Это означает, что я могу определить функцию с тем же параметром, но другим именем, и она будет работать так же?

3. Да, вы можете назвать это как угодно.

Ответ №1:

Вы смотрите на обратный вызов (общая концепция программирования, не специфичная для Win32), который обычно является ссылкой на функцию, которую вы должны написать самостоятельно. Для того, чтобы компилятор C / C проверил, правильно ли вы определили свою функцию обратного вызова, и для упрощения использования таких обратных вызовов часто используется typedef . Win32 API часто использует все заглавные буквы для определения типов обратных вызовов. В данном случае, PRJ_START_DIRECTORY_ENUMERATION_CB это тип указателя на функцию (указатель на функцию обратного вызова, которую вы должны написать), и он определяется в projectedfslib.h как:

 typedef
_Function_class_(PRJ_START_DIRECTORY_ENUMERATION_CB)
HRESULT
(CALLBACK PRJ_START_DIRECTORY_ENUMERATION_CB)(
    _In_ const PRJ_CALLBACK_DATA* callbackData,
    _In_ const GUID* enumerationId
    );
  

В этом определении содержится много лишнего, что помогает набору инструментов Microsoft проверять различные вещи, связанные с использованием этого типа указателя на функцию. При написании вашей собственной функции, которая работает для этого типа обратного вызова, вам необязательно повторять многое из того, что используется в typedef . Документация MSDN по обратным вызовам часто показывает пример того, как вы могли бы написать сигнатуру метода для вашего обратного вызова, и этот пример обычно упрощен, чтобы убрать лишний материал, необходимый для набора инструментов, оставляя материал, который разработчик должен определить при написании своего обратного вызова.

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

 HRESULT MyCallback(const PRJ_CALLBACK_DATA *callbackData, const GUID* enumerationId)
{
     // implement your callback here
}