【问题标题】:What does all capitalized Function name means in WinAPI?WinAPI中全大写的函数名是什么意思?
【发布时间】:2019-03-18 10:52:04
【问题描述】:

通知提供者目录枚举正在启动

`

PRJ_START_DIRECTORY_ENUMERATION_CB PrjStartDirectoryEnumerationCb;

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

` 我很困惑如何使用这个功能。

【问题讨论】:

  • 函数的名字是PrjStartDirectoryEnumerationCb,不是比平常大写的吗?无论如何,这似乎是一个回调函数,因此它不是 Windows API 中的函数,而是您(或其他应用程序开发人员)自己编写的函数。这是回调函数的官方文档:docs.microsoft.com/en-us/windows/desktop/api/projectedfslib/…
  • 这意味着我可以定义一个具有相同参数但名称不同的函数,并且它的工作方式相同?
  • 是的,你可以随意命名。

标签: windows winapi projfs


【解决方案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 文档通常显示一个示例,说明如何为回调编写方法签名,并且该示例通常被简化以去除工具集所需的多余内容,留下开发人员在编写回调时需要定义的内容.

在这种情况下,示例函数称为PrjStartDirectoryEnumerationCb,但没有使用该名称定义函数。您可以定义一个看起来像您在 MSDN 上看到的函数。它不必具有相同的名称——您可以随意命名它,然后在需要回调的任何地方使用您的函数名称。

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

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2021-11-05
    • 2013-05-28
    • 2011-10-05
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多