我把这个代码放在我的* .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");
更新
还有其他方法吗?每次我在程序中运行这行代码时,仍会调用控制台窗口。
答案 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 );