vc中创建进程问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 14:07:43
真奇怪了,怎么CreateProcess函数返回的是0,错误代码是无法找到系统文件?
而且CreateProcess的第一个参数不能设为NULL,一设为NULL就内存冲突。
#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{

HANDLE hReadPipe,hWritePipe;
SECURITY_ATTRIBUTES sa;
memset(&sa,0,sizeof(SECURITY_ATTRIBUTES));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
//----------------------
if(!CreatePipe(&hReadPipe,&hWritePipe,&sa,0))
{
::MessageBox(NULL,_T("err on CreatePipe()"),_T("."),MB_OK);
return 1;
}
STARTUPINFO si;
memset(&si,0,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
memset(&pi,0,sizeof(PROCESS_INFORMATION));
GetStartupInfo(&si);
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDO

CreateProcess(_T(""),_T("cmd.exe/c dir"),
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这个地址开始的空间里存放了数据内容,但只存放里一样数据,就是标志字符串结束的结束符_