gui是图形用户界面,百度一下就知道了啊,我说的gui指的是你的编译器ui,总的有配置程序吧...
不过你自己做匿名管道,居然连它的概念也不明白?
我没做过,网上抄的:
程序代码:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hpiperead = NULL , hpipewrite = NULL;
SECURITY_ATTRIBUTES ai; //安全属性
ai.nLength = sizeof(SECURITY_ATTRIBUTES);
ai.bInheritHandle = true ;
ai.lpSecurityDescriptor = NULL ;
if (!CreatePipe(&hpiperead , &hpipewrite , &ai ,0 )) //创建管道
{
printf("创建匿名管道失败\n");
return 0;
}
char com[1024]; //控制命令
char buff[255];
cin>>buff;
strcpy( com , "cmd.exe /c" );
strcat( com , buff);
STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si); //获取当前进程的STARTUPINFO
si.cb = sizeof(STARTUPINFO);
si.hStdError = hpipewrite ;
si.hStdOutput = hpipewrite ;
si.wShowWindow = SW_SHOW ;
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
if (!CreateProcess(NULL , com , NULL , NULL , true , NULL,NULL , NULL , &si , &pi) ) //创建隐藏的CMD进程
{
CloseHandle(hpipewrite);
CloseHandle(hpiperead) ;
cout<<"1"<<endl;
return 0;
}
char outbuff[4096];
DWORD byteread;
while (1)
{
memset( outbuff ,'\0' ,4096 );
if (ReadFile(hpiperead , outbuff , 4095 , &byteread , NULL) == NULL)
{
break;
}
printf("%s",outbuff);
memset( outbuff ,'\0' ,4096 );
}
cout<<endl;
//创建内核对象使用完之后一定记得关闭,有可能会产生内存泄露
CloseHandle(hpipewrite);
CloseHandle(hpiperead) ;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread) ;
return 0;
}
我的是vs2008, strcpy函数不支持utf8的字符集,如果你也是,自己配置下工程属性,设置里面,把字符集改成未设置就变车管acii码了.
运行之后它就挂接cmd程序了,你可以输入一个cmd命令比如help,然后得到所有帮助列表回馈.
你也可以自己写个程序.比如
int main()
{
cout<<"test";
}
编译后把这个程序的exe复制到上面一个exe目录下,然后把strcpy指向你这个的exe,编译运行后,随便输入什么然后回车就可以得到回馈了.(网上抄的代码很烂,有bug,不过我没做过匿名管道,所以我就不去深入了)
通过以上,你可以看到,匿名管道链接后可以发送命令和得到回馈,也就是你想要的结果(模拟直接打开exe然后输入).另外奉劝你一句,做线程的时候不要用CreateProess,我从没用过,我只用安全线程beginthreadex,这个函数没有统一的标准,每个编译器对这个函数的用法都不一样,如果你的编译器有提示,你可以看它的函数原型,然后网上找用法
我觉得你离你的目标好像有点愚公移山的感觉