【问题标题】:What does the CONFIGRET return-type mean?CONFIGRET 返回类型是什么意思?
【发布时间】:2015-10-15 13:34:13
【问题描述】:

我查看了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;

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

【问题讨论】:

  • 返回值为documented:"如果操作成功,函数返回CR_SUCCESS。否则返回Cfgmgr32.h中定义的以CR_为前缀的错误码之一。" 特定类型并不是很有趣。它恰好是一个带有SAL Annotations 注释的DWORD。这个简单地说:“0 表示成功”(参见Annotating Function Behavior)。 SAL 用于静态代码分析工具。
  • 很好,我从来不知道 SAL 注释。您为什么不在答案中总结您的评论,以便我接受?谢谢。
  • 上面的“这篇文章”链接已失效。请用工作链接替换它。
  • @Laxman 很好,下次我会尝试发布文章标题以帮助人们通过 Google 搜索找到。我已经更新了问题以包含最新的文章。由于历史原因,您也可以在返程机上查看截至2015年10月25日的文章:web.archive.org/web/20151025190943/http://www.wd-3.com/archive/…

标签: c++ winapi driver typedef return-type


【解决方案1】:

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)

可以应用于 typedef。表示所有返回该类型且没有明确具有 _Success_ 的函数都被注释为好像它们具有 _Success_(expr)_Return_type_success_ 不能用于函数或函数指针 typedef。


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)。它根本不用于静态链接。

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 2014-10-03
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多