请帮忙!我对C一无所知,但我必须对C代码做一个小小的补充。
我从GetLastError中得到一个错误号(int)并将其显示到表单中。相反,我需要得到实际的错误字符串。
我添加了对FormatMessage的调用。调用本身工作正常,但字符串无法打印(使程序崩溃)。我做错什么了?
wchar_t *textbuf;
if(textbuf==NULL)
{
textbuf=(wchar_t *)malloc(4096);
memset(textbuf,0,4096);
}
wchar_t *lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, rc, // rc is an int, returned from another function, the result of GetLastError()
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPWSTR)lpMsgBuf, 0, NULL);
swprintf(textbuf, L"%s%s%s\n", textbuf, L"\t\t\t", lpMsgBuf);
最佳答案
问题是您没有正确地将lpMsgBuf
传递给FormatMessage()
,并且您的textbuf
缓冲区管理不正确。FormatMessage()
documentation表示:
格式化消息分配缓冲区
0x00000100号
函数分配一个足够大的缓冲区来保存格式化的消息,并在lpBuffer指定的地址处放置一个指向已分配缓冲区的指针。lpBuffer参数是指向LPTSTR的指针;必须将指针强制转换为LPTSTR(例如,(LPTSTR)&lpBuffer
)。nSize参数指定为输出消息缓冲区分配的最小TCHARs数。调用方应在不再需要缓冲区时使用LocalFree
函数释放缓冲区。
由于您没有将lpMsgBuf
初始化为空,也没有将lpMsgBuf
的地址传递给FormatMessage()
以便它可以将分配的内存地址分配给lpMsgBuf
,因此您最终将垃圾内存地址传递给swprintf()
作为最终输入参数。
至于textbuf
,您没有将其初始化为NULL,因此您将跳过对malloc()
的调用,从而将其输出缓冲区和第一个输入参数的垃圾地址传递给swprintf()
。但无论如何,不能对输入和输出使用相同的缓冲区,这是未定义的行为。
请改为:
wchar_t *textbuf = (wchar_t *) malloc(4096);
memset(textbuf, 0, 4096 * sizeof(wchar_t));
wchar_t *lpMsgBuf = NULL;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, rc, // rc is an int, returned from another function, the result of GetLastError()
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPWSTR)&lpMsgBuf, 0, NULL);
swprintf(textbuf, L"\t\t\t%s\n", lpMsgBuf);
LocalFree(lpMsgBuf);
// use textbuf as needed...
free(textbuf);
关于c - C新手:swprintf为什么对我失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32157759/