如何隐藏cmd.exe控制台?

时间:2010-04-30 01:18:13

标签: internet-explorer cmd

我把这个代码放在我的* .dll中用于Internet Explorer。

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");

更新

还有其他方法吗?每次我在程序中运行这行代码时,仍会调用控制台窗口。

3 个答案:

答案 0 :(得分:4)

请尝试使用javaw.exe。它与java.exe相同,除了它是Windows图形程序而不是控制台程序,因此它不会打开命令控制台。 (作为副作用,如果不将stdout和stderr重定向到日志文件,您将无法看到它。)

答案 1 :(得分:2)

您可以使用CreateProcess代替_popen。这有点麻烦,但您可以将CREATE_NO_WINDOW标志作为dwCreationFlags参数的一部分传递,以防止出现控制台窗口。

如果您需要捕获已创建的流程的输出,则可以使用CreatePipe / ReadFile来执行此操作。 MSDN有一个完整的例子here

答案 2 :(得分: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 );