CONFIGRET返回类型是什么意思?

What does the CONFIGRET return-type mean?

本文关键字:意思 是什么 返回类型 CONFIGRET      更新时间:2023-10-16

我看了看PnP配置管理器的功能,发现每个功能都以这三个宏开始:

CMAPI CONFIGRET WINAPI

我必须在CfgMgr32.h中查找CMAPI,它被定义为:

#if !defined (_CFGMGR32_)
#define CMAPI     DECLSPEC_IMPORT
#else
#define CMAPI
#endif

根据Tim Roberts关于内核模式下的DLL的文章,这允许带有CMAPI的函数在运行时或链接时加载。我们已经知道WINAPI只是一个调用约定的宏。

那么CONFIGRET呢?从CfgMgr32.h,定义为:

//
// Standardized Return Value data type
//
typedef _Return_type_success_(return == 0) DWORD        RETURN_TYPE;
typedef RETURN_TYPE  CONFIGRET;

我从来没有见过这个,这是什么意思?这些函数的返回类型是什么?

CONFIGRET的底层数据类型是DWORD,定义在CfgMgr32.h:

//
// Standardized Return Value data type
//
typedef _Return_type_success_(return == 0) DWORD        RETURN_TYPE;
typedef RETURN_TYPE  CONFIGRET;

CONFIGRETRETURN_TYPE的别名,RETURN_TYPEDWORD的别名,通过SAL注释附加了额外的语义信息(SAL注释由静态代码分析器使用)。

注释函数行为包含这个特定注释的详细信息:

_Return_type_success_(expr)

可以应用于类型定义。指示所有返回该类型且没有显式具有_Success_的函数都被注释为具有_Success_(expr)_Return_type_success_不能用于函数或函数指针的类型定义。


CMAPI预处理器符号在CfgMgr32.h中定义为

#if !defined (_CFGMGR32_)
#define CMAPI     DECLSPEC_IMPORT
#else
#define CMAPI
#endif

的用途与您所建议的不同:它允许库的使用者和生产者使用相同的头文件。生产者定义_CFGMGR32_预处理器符号,并提供函数定义。消费者没有定义_CFGMGR32_预处理器符号,CMAPI扩展为一个导入说明符(__declspec(dllimport),在ntdef.h中定义)。这用于加载时动态链接(相对于运行时动态链接)。它根本不用于静态链接。