我试图理解lpCmdLine的行为,这似乎有点违反直觉。
最初,我以为它只是一个指向整个命令字符串的指针,但这段代码显示情况并非如此,因为显示lpCmdLine直接显示垃圾。
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void alertf(const char *fmt, ...)
{
char buf[80];
va_list args;
va_start(args, fmt);
sprintf_s(buf, fmt, args);
va_end(args);
MessageBox((HWND)0, buf, "Message Box", MB_OK | MB_ICONINFORMATION);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
alertf("lpCmdLine: '%s'.", lpCmdLine);
return 0;
}
如何在内部存储lpCmdLine?
解决方案
我的alertf应该使用
vsprintf_s
而不是sprintf_s
,因为它的参数是varargs。这一个改变证实了lpCmdLine确实如我最初所想,是整个命令行的一个c字符串。
最佳答案
lpCmdLine
确实是指向命令字符串的简单指针。
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, lpCmdLine, "DEBUG", MB_OK);
return 0;
}
问题似乎出在您的
alertf
函数上,您的sprintf_s
调用没有执行您认为它执行的操作您实际上需要在这里使用vsprintf_s
,因为存在va_list
:void alertf(const char *fmt, ...)
{
char buf[80];
va_list args;
va_start(args, fmt);
vsprintf_s(buf, fmt, args);
va_end(args);
MessageBox((HWND)0, buf, "Message Box", MB_OK | MB_ICONINFORMATION);
}
代码在那之后工作得很好。