Windows c/c++(VS 2022)中是否有CommandLineToArgvA函数?

jyztefdp  于 2023-01-04  发布在  Windows
关注(0)|答案(1)|浏览(224)

CommandLineToArgvW()函数,即CommandLineToArgv + W,其中W表示宽字符(在C/C ++中为wchar_t),但应该存在的CommandLineToArgvA()函数,如GetCommandLineW()GetCommandLineA(),显然并不存在。
字符:

int argv;
char **argv = CommandLineToArgvA(GetCommandLineA(), &argc);

宽字符:

int argv;
wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &argc);

嗯,我在互联网上搜遍了每个角落,最多的是Linux Wine中的这个函数......我想知道,这个函数存在吗,如果存在,"隐藏"正常吗?否则,它真的不存在吗?

pprl5pva

pprl5pva1#

我不认为你应该尝试解析你自己的命令行字符串。Windows只做一种方式。试图编写重复的代码来做同样的事情是错误的。
只需获取命令行,然后使用Window工具将其转换为UTF-8。

#include <stdlib.h>
#include <windows.h>
#include <shellapi.h>

#pragma comment(lib, "Shell32")

void get_command_line_args( int * argc, char *** argv )
{
  // Get the command line arguments as wchar_t strings
  wchar_t ** wargv = CommandLineToArgvW( GetCommandLineW(), argc );
  if (!wargv) { *argc = 0; *argv = NULL; return; }
  
  // Count the number of bytes necessary to store the UTF-8 versions of those strings
  int n = 0;
  for (int i = 0;  i < *argc;  i++)
    n += WideCharToMultiByte( CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, NULL ) + 1;
  
  // Allocate the argv[] array + all the UTF-8 strings
  *argv = malloc( (*argc + 1) * sizeof(char *) + n );
  if (!*argv) { *argc = 0; return; }
  
  // Convert all wargv[] --> argv[]
  char * arg = (char *)&((*argv)[*argc + 1]);
  for (int i = 0;  i < *argc;  i++)
  {
    (*argv)[i] = arg;
    arg += WideCharToMultiByte( CP_UTF8, 0, wargv[i], -1, arg, n, NULL, NULL ) + 1;
  }
  (*argv)[*argc] = NULL;
}

获得一个argv,就像main()得到的一样,最后有一个NULL元素,并且是可写的。
接口很简单。当你完成它的时候不要忘记free()结果。示例用法:

#include <stdio.h>
#include <stdlib.h>

void f(void)
{
  int     argc;
  char ** argv;
  get_command_line_args( &argc, &argv );
  
  for (int n = 0;  n < argc;  n++)
    printf( "  %d : %s\n", n, argv[n] );
  
  free( argv );
}

int main(void)
{
  f();
}

好好享受吧!

相关问题