启动进程的常用方式

记下,免得忘记了。

#include "ProcessHelper.h"

#include <windows.h>
#include <fstream>

#include "StringHelper.h"


namespace CProcessHelper
{
	/*
	Title:启动外部程序,并返回外部程序的标准输出。
	Author: Kagula
	Date: 2015-12-30
	Environment: Win7SP1
	*/
	std::string RunProcess(std::string fileName)
	{
		wchar_t cmdLine[MAX_PATH];
		wsprintf(cmdLine, L"Ping.exe 192.168.0.29");
		SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, TRUE };
		SECURITY_ATTRIBUTES *psa = NULL;
		DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;

		psa = &sa;
		dwShareMode |= FILE_SHARE_DELETE;

		HANDLE hConsoleRedirect = CreateFile(
			kagula::StringHelper::s2ws_gbk(fileName).c_str(),
			GENERIC_WRITE,
			dwShareMode,
			psa,
			OPEN_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			NULL);


		if (hConsoleRedirect == INVALID_HANDLE_VALUE)
		{
			return "{message:'create the temporary file failed!'}";
		}


		STARTUPINFO s = { sizeof(s) };
		s.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
		s.hStdOutput = hConsoleRedirect;//将文件作为标准输出句柄  
		s.wShowWindow = SW_HIDE;//隐藏控制台窗口  
		PROCESS_INFORMATION pi = { 0 };
		if (CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, NULL, NULL, NULL, &s, &pi))
		{
			WaitForSingleObject(pi.hProcess, INFINITE);

			CloseHandle(pi.hProcess);
			CloseHandle(pi.hThread);
		}

		CloseHandle(hConsoleRedirect);

		std::ifstream fin(fileName.c_str(), std::ios::_Nocreate);
		if (!fin)
		{
			return "{message:'Open the temporary file failed!'}";
		}

		char buf[1024];
		memset(buf, 0, sizeof(buf));
		if (!fin.eof())
		{
			fin.read(buf, sizeof(buf));
		}
		fin.close();

		std::string returnR = buf;
		DeleteFileA(fileName.c_str());

		return returnR;
	}
}

同步启动进程

#include <windows.h>

#include <string>

void RunProcess(LPWSTR cmdLine)
{
	STARTUPINFO s = { sizeof(s) };
	s.dwFlags = STARTF_USESHOWWINDOW;  
	s.wShowWindow = SW_HIDE;//隐藏控制台窗口    
	PROCESS_INFORMATION pi = { 0 };
	if (CreateProcess(cmdLine, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &s, &pi))
	{
		WaitForSingleObject(pi.hProcess, INFINITE);

		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	//测试同步调用进程。。。
	RunProcess(L"c://program files//internet explorer//iexplore.exe");

	return 0;
}

异步启动进程

WinExec(m_configure.m_fullPathApp.c_str(),SW_NORMAL);


CentOS下同步启动进程

要包含的头文件

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
代码段
	//CentOS 6.5, GCC 4.4.7
	std::string RunPlateRecognitionProcess(std::string imageUrl)
	{
		std::string cmd = "./EasyPR_PlateRecognition ";
		cmd.append(imageUrl);

		char buf1024[1024];

		std::string result;
		FILE    *stream;


		if ((stream = popen(cmd.c_str(), "r")) == NULL)
		{
			return "{\"message\",\"Invoke the process failed!\"}";
		}

		setvbuf(stream, NULL, _IONBF, 0);//直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
		
		while ((fgets(buf1024, sizeof(buf1024), stream)) != NULL)
		{
			result.append(buf1024);
			fflush(stdout);
		}
		pclose(stream);

		return result;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值