终于皇天不负有心人,我在微软官网上找到了FormatMessage的说明,自己实现了这个功能,现在讲这个部分记录下来,以供大家参考 void CNTLookErrorDlg::OnBnClickedBtnLookup LoadLibrary(_T("NTDLL.DLL")); DWORD dwErrCode = 0; dwErrCode = GetDlgItemInt(IDC_EDIT_ERRCODE); FormatMessage LocalFree( lpMessageBuffer ); FreeLibrary(Hand); } 这是用mfc写的一段代码,首先加载NTDLL.dll文件,然后调用FormatMessage 有了这个信息,剩下的就交给FormatMessage来进行格式化啦。这样一个简单的工具就完成了,再也不用满世界的找对应关系然后手工对比了
此外还可以定义 defaultMessage,也就是语言包没有对应的 key 的时候的默认值: useIntl 有很多 api,比如 formatMessage 的 api 就是根据 id 取不同 message (messsages.username)} name="username" rules={[{ required: true, message: intl.formatMessage (messsages.password)} name="password" rules={[{ required: true, message: intl.formatMessage message 支持占位符,比如这样: 用的时候传入具体的值:
MessageFormatter::formatMessage() 这个静态方法可以一次性地指定语言、预操作语句以及替换参数,不需要先进行实例化再调用 format() 方法。 echo MessageFormatter::formatMessage('zh_CN', '今天是 {3, date, full},当前时间为 {3, time, ::Hms}, 我要准备开始 {0} echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, =0{no cat} =1{a cat} other{# cats}} ', [0]),PHP_EOL; // I Have no cat echo MessageFormatter::formatMessage('en_US', 'I Have {0, plural, = echo MessageFormatter::formatMessage('zh_CN', '我{0, plural, =0{没有猫} other{有 # 只猫}}', [0]),PHP_EOL; //
= ERROR_SUCCESS) { //将错误码(可指定自然语言)格式化输出 DWORD res = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM 0, NULL); MessageBox(NULL, (PCTSTR)hlocal, TEXT("err"), MB_OK); } //FormatMessage DWORD_PTR)szMonth, (DWORD_PTR)szDay }; const DWORD size = 100 + 1; WCHAR buffer[size]; if (FormatMessage
FormatTimestamp Formatter FormatLevel Formatter FormatCaller Formatter FormatMessage FormatErrFieldValue Formatter } ConsoleWriter定义了TimeFormat、FormatTimestamp、FormatLevel、FormatCaller、FormatMessage } else { f = w.FormatTimestamp } case MessageFieldName: if w.FormatMessage == nil { f = consoleDefaultFormatMessage } else { f = w.FormatMessage (i interface{}) string { return strings.ToUpper(fmt.Sprintf("| %-6s|", i)) } output.FormatMessage
FormatTimestamp Formatter FormatLevel Formatter FormatCaller Formatter FormatMessage FormatErrFieldValue Formatter } ConsoleWriter定义了TimeFormat、FormatTimestamp、FormatLevel、FormatCaller、FormatMessage } else { f = w.FormatTimestamp } case MessageFieldName: if w.FormatMessage == nil { f = consoleDefaultFormatMessage } else { f = w.FormatMessage (i interface{}) string { return strings.ToUpper(fmt.Sprintf("| %-6s|", i)) } output.FormatMessage
但是windows中的错误码实在太多,有的时候错误码并不直观,windows为每个错误码都关联了一个错误信息的文本,想要通过错误码获取对应的文本信息,可以通过函数FormatMessage来获取。 FILE_ATTRIBUTE_NORMAL, NULL)) { LPTSTR lpMsg = NULL; DWORD dwLastError = GetLastError(); FormatMessage 程序首先以打开已存在文件的方式打开一个文件,由于这个文件并不存在,所以函数出错,我们通过GetLastError获取错误码,然后通过FormatMessage来进行转化,该函数原型如下: DWORD FormatMessage 然后进行简单的格式化之后输出错误字符串,最后需要释放内存,虽然FormatMessage函数帮我们分陪了缓冲,但是它不负责释放,需要我们自行释放。
props$pathname, breadcrumb = props.breadcrumb, breadcrumbMap = props.breadcrumbMap, formatMessage = props.formatMessage, title = props.title, _props$menu = props.menu, menu = _props == false && currRouterData.locale && formatMessage) { pageName = formatMessage({ id: currRouterData.locale
if (extraSleepTime > warnThresholdMs) { ++numGcWarnThresholdExceeded; LOG.warn(formatMessage else if (extraSleepTime > infoThresholdMs) { ++numGcInfoThresholdExceeded; LOG.info(formatMessage
AbstractDiagnosticFormatter.java:167) at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage BasicDiagnosticFormatter.java:111) at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage AbstractDiagnosticFormatter.java:167) at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage BasicDiagnosticFormatter.java:111) at jdk.compiler/com.sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage
params: ["value"] } ]};AIGC生成结果:sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/base/strings/formatMessage "], function(Controller, formatMessage) { return Controller.extend("myapp.controller.SalesOrders", { : context.getProperty("OrderID") }); }, formatCurrency: function(value) { return formatMessage
没错,我们可以通过FormatMessage函数,将错误号转化为相应的错误描述,这个函数对于寻找错误原因非常有用。 include <strsafe.h> void PrintError(DWORD dwErrcode) { LPVOID lpMsgBuf; LPVOID lpDisplayBuf; FormatMessage
error(String message);}public abstract class AbstractLogger implements Logger { protected String formatMessage [TRACE] " + message)); } @Override public void debug(String message) { writeLog(formatMessage "[DEBUG] " + message)); } @Override public void info(String message) { writeLog(formatMessage ("[INFO] " + message)); } @Override public void warn(String message) { writeLog(formatMessage "[WARN] " + message)); } @Override public void error(String message) { writeLog(formatMessage
返回调用线程之后的错误代码调用成功则返回ERROR_SUCESS void WINAPI SetLastError( _In_ DWORD dwErrCode ); 传入一个DWORD错误值进行设置 DWORD FormatMessage MSDN上有介绍GetLastError配合ForMatMessage来打印错误代码. 5.错误代码查找工具的使用 VS编译器还提供了了错误代码查看工具.我们可以输入那么就会显示错误代码代表的什么意思.
throw new ParserConfigurationException( SAXMessageFormatter.formatMessage throw new ParserConfigurationException( SAXMessageFormatter.formatMessage
我们的日志类型会通过ParameterFormatter.formatMessage2函数进行日志处理。 formattedMessage); } else { if (indices[0] < 0) { ParameterFormatter.formatMessage buffer, messagePattern, argArray, usedCount); } else { ParameterFormatter.formatMessage2 (buffer, messagePattern, argArray, usedCount, indices); } } } formatMessage2函数主要是通过 * @param arguments the arguments to be used to replace placeholders. */ static void formatMessage2
currentAuthority":"admin"} if (msg.status === 'ok') { const defaultLoginSuccessMessage = intl.formatMessage 如果失败去设置用户错误信息 setUserLoginState(msg); } catch (error) { const defaultLoginFailureMessage = intl.formatMessage
虚FormatMessage方法用于对MessageTemplate进行格式化,即通过相应的值来替换对应的占位符。在这里将被验证的值替换掉{PropertyValue}占位符。 string.Empty; 8: } 9: public virtual void FormatMessage(object objectToValidate) 10: ValidatorAttribute同样定义需方法FormatMessage,在这里我们用属性名称替换{PropertyName}占位符。 messageTemplate; 13: this.RuleName = string.Empty; 14: } 15: public virtual void FormatMessage foreach (var validator in validators) 12: { 13: validator.FormatMessage
如下面的代码所示,抽象类MessageManager具有唯一的FormatMessage方法用于获取一个经过格式化好的最终消息文本,参数category、id和args分别代表对应消息条目的类型、ID和作为替换占位符的参数 1: public abstract class MessageManager 2: { 3: public abstract string FormatMessage(string 在重写的FormatMessage方法中,直接通过类型和ID在列表中找到相应的MessageEntry,并传输占位符参数根据当前线程的CurrentUICulture对消息文本进行格式。 public IEnumerable<MessageEntry> Messages { get; private set; } 14: public override string FormatMessage
erM=0; LPVOID lpMsgBuf; CString theErr; if(_hCommHandle==INVALID_HANDLE_VALUE) erM=GetLastError(); FormatMessage