FormatMessage() API 调用可用于获取与 Microsoft 消息队列错误代码说明字符串。 FormatMessage 调用的 Mqutil.dll 模块句柄和用 FORMAT_MESSAGE_FROM_HMODULE 标志来检索消息文本
更多信息
以下示例代码显示简单函数将其打印描述 Microsoft 消息队列错误消息到标准输出:
#include <windows.h> #include <lmerr.h> #include <tchar.h> #define ERRMSGBUFFERSIZE 256 void fnDisplayError( DWORD dwErrorMsgId ) ...{ DWORD ret; // Temp space to hold a return value. HINSTANCE hInst; // Instance handle for DLL. HLOCAL pBuffer; // Buffer to hold the textual error description. if ( HRESULT_FACILITY(dwErrorMsgId) == FACILITY_MSMQ ) ...{ // MSMQ errors only (see winerror.h for facility info). // Load the MSMQ library containing the error message strings. hInst = LoadLibrary( TEXT("MQUTIL.DLL") ); if(hInst !=0) ...{ // hInst not NULL if the library was successfully loaded. // Get the text string for a message definition ret = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |// Function will handle memory allocation. FORMAT_MESSAGE_FROM_HMODULE |// Using a module's message table. FORMAT_MESSAGE_IGNORE_INSERTS, hInst, // Handle to the DLL. dwErrorMsgId, // Message identifier. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language. (LPTSTR)&pBuffer, // Buffer that will hold the text string. ERRMSGBUFFERSIZE, // Allocate at least this many chars for pBuffer. NULL // No insert values. ); }// hInst not NULL if the library was successfully loaded. }// MSMQ errors only. elseif ( dwErrorMsgId >= NERR_BASE && dwErrorMsgId <= MAX_NERR ) ...{ // Could be a network error. // Load the library containing network messages. hInst = LoadLibrary( TEXT("NETMSG.DLL") ); if(hInst !=0) ...{ // Not NULL if successfully loaded. // Get a text string for the message definition. ret = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |// The function will allocate memory for the message. FORMAT_MESSAGE_FROM_HMODULE |// Message definition is in a module. FORMAT_MESSAGE_IGNORE_INSERTS, // No inserts used. hInst, // Handle to the module containing the definition. dwErrorMsgId, // Message identifier. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language. (LPTSTR)&pBuffer, // Buffer to hold the text string. ERRMSGBUFFERSIZE, // Smallest size that will be allocated for pBuffer. NULL // No inserts. ); }// Not NULL if successfully loaded. }// Could be a network error. else ...{ // Unknown message source. // Get the message string from the system. ret = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |// The function will allocate space for pBuffer. FORMAT_MESSAGE_FROM_SYSTEM |// System wide message. FORMAT_MESSAGE_IGNORE_INSERTS, // No inserts. NULL, // Message is not in a module. dwErrorMsgId, // Message identifier. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language. (LPTSTR)&pBuffer, // Buffer to hold the text string. ERRMSGBUFFERSIZE, // The function will allocate at least this much for pBuffer. NULL // No inserts. ); } // Display the string. if( ret ) ...{ _tprintf( _TEXT(" ERRORMESSAGE: %s "), (LPTSTR)pBuffer ); } else ...{ _tprintf( _TEXT(" ERRORNUMBER: %d "), dwErrorMsgId ); } // Free the buffer. LocalFree( pBuffer ); }