【问题标题】:How could HRESULT appear in an MIDL file?HRESULT 怎么会出现在 MIDL 文件中?
【发布时间】:2011-03-27 22:06:35
【问题描述】:

我正在开发一些带有 IDL 文件的 COM 接口。一些接口方法返回HRESULT,但是我检查了MIDL language reference on MSDN,没有HRESULT的线索。那么在哪里可以找到这种数据类型的官方定义呢?

更新

感谢 Shog9,我在 wtypes.idl 中找到了它。我把它贴在这里给别人看:

    ...
    cpp_quote("#ifndef _HRESULT_DEFINED")
    cpp_quote("#define _HRESULT_DEFINED")
    #if defined(_STRICT_HRESULT)
    typedef struct _HRESULT_STRUCT {
            DWORD Data1;
    } HRESULT_STRUCT, *PHRESULT_STRUCT;
    typedef PHRESULT_STRUCT HRESULT;
    #else // defined(_STRICT_HRESULT)
    cpp_quote("#ifdef __midl")
    typedef LONG HRESULT;
    ...

但是,当我在 IDL 文件中显式使用 DWORD 或 LONG 时,MIDL 编译器将报告错误:

"error MIDL2269: procedures in an object interface must return an HRESULT" 

有点可笑……

【问题讨论】:

    标签: c# c++ com interop


    【解决方案1】:

    任何实用的 .idl 文件都应该以

    开头
    import "oaidl.idl";
    import "ocidl.idl";
    

    其中声明了基本类型。像 HRESULT 和 VARIANT。等等。

    【讨论】:

    • 我已经检查了这两个文件。未找到 HRESULT 的定义。我错过了什么吗?
    • 您可能错过了这些文件中的所有包含指令。你有真正的问题吗?
    【解决方案2】:

    它实际上只是 DWORD 的别名(它是 unsigned long 的别名)。它是 wtypes.idl 中为 MIDL 定义的#defined,as Hans notes 是由标准导入机制引入的。

    HRESULT 的目的是以一致可识别的方式表示返回码 - 无论来源或值中编码的其他信息如何,都可以识别成功和失败,并且某些系统定义的值在耦合时被赋予特殊含义带有标准接口。 See MSDN了解详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      相关资源
      最近更新 更多