如何在Win32函数FormatMessage中捕获异常

时间:2014-03-19 21:43:38

标签: c++ winapi exception-handling

我有一段15年以上的代码,用于格式化Windows事件日志中的消息。如果没有关于Windows事件日志如何工作的杂草,一切正常,只要正在处理的消息字符串格式正确,这是我们无法控制的。

用于格式化消息的Windows函数是FormatMessage。在这种情况下,FormatMessage用于从.dll文件中检索字符串资源,并使用占位符替换文件中的参数。所以在这种情况下,资源.dll文件来自第三方,它包含如下内容:

"无法找到文件%2"。

问题是供应商没有在事件日志中提供%2的值,因此对FormatMessage的调用会使我们的应用程序崩溃,因为它试图将%2替换为不存在的参数。

32位版本也不受影响:FormatMessage将返回:

"无法找到文件(null)"

但是当消息字符串和参数不是FormatMessage所期望的那样时,64位构建将在ntdll.dll中崩溃。

我们试图在FormatMessage周围放置一个try-catch块,但是要么没有工作,要么没有正确构建。以下是调用FormatMessage的代码行:

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | 
FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_ARGUMENT_ARRAY, Hmodule, EventId, 
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &m_pMsg, 0, (va_list*) (LPTSTR*) Params);

有没有办法围绕这行代码,以便它可以被捕获而不是触发异常,或者使其在32位世界中表现得像?

0 个答案:

没有答案