【问题标题】:Process name missing from GetCommandLine()GetCommandLine() 中缺少进程名称
【发布时间】:2010-07-20 17:33:12
【问题描述】:

GetCommandLine() API 有问题。

它通常返回可执行文件名,后跟一个空格和参数。正如文档所说,第一个令牌可能没有图像的完整路径和等等等等。

直到现在我在使用 lpApplicationName 不为 NULL 的 CreateProcess 时从未遇到过问题。

如果我使用:

CreateProcess(NULL, "\"c:\\myexe.exe\" param1 param2", ...)

GetCommandLine 按预期返回“c:\myexe.exe param1 param2”。

但如果我使用:

CreateProcess("C:\myexe.exe", "param1 param2")

GetCommandLine 只返回“param1 param2”。

如果另一个应用程序启动我的,我如何知道是否在命令行中给出了可执行文件名称?

此外,MFC 启动代码假定命令行上的第一个标记是可执行文件名称并跳过它。但是,如果您使用第二个 CreateProcess API 示例启动 MFC 应用程序,MFC 的代码将跳过第一个参数。

【问题讨论】:

    标签: winapi createprocess


    【解决方案1】:

    不是你的问题。正确构建命令行是其他应用程序的工作。您应该简单地假设第一个参数是预期的可执行名称并跳过它。

    【讨论】:

      【解决方案2】:

      我有一个解决方法,在这种情况下可能会有所帮助。 我想我们总是能够检查我们的模块是如何启动的。 在这种情况下,我们应该检查第一个参数。

      我会写代码,因为我的英语有些问题。 这里有两种方法:

      第一种情况。我们可以将模块名称与第一个命令行参数进行比较。 像这样:

      const TCHAR* csCommandLine = ::GetCommandLine();
      
      // Attention!!! the first symbol can be quete
      
      if (*csCommandLine == _T('\"'))
          csCommandLine++;
      
      TCHAR sModuleFileName[MAX_PATH];
      
      DWORD dwModuleFileName = ::GetModuleFileName(NULL, sModuleFileName, MAX_PATH);
      
      if (dwModuleFileName && !_tcsncmp(csCommandLine, sModuleFileName, dwModuleFileName)) {
      
          // The command line contains the module name.
      }
      

      第二种情况。我们可以尝试获取第一个命令行参数的文件属性 像这样:

      // 注意!!!如果要在命令行参数中传递文件路径,请不要使用它。

      int nArgc;
      
      LPTSTR* szArglist = ::CommandLineToArgvW(::GetCommandLine(), &nArgc);
      
      if (nArgc && ::GetFileAttributes(szArglist[0]) != INVALID_FILE_ATTRIBUTES) {
      
          // The command line contains the module name.
      }
      
      ::LocalFree(szArglist);
      

      我希望它可以对某人有所帮助。

      问候,弗拉基米尔

      【讨论】:

      • 嗨弗拉基米尔。我决定像 MFC 一样忽略。
      • 这是个坏主意,除非您有特定需要通过您无法修复的错误代码来启动您的应用程序。
      猜你喜欢
      • 2020-08-12
      • 2020-07-01
      • 1970-01-01
      • 2014-04-27
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多