2010-04-30 137 views
0

我把下面的代碼放在我的* .dll中,用於Internet Explorer。如何隱藏cmd.exe控制檯?

FILE *child = _popen("java -jar c:\\simmetrics.jar c:\\chtml.txt c:\\thtml.txt > c:\\output.txt", "r"); 

fclose(child); 

我的問題是,當我運行我的Internet Explorer時,將會打開一個cmd.exe控制檯。當我運行我的瀏覽器時,我不希望控制檯突然出現。我該如何避免或隱藏它或根本不執行它)?

更新:

如何從代碼中正確調用javaw?它仍然彈出的控制檯窗口:(

FILE *child = _popen("javaw -jar c:\\simmetrics.jar c:\\chtml.txt c:\\thtml.txt > c:\\output.txt", "r"); 

更新:

是否有任何其他方式在控制檯窗口仍然被稱爲每次我運行此行代碼我的程序裏面

回答

2

您可以使用CreateProcess而不是_popen。這有點麻煩,但您可以將CREATE_NO_WINDOW標誌作爲dwCreationFlags參數的一部分傳遞,以防止出現控制檯窗口。

如果您需要捕獲您創建的流程的輸出,您可以使用CreatePipe/ReadFile這樣做。 MSDN有一個完整的例子來做這個here

4

試試?。使用javaw.exe來代替它,它和java.exe一樣,除了它是一個Windows圖形程序而不是一個控制檯程序,所以它不會打開一個命令控制檯(作爲一個副作用,你將無法看到stdout和stderr而沒有將它們重定向到日誌文件)。

+0

當我在我的CMD控制檯中鍵入javaw並按ENTER鍵時,似乎沒有幫助手冊出現。我可以知道爲什麼以及如何解決這個問題嗎? – karikari 2010-04-30 01:49:32

+0

有沒有其他辦法。它仍然彈出cmd控制檯。 – karikari 2010-05-05 10:26:31

0

另一個答案指出,我們可以使用CreateProcess函數和CREATE_NO_WINDOW標誌。這是一個可行的例子。它有很多額外的力量在這裏沒有顯示。這只是替換system()或_spawn()系列所需的最小值。

STARTUPINFO si; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 

PROCESS_INFORMATION pi; 
ZeroMemory(&pi, sizeof(pi)); 

// Spawn creates a cmd.exe window. CreateProcess doesn't. 
//if (_spawnl(_P_WAIT, szFileNameBAT, szFileNameBAT, NULL)) { 
if (!CreateProcess(szFileNameBAT, szFileNameBAT, NULL, NULL, false, 
        CREATE_NO_WINDOW, NULL, NULL, &si, &pi )) { 
    MyErrorFunc("CreateProcess(\"%s\"): %d", szFileNameBAT, GetLastError()); 
    goto MyErrorHandling; 
} 

WaitForSingleObject(pi.hProcess, INFINITE); 

CloseHandle(pi.hProcess); 
CloseHandle(pi.hThread);