【发布时间】: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,那么设置客户位的意义何在?