CreateProcess 函数中的问题!
Posted
技术标签:
【中文标题】CreateProcess 函数中的问题!【英文标题】:Problem in CreateProcess function! 【发布时间】:2010-03-10 05:04:33 【问题描述】:我有我的主应用程序,我将从我的主应用程序调用另一个 模块(第三方)在我的主应用程序中执行一个小操作,当我调用该模块时..它处理特定时间说 5 秒。而它的处理它在命令窗口中显示了一些信息..现在我的主应用程序一直等到被调用的模块完成其进程。现在我的问题是..如何隐藏此命令窗口而不干扰其进程..我尝试使用 createprocess 但它似乎不起作用...
例如:我的主应用程序是父进程,被调用的应用程序是子进程..父进程应该独立于子进程..请查看下面的示例
int main()
execl("c:\\users\\rakesh\\Desktop\\calledapplication.exe","c:\\users\\rakesh\\Desktop \\calledapplication.exe",0);
code in calledapplication
int main
printf("Rakesh");
现在考虑上述情况,如果您运行第一个程序...输出将出现在相同的 命令窗口(不应该这样)...我希望主应用程序创建进程,但它不应该受到子进程的影响。
【问题讨论】:
【参考方案1】:在CreateProcess
的dwCreationFlags
参数中传递CREATE_NO_WINDOW
。
【讨论】:
@Rakesh - 没有为进程显示控制台窗口与以某种方式强制程序无法显示它被编程显示的消息框是完全不同的请求。你应该在你的问题中明确说明你想要做什么,这样人们就不会猜测或解决错误的问题【参考方案2】:你谈到了一个“命令窗口”,所以我假设这个孩子是一个控制台应用程序。 在这种情况下,您可以在单独的控制台中创建进程,并可选择强制新控制台图标化或隐藏。 以下代码启动解释批处理文件 (mytest.bat) 的子进程。 我希望它可以帮助。问候。
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL rv = FALSE;
WCHAR cmdline[] = TEXT("cmd.exe /c mytest.bat");
memset(&si,0,sizeof(si));
si.cb = sizeof(si);
// Add this if you want to hide or minimize the console
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; //or SW_MINIMIZE
///////////////////////////////////////////////////////
memset(&pi,0,sizeof(pi));
rv = CreateProcess(NULL, cmdline, NULL, NULL,
FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi);
if (rv)
WaitForSingleObject(pi.hProcess, INFINITE);
printf("Done! :)\n");
else
printf("Failed :(\n");
return rv ? 0 : 1;
【讨论】:
我已经尝试了很多方法和示例来隐藏我闪烁的 cmd.exe 窗口(我使用参数运行 cmd),目前打开了 12 个浏览器选项卡,只有关于 ShellExecute、ShellExecuteEx 和创建进程。似乎没有什么对我有用,我不敢为此发布问题,因为已经有很多东西要读了。为了我的健康,我仍然必须把它扔掉(这是我尝试的第二天,但我的希望已接近尾声)。我从来没有想象过一些“简单”的事情,因为隐藏一个带有参数的 cmd.exe 窗口对 c++ 来说会如此痛苦...... 我的示例代码是否在您的环境中工作,例如在“mytest.bat”中只有“@echo off”?(顺便问一下,你使用的是什么系统/架构?) 您好 Giuseppe:感谢您抽出宝贵时间回复我。我的工作环境是 Windows 10 x64 - 实际上我不是使用代码来调用/执行外部 .bat,而是在使用参数调用时隐藏 cmd.exe 窗口:ghostbin.com/paste/a9sek。但是,即使使用 ShellExecute(Ex) 我也无法隐藏闪烁的窗口。我知道还有其他方法/解决方法,即 vbs (Windows Scripting Host),但我真的很想使用 c++ 来做到这一点。不幸的是,***(或任何其他网站)上发布的答案/解决方案都没有在这方面对我有所帮助:-( 在第 20 行的示例中,有“memset(&si,0,sizeof(pi));”,这会清除“si”中的设置。我想你会写“memset(&pi,0,sizeof(pi));”。 嗯,你是第一个注意到/提到它的人。显然,它比我想象/想象的要多(c(++) 文盲的缺点)。【参考方案3】:听起来您希望子进程的输出显示在单独的窗口中。如果是这样,您想调用CreateProcess
并将CREATE_NEW_CONSOLE
标志传递给它,而不是使用exec*
。
【讨论】:
以上是关于CreateProcess 函数中的问题!的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Delphi Prism 中调用函数 CreateProcess?
Delphi 2009 中函数 CreateProcess 的访问冲突