CreateProcess的前两个参数究竟怎么用

CreateProcess是Windows下用于创建进程的API函数,其第一个参数为lpApplicationName,从字面意思上看应该是一个可执行文件的名字,第二个参数为lpCommandLine,从字面意思上看应该是一个启动进程时传给程序的命令行。实际上并没有想象中的那么简单,MSDN上关于该API的这两个参数的说明,长达两屏幕。何耐这些说明都是纯英文的,包括我在内的很多程序员英文都不好,一看就头疼。于是索性就不看了,凭着自己的感觉去用,结果总是出现各种小问题,很不自在。最终硬着头皮看了一下文档,总结为一个“注意”,两个“用法”。

注意:lpCommandLine是LPTSTR而不是LPCTSTR,所以这个参数不能是字符串常量,必须是可写的字符串数组。

如果要执行C:\Program Files\WinRAR\WinRAR.exe并传入命令行"Hello I am 小明",一般有两种方法(例子中VC工程字符集为Unicode):

1.lpApplicationName和lpCommandLine都使用:

wchar_t wszCmd[] = L" Hello I am 小明";
CreateProcess(L"C:\\Program Files\\WinRAR\\WinRAR.exe", wszCmd, ...);

注意,wszCmd[],也就是lpCommandLine的内容中开头需要一个空格,不然就和lpApplicationName连在一起去了,成了“C:\\Program Files\\WinRAR\\WinRAR.exeHello I am 小明”。

2.只使用lpCommandLine:

wchar_t wszPath[] = L"\"C:\\Program Files\\WinRAR\\WinRAR.exe\" Hello I am 小明";
CreateProcess(NULL, wszPath, ...);

为什么字符串中的C:\\Program Files\\WinRAR\\WinRAR.exe还要加上双引号?为了避免路径中的空格带来歧义,比如C:\Program Files\WinRAR\WinRAR.exe可以解释为C:\Program是可执行文件Files\WinRAR\WinRAR.exe是命令行参数,如果路径中不存在空格则不需要加双引号,为了规范而不易出错,最好保持每次都加上双引号的习惯。

MSDN参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx

本文由CharlesSimonyi发表于CSDN博客:http://blog.csdn.net/charlessimonyi/article/details/43957429转载请注明出处

时间: 2024-10-05 23:54:23

CreateProcess的前两个参数究竟怎么用的相关文章

oracle序列的两个参数:nextval和currval简介

oracle序列的两个参数:nextval和currval 我将通过下面的一个实例来体现两个参数的区别 创建个序列: 注:在调用currval的值前,必须先调用nextval的值,否则会报错,如下图中所示: 从上图中我们可以看到,在多次调用时nextval的值会继续增加 在上图中我们可以看到currval的值在会话中多次调用时,还是和自身会话的当前值一样所以nextval的值是每调用一次就增加一次:currval的值调用时,还是和自身会话的当前值一样. 原文地址:http://bbs.delit

【sql 练习题 36,37】查询每门功成绩最好的前两名,统计每门课程的学生选修人数(超过 5 人的课程才统计)

题目36:查询每门功成绩最好的前两名 分析:先用自己交自己,条件为a.courseid = b.courseid and a.score<b.score,其实就是列出同一门课内所有分数比较的情况. 通过a.studentid和a.courseid可以联合确定这个同学的这门课的这个分数究竟比多少个其他记录高/低, 如果这个特定的a.studentid和a.courseid组合出现在这张表里的次数少于2个,那就意味着这个组合(学号+课号+分数)是这门课里排名前二的. 所以下面这个计算中having

五分钟学Java:可变参数究竟是怎么一回事?

在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就那么回事嘛,会用就行了.就比如说今天这个主题,管它可变不可变呢,不就是个参数嘛,还能有多大学问--抱着这种态度,我一直横行江湖近十载(苦笑).可等到读者找我提一些基础的问题时,我几乎回答不上来,感觉知识是散的,或者是浮于表面的.幸好最近一段时间,我开始幡然醒悟,开始不放过任何一个细节,渐渐地,有点"

三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

版权声明:本文为sang原创文章,转载请注明出处. 目录(?)[+] 关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东.本篇博客我们不讲源码,只看使用.源码的解读会在下一篇博文中带来. inflate方法从大范围来看,分两种,三个参数的构造方法和两个参数的构造方法.在这两类中又有细分,OK,那我们就把各种情况都来演示一遍. 1.三个参数的in

C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑

看了很多资料终于搞明白cache中absoluteExpiration,slidingExpiration这两个参数的含义. absoluteExpiration:用于设置绝对过期时间,它表示只要时间一到就过期,所以类型为System.DateTime,当给这个参数设置了一个时间时,slidingExpiration参数的值就只能为Cache.NoSlidingExpiration,否则出错: slidingExpiration:用于设置可调过期时间,它表示当离最后访问超过某个时间段后就过期,所

process_begin: CreateProcess(NULL,......) make (e=87): 参数错误。

在编译 trinity-android 的过程中,总是报 process_begin: CreateProcess(NULL,......) make (e=87): 参数错误 原因是.MK文件中包含的文件太多了,而windows对于函数参数个数有限制,解决办法:http://stackoverflow.com/questions/12598933/ndk-build-createprocess-make-e-87-the-parameter-is-incorrect 在Android.mk文件

25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

package zhongqiuzuoye; public class Rect { public double width; public double height; Rect(double width,double height) //带有两个参数的构造方法,用于将width和height属性初化; { this.width=width; this.height=height; } Rect() //不带参数的构造方法,将矩形初始化为宽和高都为10. { width=10; height=

php如何获取到前两个页面的url

自己在学习过程中也遇到了类似的问题: 比如,后台是想做成这样子的: 但是实际则是这样的: 解决方法: 通过表单隐藏控件 <input type="hidden" name="prevurl" value="<?php echo $_SERVER['HTTP_REFERER']?>"> 这样$_SERVER['HTTP_REFERER']的值就暂时存到了$_POST[prevurl]里. 暂时没想到更好的方法. php如何获

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <