2010-04-30 145 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);