«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1405937
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]4种启动其它程序的方法[转载]
既瑜(224499) 发表于 2005/3/20 0:01:22

有时我们的程序需要启动其它程序,可能是为了利用它已有的功能,也可能是为了达到某种需要。那么怎样来启动我们需要的程序呢?我暂时知道有4种方法:1、调用API: int system( const char *command );  你可以传入一命令,启动某个程序。如"ping www.vccode.com", "YourExe"等等  不过这里有几点要值得注意:  (1)、他不会立即返回,直到你启动的程序执行完成。  (2)、如果你启动是windows程序,它仍然会启动一个控制台,这就给人感觉太差劲了,但如果本身是控制台的,而且又需要等待它的完成,那这将是比较好的选择。  (3)、它的返回值代表是否执行成功以及程序的退出码。 2、调用API:  UINT WinExec(   LPCSTR lpCmdLine,  // command line   UINT uCmdShow      // window style  );  这个API与API:system同样的简单,都是使用命令行型式。  不过它与API:system相比,有几个优点:  (1)、它将启动了一个新进程,并且立即返回,因此你的程序无需等待。  (2)、它多了一个参数:uCmdShow,通过它你可以一定程度上控件窗体的显示,比如让它后台运行而不显示出来。  (3)、它无论启动控制台程序还是windows程序都只做你想要做的事,不会有上面启动windows程序时先启动控制台窗口的动作。   它的不足之处:  (1)、它完全与本进程脱离,无法做些必要的控制  (2)、无法得知启动的程序是否退出。  (3)、得不到启动的程序的退出码。  等等 3、调用:  HINSTANCE ShellExecute(   HWND hwnd,    LPCTSTR lpVerb,   LPCTSTR lpFile,    LPCTSTR lpParameters,    LPCTSTR lpDirectory,   INT nShowCmd  );  它也有WinExec同样的缺点。  它虽然传回一个HINSTANCE,但他并不是真正的句柄,我们仅能拿它来做一些错误值检查。   但它的功能比前两者更强大,它执行系统的Shell命令。  1、2中如果传入“XX.txt”,它们将不能成功执行,ShellExecute却能很好地执行,它将启动一个默认的文字处理程序来打开它。  1、2中如果传入“www.vccode.com”,将不能成功执行,而ShellExecute却能很好地执行,它将启动一个默认浏览器来打开这个网站。   参数讲解:  参数1 hwnd:一窗体句柄,将作为启动的程序的父窗体。  参数2 lpVerb:你想执行的操作(edit 、explore、find、open、print、properties),你也可以传入NULL值,它将执行默认操作(win2000以前与以后处理略有差别,请见MSDN)。  参数3 lpFile:一文件名或操作的对象。  参数4 lpParameters:如果lpFile是一可执行文件,这个将作为它的参数。它的格式由执行的操作决定。而且当lpFile为一document文件时,此参数需为NULL。  参数5 lpDirectory:指定它的工作目录。  参数6 nShowCmd:窗体显示的控制。   以下是几个例子:  //启动一个Dos命令, 启动windows程序相同  ::ShellExecute(this->GetSafeHwnd(), NULL, "ping", "www.vccode.com", NULL, SW_SHOWNORMAL);   //打开一个文件  ::ShellExecute(this->GetSafeHwnd(), "open", "ReadMe.txt", NULL, NULL, SW_SHOWNORMAL);  //上面的动词可传可不传,但如果"ReadMe.txt"为"ReadMe.bat"那就得指定,否则将会当命令执行,而不是打开它。   //可打开目录  ::ShellExecute(this->GetSafeHwnd(), "open", "c:", NULL, NULL, SW_SHOWNORMAL);   //可打开网页  ::ShellExecute(this->GetSafeHwnd(), "open", "www.vccode.com", NULL, NULL, SW_SHOWNORMAL);   //浏览一个目录  ShellExecute(handle, "explore", "c:"NULL, NULL, SW_SHOWNORMAL);   //查看一个文件或目录的属性  //使用ShellExecuteEx,实现请见所附源码对应部分   如果没有特殊的控制要求,它己能为我们做很了,但当我们一定要能控件这个启动的进程时,那我们就得使用第4点了。 4:调用API:  BOOL CreateProcess(   LPCTSTR lpApplicationName,                 // name of executable module   LPTSTR lpCommandLine,                      // command line string   LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD   LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD   BOOL bInheritHandles,                      // handle inheritance option   DWORD dwCreationFlags,                     // creation flags   LPVOID lpEnvironment,                      // new environment block   LPCTSTR lpCurrentDirectory,                // current directory name   LPSTARTUPINFO lpStartupInfo,               // startup information   LPPROCESS_INFORMATION lpProcessInformation // process information  );  往往看到这个函数就让人生畏,它参数多,而且参数类型也如此莫生。是的,正是因为如此它才功能强大!  但不要怕,作为一般使用,非常简单!下面便是一个简单的例子(启动记事本):   STARTUPINFO StartInfo;  PROCESS_INFORMATION pinfo;  //对程序的启动信息不作任何设定,全部清0  memset(&StartInfo,0,sizeof(STARTUPINFO));  StartInfo.cb = sizeof(STARTUPINFO);//设定结构的大小   BOOL ret=CreateProcess(   NULL, //启动程序路径名   "notepad.exe", //参数(当exeName为NULL时,可将命令放入参数前)   NULL,  //使用默认进程安全属性   NULL,  //使用默认线程安全属性   FALSE,     //句柄不继承   NORMAL_PRIORITY_CLASS, //使用正常优先级   NULL,  //使用父进程的环境变量   NULL,  //指定工作目录   &StartInfo, //子进程主窗口如何显示   &pinfo); //用于存放新进程的返回信息   这样在创建成功这后我们就可以从pinfo中找到它的:进程句柄,线程句柄,进程ID,线程ID  在附件源码中演示了进程序的启动,停止。(实际上我们可以通过很多方式如内存共享、父进程窗体句体传入仍后从消息中获得子进程窗体句柄等,来实现更多的控制。)   想很好地掌握CreateProcess,可参见人民邮电出版社出版的<< Windows系统编程 >>,它的“进程”部份作了很详尽的说明。

阅读全文(1907) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.215 second(s), page refreshed 144765835 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号