2015-05-02 40 views
-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; 
} 

我只是想不出什麼問題。

+1

外殼是否不使用標準手柄的控制檯手柄?例如,它是否使用管道來模擬Unix pty?如果是這樣,請嘗試創建可繼承的重複項,併爲'bInheritHandles'使用'TRUE'調用'CreateProcess'。 – eryksun

+0

不是您的直接問題,但請注意'_T((char *)name.c_str())'是錯誤的; _T宏只適用於字符串文字。 (我想你使用的是多字節字符集,或者它甚至不會編譯。)另外,在Unicode模式下,命令行參數必須指向一個可修改的緩衝區,而不是一個常量字符串。 –

回答

0

我不好在cygwin工作,我不得不在父母和孩子之間添加同步代碼,但cmd shell也以naife的方式工作。 Thx Harry Johnston在_T宏上的觀點。

相關問題