问:怎样在一个程序运行后面运行另一个程序?
●1、 在一个程序里面运行另一个程序的最简单的方法是把它们依次列入一个批处理文件(扩展名为.BAT的文件),在执行该批处理文件时,其中所列程序就会自动运行。
在C或DOS中,都没有一种特定的方法来完成“在一个程序结束后运行另一个程序”这样一种函数调用。然而,C提供了两组函数,它们允许一个程序随时可以运行另一个程序,而后者的运行将结束前者的运行。如果你将这样的函数调用放在第一个程序的末尾,就能达到上述目的。C提供的这两组函数是exec()和spawn()函数族,其中的每一个函数都具有一种区别于其它函数的功能。exec()函数族包含这样一些成员:execl()、execle()、execlpe()、execv()、execve()和execvpe()。下面列出了这中中的e,l,p和v等后缀的含义:
e 明确地把一个指向环境参数的指针数组传递给子进程
l 把命令参数上传递给要执行的程序
p 通过环境变量PATH找到要执行的函数
v 把命令行参数以一个指针数组的形式传递给要执行的程序
在程序中选用哪一个函数完全取决于你以及要执行的程序的需要。下例中的程序调用了其参数由命令行指定的另一个程序:
#include<stdio.h>
#include<process.h>
char *envString[]=
"COMM_VECTOR=0x63",
"PARENT=LAUNCH.EXE",
"EXEC=EDIT.COM",
NULL};
void main(int argc,char **argv)
{
_execvpe("EDIT.COM",argv,envString);
printf("If you can read this sentence,the exec did'nt happen!\n");
}
上面这个短小的例子调用_execvpe()来执行DOS的文件编辑器EDIT.COM,EDIT程序的参数来自该例的命令行。在调用_execvpe函数后,上例中的程序就结束了EDIT程序退出时,你将返回到DOS提示符。如果printf语句的打印内容出现在屏幕上,则说明_execvpe()函数调用出了问题,因为如果它调用成功,就不会有上述结果。注意上例所提供的EDIT.COM的环境变量是没有任何意义的。然而如果上例要执行一个需要环境变量的程序,那么所提供的环境变量就能供给该程序使用了。
用spawn函数同样可以完成上例所做的工作。spwan()函数族包括这样一些成员:spawnl()、spawnle()、spawnlp()、spawnlpe()、spawnv()、spawnve()、spawnvp()和spawn()函数。这些函数名中的e,l,p,和v等后缀的含义与exec()函数族函数名中的相同。实际上,spawn()函数族与exec()函数族基本相同,只不过有一点小小的差别----spawn()函数既可以在结束原来的程序后启动另一个程序,也可以启动另一个程序并在该程序结束后返回到原来的程序中。spawn()函数的参数与exec()函数的基本相同,只不过需要增加一个参数----你必须用_P_OVERLAY(结束原来的程序)或_P_WAIT(结束后返回到原来的程序)作为spawn()函数的第一个参数。下例用spawn()函数完成了与前面的例子相同的工作:
#include<stdio.h>
#include<process.h>
char *envString[]={
"COMM_VECTOR=0x63",
"PARENT=LAUNCH.EXE",
"EXEC=EDIT.COM",
NULL};
void main(int argc,char **argv)
{
_spawnvpe(_P_OVERLAY,"EDIT.COM",argv,envString);
printf("If can read this sentence,the exec did'nt happen!\n");
}
这里唯一区别是"exec"变为"spawn",并且增加了模式(mode)参数。spawn()函数有复盖和等待两种相对立的功能,它使你可以在spawn()运行期间做出是等待还是离开的决定,如果使用_P_WAIT,那么就是等待。
●2、还有一种方法可以完成在一个程序运行期间运行另一个程序,即使用system()函数。system()函数与前面讲的函数相似但也有不同的地方。除了挂起(而不是结束)当前程序去执行新的程序外,system()还需要启动COMMAND.COM命令翻译程序(或者其它任何运行在你的上命令翻译程序)。如果system()找不到COMMAND命令,那么它就不去执行所要求的程序(这一点与exec()或spawn()函数是不同的)下面的例子调用EDIT.COM编辑一个文件:
#include<stdio.h>
#include<process.h>
#include<stdlib.h>
char argStr[256];
void main(int argc,char **argv)
{
int ret;
sprintf(argStr,"EDIT %s",(argv[1]==NULL?"HELLO":argv[1]));
ret=system(argStr);
printf("system() returned %d\n",ret);
}
与上面的例子一样(使用_P_WAIT),在system()调用后面的printf()语句会执行。因为原来的程序只是挂起而不是终止。在每一种情况下,system()都会返回一个表示是否成功地运行了所指定的程序的值,而不会返回所指定的程序的返回值
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
另一个:
Q: 如何打开一个应用程序?
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或
ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );
As you can see, I havent passed the full path of the programs.
Q: 如何打开一个同系统程序相关连的文档?
ShellExecute(this->m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );
Q: 如何打开一个网页?
ShellExecute(this->m_hWnd,"open",
" http://www.google.com","","", SW_SHOW );
Q: 如何激活相关程序,发送EMAIL?
ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );
Q: 如何用系统打印机打印文档?
ShellExecute(this->m_hWnd,"print",
"c:\\abc.txt","","", SW_HIDE);
Q: 如何用系统查找功能来查找指定文件?
ShellExecute(m_hWnd,"find","d:\\nish",
NULL,NULL,SW_SHOW);
Q: 如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
Q: 如何显示文件或文件夹的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\\"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo)