我查看了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,这允许在运行时或链接时加载带有
CMAPI
的函数。我们已经知道WINAPI
只是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;
我以前从未见过,这是什么意思?这些函数的返回类型是什么?
最佳答案
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包含有关此特定注释的详细信息:
CfgMgr32.h中定义的
CMAPI
预处理器符号为#if !defined (_CFGMGR32_)
#define CMAPI DECLSPEC_IMPORT
#else
#define CMAPI
#endif
与您建议的目的不同,它的目的不同:它允许将相同的头文件用于库的使用者和生产者。生产者定义
_CFGMGR32_
预处理器符号,并提供函数定义。使用者没有定义_CFGMGR32_
预处理程序符号,并且CMAPI
扩展为导入说明符(__declspec(dllimport)
,在ntdef.h中定义)。这用于Load-Time Dynamic Linking(与Run-Time Dynamic Linking相比)。根本不用于静态链接。