86 lines
2.5 KiB
C++
86 lines
2.5 KiB
C++
|
#include "pch.h"
|
|||
|
#include "misc.h"
|
|||
|
#include "usrerr.h"
|
|||
|
|
|||
|
#include <strsafe.h>
|
|||
|
#include <spdlog/spdlog.h>
|
|||
|
|
|||
|
|
|||
|
void RemoveTailLineBreak(TCHAR* pInputStr, int strSize)
|
|||
|
{
|
|||
|
size_t length;
|
|||
|
if (pInputStr)
|
|||
|
{
|
|||
|
if (StringCbLength(pInputStr, strSize, &length) == S_OK && length > 0)
|
|||
|
{
|
|||
|
if (pInputStr[length - 2] == '\r' && pInputStr[length - 1] == '\n')
|
|||
|
{
|
|||
|
pInputStr[length - 2] = pInputStr[length - 1] = 0;
|
|||
|
}
|
|||
|
else if (pInputStr[length - 1] == '\n')
|
|||
|
{
|
|||
|
pInputStr[length - 1] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int RunPipeCmd(TCHAR* pszCmd, TCHAR* pszResultBuffer, int dwResultBufferSize)
|
|||
|
{
|
|||
|
BOOL bRet;
|
|||
|
HANDLE hReadPipe = nullptr;
|
|||
|
HANDLE hWritePipe = nullptr;
|
|||
|
STARTUPINFO si;
|
|||
|
PROCESS_INFORMATION pi;
|
|||
|
SECURITY_ATTRIBUTES securityAttributes;
|
|||
|
|
|||
|
memset(&securityAttributes, 0, sizeof(SECURITY_ATTRIBUTES));
|
|||
|
memset(&si, 0, sizeof(STARTUPINFO));
|
|||
|
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
|
|||
|
|
|||
|
// 设定管道的安全属性
|
|||
|
securityAttributes.bInheritHandle = TRUE;
|
|||
|
securityAttributes.nLength = sizeof(securityAttributes);
|
|||
|
securityAttributes.lpSecurityDescriptor = nullptr;
|
|||
|
|
|||
|
// 创建匿名管道
|
|||
|
bRet = ::CreatePipe(&hReadPipe, &hWritePipe, &securityAttributes, 0);
|
|||
|
if (FALSE == bRet)
|
|||
|
{
|
|||
|
SPDLOG_ERROR(TEXT("CreatePipe Error"));
|
|||
|
return -ERR_SYS_CALL;
|
|||
|
}
|
|||
|
|
|||
|
// 设置新进程参数
|
|||
|
si.cb = sizeof(si);
|
|||
|
si.hStdError = hWritePipe;
|
|||
|
si.hStdOutput = hWritePipe;
|
|||
|
si.wShowWindow = SW_HIDE;
|
|||
|
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
|
|||
|
|
|||
|
// 创建新进程执行命令, 将执行结果写入匿名管道中
|
|||
|
bRet = ::CreateProcess(nullptr, (pszCmd), nullptr, nullptr, TRUE, 0, nullptr, nullptr, &si, &pi);
|
|||
|
if (FALSE == bRet)
|
|||
|
{
|
|||
|
SPDLOG_ERROR(TEXT("CreateProcess Error"));
|
|||
|
}
|
|||
|
|
|||
|
// 等待命令执行结束
|
|||
|
::WaitForSingleObject(pi.hThread, INFINITE);
|
|||
|
::WaitForSingleObject(pi.hProcess, INFINITE);
|
|||
|
|
|||
|
// 从匿名管道中读取结果到输出缓冲区
|
|||
|
::RtlZeroMemory(pszResultBuffer, dwResultBufferSize);
|
|||
|
::ReadFile(hReadPipe, pszResultBuffer, dwResultBufferSize, nullptr, nullptr);
|
|||
|
|
|||
|
// 关闭句柄, 释放内存
|
|||
|
::CloseHandle(pi.hThread);
|
|||
|
::CloseHandle(pi.hProcess);
|
|||
|
::CloseHandle(hWritePipe);
|
|||
|
::CloseHandle(hReadPipe);
|
|||
|
|
|||
|
RemoveTailLineBreak(pszResultBuffer, dwResultBufferSize);
|
|||
|
//pszResultBuffer[dwResultBufferSize - 1] = 0;
|
|||
|
return ERR_SUCCESS;
|
|||
|
}
|