#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
}