Windows下,在C++中执行exe,以及执行命令的一些方法

Windows下,在C++中执行exe,以及执行命令有其中一下几种方法:
(1)system
(2)ShellExecute
(3)CreateProcess
(4)使用通道

一、使用system
这个都比较熟悉,直接system(“cmd”);即可

二、使用shellExecute
int ret = (int)ShellExecute(NULL, L"", L"fortemp.exe",NULL, L"F:\\vs2017workplace\\ConsoleTest\\", SW_SHOWNA);
其中第三个参数是所要执行的exe文件,第五个参数是所要执行的exe文件所在目录。

三、使用CreatProcess

TCHAR szCmdline[] = TEXT("F:/vs2017workplace/ConsoleTest/fortemp.exe"); // 设置子进程路径
	BOOL bSuccess = FALSE;
	PROCESS_INFORMATION pi;  // 用来接收新进程的识别信息
	STARTUPINFO si;  // 用于决定新进程的主窗体如何显示
	// 设置PROCESS_INFORMATION
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));  // 用0填充内存区域
		// 设置STARTUPINFO
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);  // 结构大小

//HANDLE  read1, write1, read2, write2;
//*************** 句柄继承设置******************
						  // 创建了两个管道
						  // 管道1由父进程读,子进程写
						  // 管道2由父进程写,子进程读
//si.hStdError = write1;      // 错误输出句柄(在写句柄中写回父进程)
//si.hStdOutput = write1;     // 子进程继承管道1写句柄
//si.hStdInput = read2;       // 子进程继承管道2读句柄
						  //*************** 句柄继承设置******************
si.dwFlags |= STARTF_USESTDHANDLES;  // 使用hStdInput 、hStdOutput 和hStdError 成员  
		  // 创建子进程
		 // 摘自msdn:
 // If lpApplicationName is NULL, 
 // the first white space–delimited token of the command line specifies the module name. 
bSuccess = CreateProcess(
	NULL,          // lpApplicationName
	szCmdline,     // command line 
				   // 以上两个字段都可以创建目标子进程
	NULL,          // process security attributes 
	NULL,          // primary thread security attributes 
	TRUE,          // bInheritHandles:指示新进程是否从调用进程处继承了句柄
	0,           // creation flags:指定附加的、用来控制优先类和进程的创建的标志。
				   // 设置为 CREATE_NEW_CONSOLE 可显示子窗口
	NULL,          // use parent's environment 
	NULL,          // use parent's current directory 
	&si,           // STARTUPINFO :指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体
	&pi            // PROCESS_INFORMATION :指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体
);

// If an error occurs, exit the application. 
if (!bSuccess)
	cout << "创建子程序失败" << endl;
else
{
	cout << "创建子程序成功" << endl;
	// 关闭一些子进程用的句柄
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
}`

这段代码来源于其他博客,但是我没有执行通过,但也是一种执行exe或者执行命令的一种方法,不建议使用。

四、使用通道

	bool bRet = false;

	// chcp 437 这个命令把操作系统默认语言强制转换成英文显示,便于解析。
	//const string PING_CMD = "chcp 437 && F:\\Projects\\git\\fdebugger\\Tests\\BasicStmtTest\\XtestResult\\a.exe ";

	const string PING_CMD = "F:\\vs2017workplace\\ConsoleTest\\fortemp.exe";

	string PING_CMD_IP(PING_CMD);
//	PING_CMD_IP.append(IP);

	char pingResult[512] = { 0 };

	// 通过管道调用命令
	FILE *pPipe;
	if (NULL == (pPipe = _popen(PING_CMD_IP.c_str(), "rt")))
	{
		exit(1);
	}
	// 解析结果
	while (fgets(pingResult, 512, pPipe))
	{
		// 打印 结果
		cout << pingResult << endl;
	}

	_pclose(pPipe);
	return bRet;

使用通道的方法在执行exe文件时可能会不通过,但是执行其他的命令时不失为一种好方法,他可以不出现命令提示符的黑框。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我们可以使用 Windows 平台上的网络函数来实现这一功能。 下面是一个简单的例子,它使用了 socket 和 CreateProcess 函数: ``` #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <string.h> #include <windows.h> #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFLEN 512 int main(int argc, char** argv) { WSADATA wsaData; int iResult; SOCKET ListenSocket = INVALID_SOCKET; SOCKET ClientSocket = INVALID_SOCKET; struct addrinfo* result = NULL; struct addrinfo hints; int iSendResult; char recvbuf[DEFAULT_BUFLEN]; int recvbuflen = DEFAULT_BUFLEN; // 初始化 Winsock iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; } ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // 获取地址信息 iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // 创建监听套接字 ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } // 绑定套接字 iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("bind failed with error: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; } freeaddrinfo(result); // 监听套
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值