【发布时间】:2014-10-06 13:21:25
【问题描述】:
我只是想用这个简单的代码获取最后一个错误的文本:
#include <cstdio>
#include <string>
#include <windows.h>
int main(){
char err[256];
memset(err, 0, 256);
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err, 255, NULL);
wprintf(L"%s\n", err); // just for the safe case
puts(err);
return 0;
}
FormatMessage() 可能会尝试写类似No error 的东西,但我却得到:WINE 中的┬√яюыэхэю єёях°эю,WinXP 中的╬яхЁрЎш єёях°эю чртхЁ°хэр >虚拟框。
我检查了我的所有想法:1)in an example,由于某种原因,使用了wchar_t,所以我尝试创建wchar_ts 的缓冲区,并将其转换为FormatMessage (否则构建失败,cannot convert ‘wchar_t*’ to ‘LPSTR {aka char*}’ for argument ‘5’),2)然后我想,也许编码与 GNU/Linux 不同,所以我将 WinXP 安装到 VirtualBox 中;但是这两个函数都没有提供任何可读性,应用程序一直在咕哝着自己奇怪的语言。
操作系统:Ubuntu(WINE)、WinXP(VirtualBox)。编译器:MinGW GCC
UPD:我找到了有效的代码!
#include <cstdio>
#include <string>
#include <windows.h>
int main(){
wchar_t err[256];
memset(err, 0, 256);
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err, 255, NULL);
int msgboxID = MessageBoxW( NULL,
err,
(LPCWSTR)L"☠",
MB_OK );
return 0;
}
在使用-mwindows 标志编译后,它会在 Ubuntu 和 WinXP 中显示一个带有可读文本的消息框。所以,问题看起来只是终端问题。
【问题讨论】:
-
这可能是编码不匹配,
chcp的输出给你什么? -
@molbdnilo 在本机windows上执行,在没有最后一个错误的情况下得到“操作成功”的消息是一个惊喜。
-
@Hi-Angel,是的,您的代码,但是使用如下所述的 TCHAR 并且 puts() 被注释掉了。您可以在这里找到确切的消息:msdn.microsoft.com/en-us/library/windows/desktop/…
-
@Hi-Angel 鉴于您在问题中发布的文本仅在第 866 页的 0x80-0xFF 范围内,这几乎可以肯定是终端代码页问题,请查看我在上面链接的页面西里尔文和俄文代码页,并使用
chcp尝试每个代码页,每次都再次运行您的应用程序。 -
@Hi-Angel:如果您浏览System Error Codes,您会发现一些包含占位符的消息(例如
ERROR_BAD_EXE_FORMAT:“%1 不是有效的 Win32 应用程序。”我>)。系统没有提供查询占位符个数和数据类型的接口,这使得占位符本质上是无用的。
标签: c++ winapi character-encoding mingw wine