将argv转换回单个字符串

时间:2009-06-10 11:27:57

标签: c++ winapi command-line

我正在编写一个包含另一个进程的(Win32控制台)程序;它需要参数,如下例所示:

runas.exe user notepad foo.txt

即:runas解析user,然后运行记事本,传递剩余的参数。

我的问题是argv被细分为单个参数,但CreateProcessAsUser需要一个lpszCommandLine参数。

构建此命令行可能不像将argv与空格一起加入一样简单。有什么指针吗?

这只是一个例子。我的第一个参数实际上不是用户名,并且可能包含空格。这使得手动解析GetCommandLine棘手的结果。

同样地,argv的天真串联将不起作用,因为它需要处理引用原始参数并且可能在其中包含空格的情况。

4 个答案:

答案 0 :(得分:7)

手动重组它们很难:

您可以尝试重新组合它们,我认为它会起作用,但请务必关注the same command line escaping rules that windows has。这可能不仅仅是您正在寻找的简单解决方案。

此外,如果有任何参数中包含空格,那么您可能希望将它们连接到带有引号的字符串。下面是一个奇怪的转义规则的示例:如果你有--folderpath "c:\test\",那么最后一个反斜杠必须加倍--folderpath "c:\test\\"

如果您使用的是MFC:

您可以从派生的CWinApp的theApp.m_lpCmdLine中获取所需的值。请注意,您仍然可以使用__argc和__argv或CommandLineToArgvW以其他方式访问它们。

如果您仅使用Win32(即使没有GUI):

您可以从WinMain获取。这可能是您的计划的切入点。

请注意,您仍然可以使用__argc和__argv或CommandLineToArgvW以其他方式访问它们。

如果您必须使用带有main或wmain的基于控制台的应用程序:

Win32 API GetCommandLine似乎是要走的路。你需要仍然解析它以通过.exe名称。考虑exe名称/路径周围的引号。如果开头没有这样的报价,那么只需到下一个空格开始。

答案 1 :(得分:2)

您可以使用GetCommandLine功能。

为什么不使用'WinMain'而不是'main'?这应该为您提供所需格式的字符串。

答案 2 :(得分:1)

Win32 API调用返回命令行:GetCommandLine

答案 3 :(得分:0)

如果你有一个分配了足够空间的字符串,那么在列表中的每个项目上使用strcat。是的,就像用空格连接起来一样简单。

编辑:当然,您需要在引号内包含任何包含空格的项目。