2009-06-10 42 views
5

我正在编写一个包装另一个进程的(Win32控制台)程序;它需要的参数如下面的例子:将argv转换回单个字符串

runas.exe user notepad foo.txt 

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

我的问题是argv被分解成各个参数,但CreateProcessAsUser需要一个lpszCommandLine参数。

构建这个命令行可能并不简单,只需将空间加入argv即可。任何指针?

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

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

+1

我会说“用空格加盟的argv一起回来”就可以了。是什么让你觉得不对? – 2009-06-10 11:30:14

+0

Benoît,因为它不适用于`runas.exe用户记事本'foo bat.txt'`。 – avakar 2009-06-10 11:35:39

+3

不要忘记引用任何包含空格的参数 – Hasturkun 2009-06-10 11:35:41

回答

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以其他方式访问它们。

如果必须使用主或wmain一个基于控制台的应用程序:

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

2

您可以使用GetCommandLine函数。

为什么不使用'WinMain'而不是'main'?这应该给你想要的格式的字符串。

0

假设你有一个足够的空间分配的字符串,然后在列表中的每个项目上使用strcat。是的,就像将它们与空间连接在一起一样简单。

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