CreateProcess的命令行参数
2015-09-21 20:43
211 查看
最近使用CreateProcess创建rundll32.exe进程,发现并没有正常加载DLL,后来才发现是命令行参数传错了,CreateProcess并不是我想象的那样,网上找了一下,发现还有许多东西不是想的那么简单。下面的文字翻译自《INFO: Understanding CreateProcess and Command-line Arguments》
创建32位进程时CreateProcess的行为
案例1
如果传递了ApplicationName参数,且CommandLine参数是NULL,那么ApplicationName参数同时也会被当做CommandLine参数。但这并不意味着你可以在ApplicationName参数中添加额外的命令行参数。比如下面的代码就无法成功创建进程:
案例2
如果传递了CommandLine参数,且ApplicationName参数是NULL,那么CreateProcess会尝试从CommandLine中提取ApplicationName。
案例3
当ApplicationName和CommandLine两个参数同时都使用的时候,就会体现出CreateProcess的灵活性了(也是容易混淆的地方)。这时候允许你指明要执行的程序以及要传给程序的完整的命令行参数。你也许会认为传递给创建的程序的命令行参数是ApplicationName和CommandLine的组合,但实际上不是这样的。实际情况是,由CreateProcess创建的进程可以接收一个指定的参数填充到argv[0],下面的例子就会产生这种不正常现象:
所以,CreateProcess正确的写法应该这样:
引用博客地址:http://www.programlife.net/createprocess-command-line.html
创建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);
引用博客地址:http://www.programlife.net/createprocess-command-line.html
相关文章推荐
- hdu 5463 Clarke and minecraft
- 离线编译JSX文件
- POJ 3243 Clever Y (求X^Y mod Z = K)
- 使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理
- HDU 1421 搬寝室
- NFS挂载文件系统需要的内核和uboot的配置
- PAT(A)1003
- 重造轮子-random5到random7
- jquery checkbox反复调用attr('checked', true/false)只有第一次生效
- IOS开发测试之单元测试中的理论知识
- 死锁 银行家算法
- android2.3平台上web页面(html5中使用frame)不能滑动、不允许缩放的解决方法
- 自己编程实现更改电脑桌面背景并同时播放音乐
- 对象流注意点
- iOS开发脚踏实地学习day12-通讯录和plist存储
- 坦克发射炮弹打死自己的问题
- 快手之家(aardio.net) - 构思
- scanner 死循环问题
- 嵌入式硬件及接口开发实践
- iOS: 转载CoreData数据库框架