CommandLineToArgvW 怪癖

vla*_*sch 4 windows winapi

我有一个小 win32 程序,可以使用CommandLineToArgvW给定的调用lpCmdLine

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  (void)hInstance;
  (void)hPrevInstance;
  (void)nCmdShow;
  int argc;
  LPTSTR* argv =  CommandLineToArgvW(lpCmdLine, &argc);
  MessageBoxW(0, lpCmdLine, TEXT("lpCmdLine"), MB_OK    );

  for(int i=0; i<argc;++i){
    MessageBoxW(0, argv[i], TEXT("argv"), MB_OK );
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我观察到的奇怪的事情是:

  • 如果我不带参数调用该程序,则它lpCmdLine是一个空字符串并CommandLineToArgvW返回 1 个参数 - 可执行路径。
  • 如果使用参数调用,CommandLineToArgvW则返回参数的确切数量,不带可执行文件

我找不到这种奇怪行为的记录。

我错过了什么?我是否以非预期的方式使用了该命令?

Rem*_*eau 8

这是有记录的行为。

CommandLineToArgvW()

lpCmdLine

类型:LPCWSTR

指向包含完整命令行的以 null 结尾的 Unicode 字符串的指针。如果此参数为空字符串,则函数返回当前可执行文件的路径。

这意味着仅当参数为空或者显式CommandLineToArgvW()包含可执行文件名称时才返回调用可执行文件名称。lpCmdLine

请注意,CommandLineToArgvW()需要完整的命令行。然而,根据WinMain()

lpCmdLine

类型:LPSTR

应用程序的命令行,不包括程序名称。要检索整个命令行,请使用该GetCommandLine函数。

因此,当您不带参数执行程序时,WinMainlpCmdLine参数为空,并且CommandLineToArgvW()仅返回可执行文件名称。但是,如果您使用参数执行程序,则lpCmdLine参数不为空,但不包含可执行文件名称,因此CommandLineToArgvW()仅返回不包含可执行文件名称的参数。

因此,您需要按照WinMain()文档的说明进行操作并使用GetCommandLine()而不是lpCmdLine. 文档中也说明了这一点CommandLineToArgvW()

GetCommandLineW函数可用于获取适合用作参数的命令行字符串lpCmdLine

所以,用这个代替:

LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
Run Code Online (Sandbox Code Playgroud)