学着写点东西,过程比结论更让人印象深刻。
《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=(name= number[: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