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;
CONFIGRET
是 RETURN_TYPE
的别名,RETURN_TYPE
是 DWORD
的别名,通过 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)。它根本不用于静态链接。
我查看了 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;
CONFIGRET
是 RETURN_TYPE
的别名,RETURN_TYPE
是 DWORD
的别名,通过 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)。它根本不用于静态链接。