我正在编写一个包含另一个进程的(Win32控制台)程序;它需要参数,如下例所示:
runas.exe user notepad foo.txt
即:runas
解析user
,然后运行记事本,传递剩余的参数。
我的问题是argv
被细分为单个参数,但CreateProcessAsUser
需要一个lpszCommandLine
参数。
构建此命令行可能不像将argv
与空格一起加入一样简单。有什么指针吗?
这只是一个例子。我的第一个参数实际上不是用户名,并且可能包含空格。这使得手动解析GetCommandLine
棘手的结果。
同样地,argv
的天真串联将不起作用,因为它需要处理引用原始参数并且可能在其中包含空格的情况。
答案 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。是的,就像用空格连接起来一样简单。
编辑:当然,您需要在引号内包含任何包含空格的项目。