最近使用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的命令行参数相关推荐

  1. Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)

    1.环境变量 按用途可分为:与系统运行相关.反应系统状态以及应用程序自定义三种环境变量 操作函数: 获取一个环境变量的值:GetEnvironmentVariable 设置新变量或删除已有变量 :Se ...

  2. 关于mobile6.1的tmail.exe命令行参数

    发表于:2010-01-25 17:02:30 以下代码是调用系统短信程序回复一条短信,使用命令行参数. CString szCMD; szCMD = _T("-service /" ...

  3. Go 学习笔记(45)— Go 标准库之 flag(命令行参数解析)

    1. 参数解析说明 import "flag" flag 包实现了命令行参数的解析.每个参数认为一条记录,根据实际进行定义,到一个 set 集合.每条都有各自的状态参数. 使用 f ...

  4. INNO SETUP 获得命令行参数

    INNO SETUP 获得命令行参数 原文 http://www.cnblogs.com/ahuo/archive/2009/07/30/1534998.html [Code] function Ge ...

  5. Windows安装用于OCR的Tesseract及使用命令行参数进行OCR

    Windows安装用于OCR的Tesseract及使用命令行参数进行OCR 1. 效果图 2. Tesseract 安装及验证 参考 这篇博客将介绍如何安装和使用光学字符识别(OCR Optical ...

  6. Python必备基本技能——命令行参数args详解

    Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...

  7. 【C++】clipp 一个命令行参数解析器

    1.简介 clipp是一个使用方便.功能强大的命令行解析器,源码只有一个头文件<clipp.h> github地址:https://github.com/muellan/clipp 2.使 ...

  8. 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

    参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] ...

  9. 【linux】Valgrind工具集详解(八):Memcheck命令行参数详解

    [linux]Valgrind工具集详解(五):命令行详解中不够全,在此专门针对Memcheck工具中的命令行参数做一次详细的解释. Memcheck命令行选项 –leak-check=<no| ...

最新文章

  1. emacs 探索之五:latex配置
  2. Hessian RPC示例和基于Http请求的Hessian序列化对象传输
  3. 互联网产品设计的“马化腾法则”
  4. git 放弃本地修改 强制更新
  5. java hql多条件查询_Hibernate结合JPA编写通用泛型多条件查询
  6. 论文解读 | 基于递归联合注意力的句子匹配模型
  7. koa router ajax,ajax 请求 koa2 router.post 404
  8. vba根据内容调整word表格_给你的word提速
  9. http长/短轮询和WebSocket 的介绍和比较
  10. 洪筱楠(1996-),女,对外经济贸易大学国际经济贸易学院经济学荣誉学士实验班本科生。...
  11. vmware vsphere powercli 因为在此系统中禁止执行脚本
  12. 数据库的几个基本概念
  13. 谈谈如何学习R语言基础教程
  14. AMD RX580刷BIOS提高ETH算力
  15. Flash Builder 4 正式版序列号
  16. DSP入门必看(上)
  17. 计算机网络中的冗余的意思,计算机网络基础 实验四 交换网络中冗余链路.ppt
  18. 前端写出优雅的代码,融会贯通es6
  19. java语言使用栈和队列实现简易停车场管理系统
  20. PY_GD_1 Python使用print()函数时输出不含多余空格的数据

热门文章

  1. CountDownTimer使用心得及总结
  2. js 封装,继承,多态概念(面试)
  3. 驾驶证理论测试显示软件未激活,驾照理论测试
  4. ping和traceroute的工作原理
  5. 【快速上手 MongoDB】介绍、安装、核心概念、基本操作
  6. eNSP:静态路由中的缺省路由
  7. 江苏科技大学计算机系2019年录取分数线,2019年江苏科技大学优势专业排名及分数线...
  8. Netty教程02:Netty实战之TCP服务
  9. android开发之蓝牙主动配对连接手机
  10. 微信小程序支付【官方demo使用手记】——支付签名验证错误,total_fee 不能为空