
windows MFC 用CreateProcess创建GCC进程!
windows环境下MFC程序中用CreateProcess调用gcc.exe进程,并且把GCC的编译结果输出到output文件的程序代码怎么编写?...
windows环境下 MFC程序中 用CreateProcess调用gcc.exe进程,并且把GCC的编译结果输出到 output 文件的程序代码怎么编写?
展开
1个回答
展开全部
#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;
}
好了管道的。缓冲区那边自己改造没问题吧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询