使用MC.EXE定义错误码

本文介绍了如何使用MC.EXE工具来定义并使用自定义错误码。通过创建MC文件,定义错误码的严重性、设施和消息,然后编译生成资源文件,最终在C++程序中利用FormatMessage函数显示错误信息。文章详细讲述了整个过程,包括编码问题和错误码的冲突处理。
摘要由CSDN通过智能技术生成

学着写点东西,过程比结论更让人印象深刻。


《Windows核心编程》第一章最后提到:我们可以向自己的模块添加错误代码,说用MC.EXE工具。用Everything搜索了下,在我这是:“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\MC.Exe”。

忽然想到,公司里基本都是bool的错误判断,就觉得确实需要这样一种方法,因为它能够让开发这样写:

bool Func() {
std::ifstream ifs("D:\\xx.csv");
if(! ifs) {
SetLastError(MSG_CANNOT_OPEN_FILE);
return false;
}
//...

}

调用GetLastError()配合FormatMessage((),就能显示你定义好的错误描述了,比如:“无法打开文件xxx,该文件可能被占用”。

然后我就搜索这方面的blog,自己摸索着写,现在记录下这个过程。


1,用nodpad++新建一个文档,保存为test.mc。

2,这个mc文件的语法,网上有很多bolg有写,但大多是翻译了MSDN的内容,所以你可以直接去MSDN看。打开MSDN(我用的是本地MSDN),搜索SeverityNames,Message Text File那个就是了。

如果你看过《windows核心编程》几遍了,那应该知道错误码的格式,还有<winerror.h>的样子。

我照网上定义了一个mc文件,大致是这样:

;//文件开始。 单行注释用  ;//

MessageIdTypedef=DWORD

SeverityNames=(
  ;//错误码第31-30位

         Success=0x0:STATUS_SEVERITY_SUCCESS ;//语法:SeverityNames=(namenumber[:name]),第一个name是在本文件用的别名,下面类似

Informational=0x1:STATUS_SEVERITY_INFORMATIONAL

Warning=0x2:STATUS_SEVERITY_WARNING

Error=0x3:STATUS_SEVERITY_ERROR

)

FacilityNames=(;//错误码第27-16位

System=0x0:FACILITY_SYSTEM

Runtime=0x2:FACILITY_RUNTIME

Stubs=0x3:FACILITY_STUBS

Io=0x4:FACILITY_IO_ERROR_CODE

)

;//语言,先在代码里用DWORD dwLangId = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);调试看是多少,转16进制。

;// dwLangId = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED); 中文

LanguageNames=(English=0x409:MSG00409)

LanguageNames=(Chinese=0x804:MSG00804)


;//下面是消息定义

MessageId=0x1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值