VC中调用外部EXE的方法及其思考
VC中调用外部EXE的方法及其思考
——每周杂谈 第004篇
作者:Tocy 时间:2012-05-26
1. windows下的system函数
system函数主要用在C语言下,但是在C++中也是可以使用,并且已经收录至C标准库中。函数原型如下:
用 法: int system(char *command);
功 能: 发出一个DOS命令
返回值:如果command为空,并且命令解释器存在,返回非零值。如果命令解释器不存在,返回0并设置errno为ENOENT。如果command不为空,函数返回是由具体的命令解释器的返回值确定的,也就是说只有执行的命令解释器返回0时该函数才会返回0.如果返回值为-1,则表示错误。
详细解释可以参考http://msdn.microsoft.com/en-us/library/277bwbdz(v=vs.80).aspx
或者在MSDN中搜索system function in C。
显然system函数执行的是dos命令,很难做到交互控制,但是这个函数使用起来非常简单。一个经常使用的命令暂停system("pause")。
当然这个函数说成VC下调用外部程序有点牵强。
2. WinExec
Windows下提供的API函数。函数参数很简单,只有两个,原型如下:
UINT WinExec(
LPCSTR lpCmdLine, // 命令路径
UINT uCmdShow // 显示方式
);
第一个参数命令行包含可执行程序的全路径和参数(参数是可选的)。第二个参数是显示方式较常用的有SW_SHOW、SW_MAXIMIZE、SW_MINIMIZE。
返回值:函数成功执行返回值大于31。否则失败。
该函数只能调用exe程序。
使用例子:
WinExec("Notepad.exe", SW_SHOW); // 打开记事本
MSDN中说明一种情况就是WinExec返回的条件是启动的进程调用GetMessage函数或者超时,所以如果对于实时性要求较高的话,使用该函数启动的进程最好尽快调用GetMessage函数。
详细参数可以参考:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687393(v=vs.85).aspx
3. ShellExcute
原型如下:
HINSTANCE ShellExecute(
HWND hwnd, //父窗口句柄
LPCTSTR lpOperation, //操作, 打开方式 "edit","explore","open","find","print","NULL"
LPCTSTR lpFile, //文件名,前面可加路径
LPCTSTR lpParameters, //参数
LPCTSTR lpDirectory, //默认文件夹
INT nShowCmd //显示方式
);
使用方法如下:
// 打开C:\Test.txt 文件
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);
// 打开网页www.google.com
ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL);
// 打开目录D:\C++
ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL);
ShellExecute不支持定向输出。这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
该函数返回值的意义同WinExec函数。
链接:http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx
4 创建新线程
使用CreateProcess函数创建子进程或者独立进程。
这个函数的具体使用这里不介绍。关系到多进程的问题,相对较为复杂,具体使用请参考msdn。很明显如果创建新的进程可以使用各种进程通信技术,更加灵活方便,但是相对的使用起来更为复杂,涉及到IPC知识。
链接:http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
注:版权所有,请勿用于商业用途,转载请注明原文地址。本人保留所有权利。
----------------------------------------------------------------------------------------------------------------------------
本文作者:Tocy e-mail: zyvj@qq.com
版权所有@2015-2020,请勿用于商业用途,转载请注明原文地址。本人保留所有权利。