HRESULT:区分自定义代码和系统一
Posted
技术标签:
【中文标题】HRESULT:区分自定义代码和系统一【英文标题】:HRESULT: distinguish custom code from system one 【发布时间】:2018-02-14 12:07:31 【问题描述】:类似的问题was asked before,但我还没有找到答案。
据我了解,为了制作自定义 HRESULT 代码,我创建了一个 .mc
文件来描述代码,然后编译它并获得一个 .h
文件。但我不知道如何防止可能与系统重叠。
例子:
LanguageNames=(English=0x409:MSG00409)
MessageId = 0x0
Severity = Success
Facility = Application
SymbolicName = CUSTOME_CODE
Language=English
Cusome message
.
产生
#define CUSTOME_CODE 0x00000000L
其实和S_OK
是一样的。
如果我从我的方法中返回 CUSTOME_CODE
,调用者无法将其与 S_OK
区分开来;
Wiki 说 HRESULT 包含一些用于区分 Microsoft/用户定义的代码属性,但我不明白如何设置它。 MSDN 还说该位只是“保留”。
如何制作不能与系统代码重叠的代码?
【问题讨论】:
参见HRESULT、mc.exe 的文档和message text files 的规范。要创建HRESULT
标头,请使用 -o
命令行选项。要设置客户位,请使用-c
命令行选项。您可能希望在顶部定义一些符号名称,例如SeverityNames=(Success=0 Fail=2)
和 FacilityNames=(FACILITY_ITF=4)
.
没有技术上的区别。您应该像地球上所有非 Microsoft 开发人员一样使用 FACILITY_ITF,他们可以愉快地定义碰撞错误代码,所以这只是一派胡言。请注意,为了增加混淆,有一些 Microsoft 组件使用 FACILITY_ITF ...
@SimonMourier,您还可以通过-c
在生成的代码中设置客户位,但实际上这对于HRESULT
代码是非标准的。它是为NTSTATUS
代码保留的。
使用我自己的代码时(比如说,如果它不是在全球范围内分发的东西),我会使用我的自定义设施编号,它不会与 Microsoft 的编号冲突(比如一个高编号),尽管我知道这很糟糕:-)
@eryksun 如果约定自定义 HRESULT 必须使用 FACILITY_ITF,那么设置客户位的意义何在?
【参考方案1】:
描述特定接口返回代码的 HRESULT 应包含FACILTY_ITF
设施代码。但请注意,0x0000 和 0x01FF 之间的返回值是为 COM 定义的 FACILITY_ITF
代码保留的。
有关详细信息,请参阅this 链接。
【讨论】:
HRESULT 也有一个内部结构。 (***)en.wikipedia.org/wiki/HRESULT 和(MSDN)msdn.microsoft.com/en-us/library/windows/desktop/…以上是关于HRESULT:区分自定义代码和系统一的主要内容,如果未能解决你的问题,请参考以下文章