一个关于CreateProcess的有关问题
一个关于CreateProcess的问题
一个关于CreateProcess的问题
有程序实现用记事本打开c:\inetpub\wwwroot\iisstart.asp文件.
...
PROCESS_INFORMATION NewProcessInformation;
STARTUPINFO StartUpInformation;
memset(&StartUpInformation,0,sizeof(StartUpInformation));
StartUpInformation.cb=sizeof(StartUpInformation);
StartUpInformation.wShowWindow=SW_SHOW;
StartUpInformation.dwFlags=STARTF_USESHOWWINDOW;
LPCTSTR OpenCommand= "C:\\winnt\\notepad.exe ";
LPTSTR OpenName= "c:\\inetpub\\wwwroot\\iisstart.asp ";
IsSuccess=CreateProcess(OpenCommand,OpenName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&StartUpInformation,&NewProcessInformation);
if(!IsSuccess)
cout < < "不能打开文件\n ";
else
cout < < "文件打开成功\n ";
执行这段程序只打开记事本,没有用记事本打开c:\inetpub\wwwroot\iisstart.asp
若程序改为:
...
// LPCTSTR OpenCommand= "C:\\winnt\\notepad.exe ";
LPTSTR OpenName= "C:\\winnt\\notepad.exe c:\\inetpub\\wwwroot\\iisstart.asp ";
IsSuccess=CreateProcess(NULL,OpenName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&StartUpInformation,&NewProcessInformation);
if(!IsSuccess)
cout < < "不能打开文件\n ";
else
cout < < "文件打开成功\n ";
则用记事本打开文件c:\inetpub\wwwroot\iisstart.asp成功,
为什么把所有参数集中在第二个参数lpCommandLine中可以成功。
不明白这是为什么.
------解决方案--------------------
LPTSTR OpenName= "c:\\inetpub\\wwwroot\\iisstart.asp ";
改成下面这样就可以了
LPTSTR OpenName= " c:\\inetpub\\wwwroot\\iisstart.asp "; //字符 'c '的前面加了个空格
你可以做个实验,不加空格的话 "c:\\inetpub\\wwwroot\\iisstart.asp "变成了子进程的argv[0];
加个空格 "c:\\inetpub\\wwwroot\\iisstart.asp "为子进程的argv[1]
一个关于CreateProcess的问题
有程序实现用记事本打开c:\inetpub\wwwroot\iisstart.asp文件.
...
PROCESS_INFORMATION NewProcessInformation;
STARTUPINFO StartUpInformation;
memset(&StartUpInformation,0,sizeof(StartUpInformation));
StartUpInformation.cb=sizeof(StartUpInformation);
StartUpInformation.wShowWindow=SW_SHOW;
StartUpInformation.dwFlags=STARTF_USESHOWWINDOW;
LPCTSTR OpenCommand= "C:\\winnt\\notepad.exe ";
LPTSTR OpenName= "c:\\inetpub\\wwwroot\\iisstart.asp ";
IsSuccess=CreateProcess(OpenCommand,OpenName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&StartUpInformation,&NewProcessInformation);
if(!IsSuccess)
cout < < "不能打开文件\n ";
else
cout < < "文件打开成功\n ";
执行这段程序只打开记事本,没有用记事本打开c:\inetpub\wwwroot\iisstart.asp
若程序改为:
...
// LPCTSTR OpenCommand= "C:\\winnt\\notepad.exe ";
LPTSTR OpenName= "C:\\winnt\\notepad.exe c:\\inetpub\\wwwroot\\iisstart.asp ";
IsSuccess=CreateProcess(NULL,OpenName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&StartUpInformation,&NewProcessInformation);
if(!IsSuccess)
cout < < "不能打开文件\n ";
else
cout < < "文件打开成功\n ";
则用记事本打开文件c:\inetpub\wwwroot\iisstart.asp成功,
为什么把所有参数集中在第二个参数lpCommandLine中可以成功。
不明白这是为什么.
------解决方案--------------------
LPTSTR OpenName= "c:\\inetpub\\wwwroot\\iisstart.asp ";
改成下面这样就可以了
LPTSTR OpenName= " c:\\inetpub\\wwwroot\\iisstart.asp "; //字符 'c '的前面加了个空格
你可以做个实验,不加空格的话 "c:\\inetpub\\wwwroot\\iisstart.asp "变成了子进程的argv[0];
加个空格 "c:\\inetpub\\wwwroot\\iisstart.asp "为子进程的argv[1]