记下,免得忘记了。
#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;
}