-1
我正在研究Windows上的C++項目,並且我想將cygwin不作爲目標環境,但只是作爲替換cmd的shell,我的項目實際上是用mingw編譯windows。CreateProcess()在cmd中工作,但如果在cygwin中執行
我的程序現在只是執行一個CreateProcess,問題是如果我從它的cmd調用它,如果我從cygwin執行程序,它什麼都不做,而CreateProcess()返回true。
這是代碼:
int exec_module(const string& name, HANDLE stdIn, HANDLE stdOut, HANDLE stdErr) {
STARTUPINFO child_sinfo = { sizeof(child_sinfo) };
PROCESS_INFORMATION child_pinfo;
ZeroMemory(&child_sinfo, sizeof(child_sinfo));
child_sinfo.cb = sizeof(child_sinfo);
ZeroMemory(&child_pinfo, sizeof(child_pinfo));
child_sinfo.dwFlags = STARTF_USESTDHANDLES;
child_sinfo.hStdInput = stdIn;
child_sinfo.hStdOutput = stdOut;
child_sinfo.hStdError = stdErr;
return CreateProcess(0, _T((char *) name.c_str()), 0, 0, false,0, 0, 0, &child_sinfo, &child_pinfo);
}
我這樣稱呼它:
if (!exec_module("caccone.exe", GetStdHandle(STD_INPUT_HANDLE), GetStdHandle(STD_OUTPUT_HANDLE), GetStdHandle(STD_ERROR_HANDLE))) {
cout << "Errore durante l'esecuzione del modulo" << endl;
}
我只是想不出什麼問題。
外殼是否不使用標準手柄的控制檯手柄?例如,它是否使用管道來模擬Unix pty?如果是這樣,請嘗試創建可繼承的重複項,併爲'bInheritHandles'使用'TRUE'調用'CreateProcess'。 – eryksun
不是您的直接問題,但請注意'_T((char *)name.c_str())'是錯誤的; _T宏只適用於字符串文字。 (我想你使用的是多字節字符集,或者它甚至不會編譯。)另外,在Unicode模式下,命令行參數必須指向一個可修改的緩衝區,而不是一個常量字符串。 –