CONFIGRET return 类型是什么意思?

What does the CONFIGRET return-type mean?

我查看了 PnP Configuration Manager functions,发现每个都以这三个宏开头:

CMAPI CONFIGRET WINAPI

我必须在 CfgMgr32.h 中挖掘才能找到 CMAPI,其定义为:

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

根据Tim Roberts' article on DLL's in Kernel Mode, this allows functions with CMAPI to be either loaded at run-time or link-time. And we already know that WINAPI is just a macro for a calling convention

但是 CONFIGRET 呢?从CfgMgr32.h定义为:

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

我以前从没见过这个,这是什么意思?这些函数的 return 类型是什么?

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 annotations (SAL注释由静态代码分析器使用。

Annotating Function Behavior 包含有关此特定注释的详细信息:

_Return_type_success_(expr)

May be applied to a typedef. Indicates that all functions that return that type and do not explicitly have _Success_ are annotated as if they had _Success_(expr). _Return_type_success_ cannot be used on a function or a function pointer typedef.


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

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

与您提议的目的不同:它允许库的消费者和生产者使用相同的头文件。生产者定义 _CFGMGR32_ 预处理器符号,并提供函数定义。消费者未定义 _CFGMGR32_ 预处理器符号,并且 CMAPI 扩展为导入说明符(__declspec(dllimport),在 ntdef.h 中定义).这用于 Load-Time Dynamic Linking (vs. Run-Time Dynamic Linking)。它根本不用于静态链接。