首页 > Windows SDK > CreateProcess的命令行参数

CreateProcess的命令行参数

最近使用CreateProcess创建rundll32.exe进程,发现并没有正常加载DLL,后来才发现是命令行参数传错了,CreateProcess并不是我想象的那样,网上找了一下,发现还有许多东西不是想的那么简单。下面的文字翻译自《INFO: Understanding CreateProcess and Command-line Arguments》

创建32位进程时CreateProcess的行为

案例1
如果传递了ApplicationName参数,且CommandLine参数是NULL,那么ApplicationName参数同时也会被当做CommandLine参数。但这并不意味着你可以在ApplicationName参数中添加额外的命令行参数。比如下面的代码就无法成功创建进程:

CreateProcess("c:\\MyApp.exe Param1 Param2", NULL, ... );

案例2
如果传递了CommandLine参数,且ApplicationName参数是NULL,那么CreateProcess会尝试从CommandLine中提取ApplicationName。

案例3
当ApplicationName和CommandLine两个参数同时都使用的时候,就会体现出CreateProcess的灵活性了(也是容易混淆的地方)。这时候允许你指明要执行的程序以及要传给程序的完整的命令行参数。你也许会认为传递给创建的程序的命令行参数是ApplicationName和CommandLine的组合,但实际上不是这样的。实际情况是,由CreateProcess创建的进程可以接收一个指定的参数填充到argv[0],下面的例子就会产生这种不正常现象:

CreateProcess( "c:\\MyApp.exe", "Param1 Param2 Param3", ...);

MyApp的命令参数将会是这样的:

  argv[0] == "Param1"
  argv[1] == "Param2"
  argv[2] == "Param3"

此外,在《Windows核心编程》中提到,CreateProcess函数的lpCommandLine参数类型为LPTSTR,这意味着CreateProcess期望你将传递一个非常量字符串的地址,从内部来讲,CreateProcess实际上要修改你传递给它的命令行字符串,不过,在CreateProcess返回之前,它将该字符串恢复为它的原始形式。所以如果传递的是常量字符串,那么可能会引发违规访问的异常。

所以,CreateProcess正确的写法应该这样:

	TCHAR szPath[MAX_PATH] = {L"C:\\Windows\\System32\\rundll32.exe"};
	TCHAR szCmdLine[MAX_PATH] = {
		L"C:\\Windows\\System32\\rundll32.exe"
		L" D:\\Test.dll,TestFunc" // 注意前面的空格
	};
	STARTUPINFO si = {sizeof(si)};
	PROCESS_INFORMATION pi = {0};
	BOOL bRet = FALSE;
 
	bRet = CreateProcess(
		szPath,
		szCmdLine,
		NULL,
		NULL,
		FALSE,
		CREATE_NEW_CONSOLE,
		NULL,
		NULL,
		&si,
		&pi);
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);
CreateProcess Command Line

CreateProcess Command Line

参考:
《Windows核心编程》
INFO: Understanding CreateProcess and Command-line Arguments

================
更新
================
后来遇到的问题表明,案例2中的写法更好。最近编程遇到很多的路径问题,路径一定要用双引号包裹起来,不然会产生很多问题(比如CreateProcess路径截断等),而如果使用了双引号,案例3可能会有问题,所以推荐使用案例2中的写法。
路径空格问题真是会引发很多BUG,比如最近通过del删除文件的时候又遇到了……


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> CreateProcess的命令行参数
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2014年5月12日21:16 | #1

    博主你好,有个问题想请教你下,我学了C/C++基础想继续学windows编程但不知道怎么开始,有没有好的建议或者方向?谢谢了

    [回复]

  1. 2013年12月14日13:51 | #1