我查看了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;
CONFIGRETRETURN_TYPE的别名,RETURN_TYPEDWORD的别名,并通过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相比)。根本不用于静态链接。

08-06 12:55