Что означает название заглавной функции в WinAPI? - PullRequest
0 голосов
/ 18 марта 2019

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

`

PRJ_START_DIRECTORY_ENUMERATION_CB PrjStartDirectoryEnumerationCb;

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

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

1 Ответ

1 голос
/ 18 марта 2019

Вы смотрите на обратный вызов (общая концепция программирования, не специфичная для 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 для обратных вызовов часто показывает пример того, как вы бы написали сигнатуру метода для вашего обратного вызова, и этот пример обычно упрощается, чтобы убрать лишние вещи, необходимые для набора инструментов, оставляя вещи, которые разработчик должен определить при написании своего обратного вызова.

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

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