我正在研究一些解析路径的C++代码,并且已经为此尝试了许多Windows API。 PathGetArgs/PathRemoveArgs和稍微按摩的CommandLineToArgvW之间有区别吗?

换句话说,除了长度/清洁度之外,这是:

std::wstring StripFileArguments(std::wstring filePath)
{
  WCHAR tempPath[MAX_PATH];

  wcscpy(tempPath, filePath.c_str());
  PathRemoveArgs(tempPath);

  return tempPath;
}

与此不同:
std::wstring StripFileArguments(std::wstring filePath)
{
  LPWSTR* argList;
  int argCount;
  std::wstring tempPath;

  argList = CommandLineToArgvW(filePath.c_str(), &argCount);

  if (argCount > 0)
  {
    tempPath = argList[0]; //ignore any elements after the first because those are args, not the base app

    LocalFree(argList);

    return tempPath;
  }

  return filePath;
}

这是
std::wstring GetFileArguments(std::wstring filePath)
{
  WCHAR tempArgs[MAX_PATH];

  wcscpy(tempArgs, filePath.c_str());
  wcscpy(tempArgs, PathGetArgs(tempArgs));

  return tempArgs;
}

不同于
std::wstring GetFileArguments(std::wstring filePath)
{
  LPWSTR* argList;
  int argCount;
  std::wstring tempArgs;

  argList = CommandLineToArgvW(filePath.c_str(), &argCount);

  for (int counter = 1; counter < argCount; counter++) //ignore the first element (counter = 0) because that's the base app, not args
  {
    tempArgs = tempArgs + TEXT(" ") + argList[counter];
  }

  LocalFree(argList);

  return tempArgs;
}

?在我看来,PathGetArgs/PathRemoveArgs只是为CommandLineToArgvW解析提供了一种更干净,更简单的特殊情况实现,但是我想知道在某些极端情况下API的行为会有所不同。

最佳答案

函数相似但不完全相同-主要与引用字符串的处理方式有关。
PathGetArgs返回一个指针,该指针指向输入字符串中第一个空格之后的第一个字符。如果在第一个空格之前遇到引号字符,则该函数将再次开始寻找空格之前需要另一个引号。如果找不到空格,该函数将返回一个指向字符串末尾的指针。
PathRemoveArgs调用PathGetArgs,然后使用返回的指针终止字符串。如果遇到的第一个空格恰好在行的末尾,它将也删除尾随空格。
CommandLineToArgvW接受提供的字符串并将其拆分为一个数组。它使用空格来描述数组中的每个项目。数组中的第一项可以用引号引起来以允许空格。第二项和后续项也可以用引号引起来,但是它们支持稍微复杂一些的处理-参数还可以通过在其前面加上反斜杠来包含嵌入式引号。例如:

 "c:\program files\my app\my app.exe" arg1 "argument 2" "arg \"number\" 3"

这将产生一个包含四个条目的数组:
  • argv[0]-c:\program files\my app\my app.exe
  • argv[1]-arg1
  • argv[2]-参数2
  • argv[3]-arg“数字” 3

  • 有关解析规则的完整说明,请参见 CommandLineToArgVW 文档,包括如何在参数中嵌入反斜杠和引号。

    关于c++ - PathGetArgs/PathRemoveArgs与CommandLineToArgvW-有区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20103638/

    10-12 20:47