批处理
ShellExecute(null, "open ", "c:\\abc.bat ", " ", " ",SW_SHOW );
深入浅出ShellExecute
译者:徐景周(原作:Nishant S)
Q: 如何打开一个应用程序?
正如您所看到的,我并没有传递程序的完整路径。
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);
//创建进程
PROCESS_INFORMATION ProcessInfo;
memset(&ProcessInfo ,0,sizeof( PROCESS_INFORMATION ));
STARTUPINFO StartInfo;
memset(&StartInfo , 0 ,sizeof( STARTUPINFO ));
StartInfo.cb = sizeof(STARTUPINFO);
StartInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
StartInfo.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
StartInfo.hStdOutput = theApp.hConnectWrite;
StartInfo.hStdError = theApp.hConnectWrite;
StartInfo.wShowWindow = SW_HIDE;
StartInfo.lpReserved = NULL;
StartInfo.cbReserved2 = 0;
StartInfo.lpReserved2 = NULL;
//char szProcess[100]= "D:\\LAN\\bcc55\\Bin\\bcc32.exe ";
//char szName[100]= "D:\\LAN\\bcc55\\Bin\\bcc32.exe ";
char szProcess[100]= "tree.com d:\\peon\\VCP ";
BOOL suc= ::CreateProcess( NULL , szProcess , NULL, NULL,TRUE,CREATE_NEW_CONSOLE,
NULL, NULL,&StartInfo, &ProcessInfo);
if( !suc ) AfxMessageBox( "fail! ");
DWORD result = ::WaitForSingleObject( (HANDLE)ProcessInfo.hProcess ,INFINITE);
//if( WAIT_OBJECT_0 == result )AfxMessageBox( "OK ");
if( WAIT_TIMEOUT == result )AfxMessageBox( "TIME_OUT ");
if( WAIT_ABANDONED == result )AfxMessageBox( "WAIT_ABANDONED ");
CloseHandle( theApp.hConnectWrite );
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);
Syntax
HINSTANCE ShellExecute( HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
运行批处理
PROCESS_INFORMATION info;
CreateProcess( "c:\\aaa.bat ",NULL,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE |NORMAL_PRIORITY_CLASS,NULL,NULL,NULL,&pinfo);
批处理执行期间,不断的FindWindow,就是这个aaa.bat的窗口,如果存在则跳过,500毫秒后再检查,直到没找到,说明已完成并关闭了,发现aaa.bat已运行完毕后,就可以使用以下代码获得exit code了:
int code;
GetExitCodeProcess(info.hProcess, &code);
==============================================
另有一个方法:
你的bat运行时,根据不同的运行的结果,在退出之前,建立一个同名文件,但内容不同,如运行的某处,要exit 1时,你这样:
@echo 1> ExitCode.txt
要exit 2时,
@echo 2> ExitCode.txt
程序运行之初要
del ExitCode.txt
这样,你只要不断的检测目录下是否有ExitCode.txt文件,如果有,说明已运行完毕,内容就是所要的ExitCode了。
分享到:
相关推荐
mfc调用cmd命令行,并且获取执行的结果
最近编写了一个vc简单调用批处理文件的程序,和大家分享
VC中调用CMD命令并获取调用结果
VC 调用MatLab数学库接口设计.pdf
VC中调用CMD命令并获取调用结果 VC中调用CMD命令并获取调用结果 VC中调用CMD命令并获取调用结果
ESET_VC52_UPID获取器 1.7.6.3 ESET_VC52_UPID获取器 1.7.6.3
VC调用颜色对话框[借鉴].pdf
vc调用打印预览对话框及打印.visual c++
基于COM的VC调用Matlab的方法及实现.pdf
VC6 调用 unrar.dll 实例 VC6 调用 unrar.dll 实例
maltab基础-基于COM的VC调用Matlab的方法及实现.pdf 附件里有
VC利用WMI获取系统信息..包括BIOS,CPU,显卡,声卡,硬盘,内存的信息
用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的...
VC下面执行DOS命令的例子,可以获取DOS命令执行的结果,可以把命令执行结果记录在日志文件中。
精睿ESET_VC52_UPID获取器 4.2.2.1(32bit)
Visual C++ 是由 Microsoft 公司推出的可视化编程语言,它是目前综合性最高、最强大、也是最难学的软件开发工具之一,应用极为广泛。Matlab是Mathwork公司推出的一种高性能的数值计算和和可视化软件, 其全称为Matrix ...
Windows平台 终端授权库VC调用示例代码 VC++调用示例代码,VS2010工程,支持WindowsXP及以上,x86、x64平台
VC实现管道方式执行bat批处理输出获取
VC 调用系统的日期选择插件,windows日历选择器插件调用演示,相信这个够实用吧,而且是基本技巧,也比较简单,本日期控件既包括标准date picker控件的功能,又支持自己输入日期,使用很方便。
delphi 调用vc dll 获取返回数据 mac地址,遇到的问题是delphi一直都获取不到vc返回的字符串,最后通过strcpy解决了