windows MFC 用CreateProcess创建GCC进程!

windows环境下MFC程序中用CreateProcess调用gcc.exe进程,并且把GCC的编译结果输出到output文件的程序代码怎么编写?... windows环境下 MFC程序中 用CreateProcess调用gcc.exe进程,并且把GCC的编译结果输出到 output 文件的程序代码怎么编写? 展开
 我来答
空雪梦见
2013-05-31 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1293万
展开全部
#include <windows.h>
#include <tchar.h>

int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES sa;
    HANDLE hstderr;
    
    TCHAR cmdLine[] = _T("gcc.exe -o123.exe -s 123.c");
    
    ZeroMemory(&sa, sizeof sa);
    sa.nLength = sizeof sa;
    sa.bInheritHandle = TRUE;
    hstderr = CreateFile(_T("gccout.txt"), GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, 0, 0);
    
    ZeroMemory(&si, sizeof si);
    si.cb = sizeof si;
    si.dwFlags = STARTF_USESTDHANDLES;
    si.hStdOutput = INVALID_HANDLE_VALUE;
    si.hStdError = hstderr;
    si.hStdInput = INVALID_HANDLE_VALUE;
    
    CreateProcess(0, cmdLine, 0, 0, TRUE, 0, 0, 0, &si, &pi);
    CloseHandle(hstderr);
    CloseHandle(pi.hThread);
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    
    return 0;
}

代码已调试通过,还没加入出错判断,仅供参考

注:gcc在完全正常编译正常的情况下不会产生输出的,此时文件内容为空。

然后,gcc的环境你要配置好,path环境变量啊那些什么什么东西。mingw的话有一个mingwvars是专业给你干这种事用的

更多追问追答
追问
谢谢,看懂了一点,我要在编译响应函数void CVisualStudioXXDoc::OnDummyCompile() {}
里面添加调用GCC的进程,并且我的输出要输入到Output窗口里去。

我si 参数不会写,要输出到output 需要用到管道pipe呢,

麻烦你说说下这个具体怎么设置啊
追答
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE hPipeIn, hPipeOut;
DWORD bytesRead;
char buffer[4096];
int bufIndex = 0;
 
TCHAR cmdLine[] = _T("gcc.exe -o123.exe -s 123.c");
 
ZeroMemory(&sa, sizeof sa);
sa.nLength = sizeof sa;
sa.bInheritHandle = TRUE;
CreatePipe(&hPipeOut, &hPipeIn, &sa, 0);
 
ZeroMemory(&si, sizeof si);
si.cb = sizeof si;
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = INVALID_HANDLE_VALUE;
si.hStdError = hPipeIn;
si.hStdInput = INVALID_HANDLE_VALUE;

SetHandleInformation(hPipeOut, HANDLE_FLAG_INHERIT, 0);
CreateProcess(0, cmdLine, 0, 0, TRUE, 0, 0, 0, &si, &pi);
CloseHandle(hPipeIn);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

bytesRead = -1;
while(bytesRead != 0) {
ReadFile(hPipeOut, &buffer[bufIndex], 4096 - bufIndex, &bytesRead, 0);
bufIndex += bytesRead;
}
CloseHandle(hPipeOut);
buffer[bufIndex] = 0;

puts("start gcc output");
puts(buffer);
puts("end gcc output");

return 0;
}

好了管道的。缓冲区那边自己改造没问题吧
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式