我试图理解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;
}
Run Code Online (Sandbox Code Playgroud)
lpCmdLine如何在内部存储?
解
我的alertf应该使用vsprintf_s而不是sprintf_s因为它的'参数是varargs.
这一个更改确认lpCmdLine确实是我原来认为的,整个命令行的ac字符串.
lpCmdLine 确实是一个指向命令字符串的简单指针.
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, lpCmdLine, "DEBUG", MB_OK);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题似乎与你的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);
}
Run Code Online (Sandbox Code Playgroud)
之后代码完美无缺.