lpCmdLine是如何存储的?

时间:2016-04-18 03:46:22

标签: c winapi

我试图理解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字符串。

1 个答案:

答案 0 :(得分:5)

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);
}

之后代码完美无缺。