今天修改了下FormatMessage函数;
用法如下:
HLOCAL hLocal = NULL;
//char* hLocal = new char[1000];
//memset(hLocal,0,1000 );
DWORD SystemLocal = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);
BOOL fOk = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,RetErr,SystemLocal,
(LPTSTR)&hLocal,0,NULL);
if(!fOk)
{
HMODULE hDll = LoadLibraryEx( TEXT("netmsg.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES );
if( hDll != NULL )
{
fOk = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,hDll,RetErr,SystemLocal,
(LPTSTR)&hLocal,0,NULL);
FreeLibrary( hDll );
}
}
if( fOk&&(hLocal))
{
SetDlgItemText( IDC_EDIT_ErrMsg,(LPCTSTR)LocalLock(hLocal));
}
这里要说明的是第5个参数的设定。
hLocal 本身是个系统内存的句柄,需要转换成LPTSTR型,转换完成后,需要通过LocalLock函数锁定内存返回指针。加上此处防止内存访问冲突。