NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)
这句用法不对,你的第一个参数不是NULL,是个空字符串,空字符串和NULL指针是两个概念,你的C语法知识有些模糊。
1)譬如你设计了一个函数,函数第一个参数是个指针,因此在你的函数里,首先应该判断别人传给你的这个指针是不是存在,如果别人是这样CALL你的函数YourFunc(NULL,...)那说明别人没为你传进指针,那么在你自己的函数里是不能使用第一个参数的,因为根本不存在指针变量。如果使用了他,那就等于让CPU去访问地址为零的进程空间。NULL=0=0x00 00 00 00,这个进程地址空间是不能访问的,一访问就出现访问违例(ACCESS VIOLATION)。
所以如果你设计了个函数,应该象所有健全的函数(CreateProcess是健全的)一样去检查下指针的问题,是NULL就不应该在函数里使用,不使用不会错,使用就错了。
这样你也就可以不用怀疑你传NULL给CreateProcess是不是会使它出错了。因为这个API会检查的。
2)_T("")这个和NULL是完全不同的。它的意思是程序员从程序的静态数据段(专门存储全局变量和静态变量的程序数据段--参考PE文件格式的相关资料)分配地址,存储指针变量的内容。_T("...")是有地址的,如果它没地址那么引号里的数据存哪里呢?你把_T("")传给了CreateProcess,其实你只是把引号里的数据的存放地址传给了CreateProcess了。由于这个地址是存放内容的,因此这个地址不可能是NULL,进程地址0是不能存放数据的(见1)的分析)。
但你传到CreateProcess里的是个空指针,因此造成CreateProcess永远找不到可执行文件,CreateProcess调用失败。
分析下_T(""),它的意思是,在一个地址空间里如0x00 48 A1 53这个地址开始的空间里存放了数据内容,但只存放里一样数据,就是标志字符串结束的结束符_T('\0'),这个字符其实就是零。如果你的项目是UNICODE编码的那么最终在0x00 48 A1 53开始的两个字节里存储了两个0,如果是ANSI编码的,存储的是一个0.这也就是CreateProcess在你传给它的地址里根本找不到文件名,只找到1个或2个零,造成了函数失败。
3)CreateProcess的第二个参数是个LPTSTR,我们不应该传指针常量的,而应该传指针变量。_T("cmd.exe/c dir")的形式永远代表的是个指针常量。因此不应该用这种形式传指针给CreateProcess,在CreateProcess里会临时改变这个指针所指地址的数据内容,当然最终CreateProcess还是会恢复这个地址的原始数据的。
vc2010创建c程序的方法如下:1、在打开的VC2010中选择C++。
2、点击“文件”,在“新建”选项卡中选择“项目”,选择“win32控制台程序”,命名文件。
3、点击“下一步”的“空项目”。
4、左键点击C1,右键点击“源文件”,选择“添加”中的“新建项目”,选择C++文件,文件名称。
5、按“Ctrl”和“F5”即可。
HANDLE hMutex=::CreateMutex(NULL,TRUE,_T("CSSegment"))if(hMutex!=NULL)
{
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBoxEx(_T("程序已经运行!"))
CloseHandle(hMutex)
return FALSE
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)