VC中调用其它程序

1、system

格式:int system(char * command);

2、WinExec

格式: UINT WinExec(
       LPCSTR lpCmdLine,    // 命令路径
       UINT uCmdShow       // 显示方式
;

3、ShellExecute

       HINSTANCE ShellExecute(
       HWND hwnd,            //父窗口句柄
       LPCTSTR lpOperation,    //操作, 打开方式 "edit","explore","open","find","print","NULL"
       LPCTSTR lpFile,          //文件名,前面可加路径
       LPCTSTR lpParameters,    //参数
       LPCTSTR lpDirectory,     //默认文件夹
       INT nShowCmd           //显示方式
);

4、CreateProcess

 BOOL CreateProcess(
       LPCTSTR lpApplicationName, //执行程序名
       LPTSTR lpCommandLine,   // 参数行
       //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性

       LPSECURITY_ATTRIBUTES lpProcessAttributes,   // process security attributes
       LPSECURITY_ATTRIBUTES lpThreadAttributes,    // thread security attributes

       BOOL bInheritHandles,   // 继承标志
       DWORD dwCreationFlags, // 创建标志
       LPVOID lpEnvironment,   // 环境变量
       LPCTSTR lpCurrentDirectory,    // 运行该进程的初始目录
       LPSTARTUPINFO lpStartupInfo,   // 用于在创建子进程时设置各种属性
       LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
      ; 

#include <afxwin.h>
#define EXECDOSCMD "dir c:" //可以换成你的命令
void main()
{
	SECURITY_ATTRIBUTES sa;

	HANDLE hRead,hWrite;

	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;

	if (!CreatePipe(&hRead,&hWrite,&sa,0))
	{
		AfxMessageBox("创建通道失败");
		return ;
	}

	char command[1024]; //指定命令行的大小
	strcpy(command,"Cmd.exe /C ");
	strcat(command,EXECDOSCMD);

	STARTUPINFO si;

	PROCESS_INFORMATION pi;

	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);

	si.hStdError = hWrite; //把创建进程的标准错误输出重定向到管道输入
	si.hStdOutput = hWrite; //把创建进程的标准输出重定向到管道输入
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

	//关键步骤,CreateProcess函数参数意义请查阅MSDN

	if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
	{
		CloseHandle(hWrite);
		CloseHandle(hRead);
		return ;
	}

	CloseHandle(hWrite);

	char buffer[4096] = {0}; //用4K的空间来存储输出的内容
	DWORD bytesRead;
	while (true)
	{

		if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
			break;
		AfxMessageBox(buffer); //这里是弹出对话框显示
	}

	CloseHandle(hRead);
}

 注意:

  在用CreateProcess方法执行dos命令时,有可能不能执行成功。些时可以将编译的版本变为Release版本就可以成功执行。

posted @ 2013-09-11 09:20  Fly Hawk  阅读(277)  评论(0编辑  收藏  举报