【问题标题】:CommandLineToArgvW quirkCommandLineToArgvW 怪癖
【发布时间】:2019-04-05 22:54:09
【问题描述】:

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

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

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

  • 如果我在没有参数的情况下调用程序,lpCmdLine 是一个空字符串,CommandLineToArgvW 返回 1 个参数 - 可执行路径。
  • 如果带参数调用,CommandLineToArgvW 返回参数的确切数量,不带可执行文件

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

我错过了什么?我是否以无意的方式使用了该命令?

【问题讨论】:

  • 看来您必须阅读其他功能的文档。

标签: windows winapi


【解决方案1】:

这是记录在案的行为。

每CommandLineToArgvW():

lpCmdLine

输入:LPCWSTR

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

这意味着CommandLineToArgvW() 仅在lpCmdLine 参数为空或明确 包含可执行文件名称时返回调用的可执行文件名称。

请注意,CommandLineToArgvW() 需要完整的命令行。但是,根据WinMain():

lpCmdLine

输入:LPSTR

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

所以,当你执行不带参数的程序时,WinMain 的lpCmdLine 参数为空,CommandLineToArgvW() 只返回可执行文件名。但是如果执行带参数的程序,lpCmdLine参数不为空但不包含可执行文件名,所以CommandLineToArgvW()只返回不带可执行文件名的参数。

因此,您需要按照WinMain() 文档中的说明使用GetCommandLine() 而不是lpCmdLine。 CommandLineToArgvW() 文档中也说明了这一点:

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

所以,改用这个:

LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多