And*_*ert 3 winapi createprocess windows-console
我正在尝试使用CreateProcess(...)运行一个进程,并在一个单独的控制台窗口中独立运行它.
我可以使用系统("...")函数实现这一点,但我更喜欢CreateProcess,因为它让我可以指定环境和工作目录,获取进程的句柄,以及在需要时管道stdin/out至.
我在互联网上找到的只是反问题,即人们有额外的控制台窗口,想要摆脱它们!在早期版本的Windows中打开并显示新的控制台窗口似乎是正常的行为?
现在,即使我运行"cmd.exe/c ...",我也无法获得额外的窗口.
我尝试使用STARTF_USESHOWWINDOW标志没有运气.
有谁有这个问题?
PS:例如,GUI窗口显示.notepad.exe将正常显示.
这是我的代码(实质上)
PROCESS_INFORMATION processInfo;
STARTUPINFOA startupInfo;
ZeroMemory(&startupInfo,sizeof(startupInfo));
startupInfo.dwFlags |= CREATE_NEW_CONSOLE;
startupInfo.dwFlags |= DETACHED_PROCESS;
ok&=CreateProcessA( NULL,
const_cast<char*>(comand.c_str()), // safe for CreateProcessA
NULL, NULL, TRUE, NULL, NULL, NULL,
&startupInfo, &processInfo);
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行C:/Windows/system32/cmd.exe/c help程序运行,我可以读取管道的输出.仍然没有窗口.
Jok*_*_vD 12
在使用Win32 API时,MSDN确实是您最好的朋友.现在,您的相关创建标志如下:
(no flags set)- 子进程(正在启动的进程CreateProcess())将与父进程(调用的进程)共享控制台CreateProcess().
CREATE_NEW_CONSOLE - 子进程将收到一个新控制台,在新窗口中打开.正如MSDN明确指出的那样,这个标志绝不能与 DETACHED_PROCESS!一起使用!而这正是您想要使用的旗帜.
CREATE_NO_WINDOW- 子进程将收到一个新的控制台,但没有任何窗口.这是一个非常令人惊讶的标志,所以我将再次重申它:子进程将有一个控制台,您可以编写输出,您可以尝试读取输入等; 这个控制台与父进程的控制台不同; 这个控制台是不可见的,它没有可见的窗口,但它存在.例如,它在后台静默运行子进程很有用.请注意,与CREATE_NEW_CONSOLEor一起使用时,此标志无效DETACHED_PROCESS- 这些标志会覆盖此标志.另请注意,启动GUI应用程序时会忽略此标志:它不会收到不可见的控制台.
DETACHED_PROCESS - 子进程不会收到任何控制台.您不得与此标志一起使用 CREATE_NEW_CONSOLE.
现在更多关于正确调用CreateProcess().首先,你应该使用CreateProcessW().我特别厌倦了无法访问名为的目录中的文件的应用程序???????.
其次,即使您使用ANSI版本,CREATE_UNICODE_ENVIRONMENT如果您NULL为环境传递,也请指定flag .如果你不这样做,PATH可能最终在子进程中被破坏,这个错误非常令人讨厌.
第三,不要const_cast<char*>command.c_str().只需调用strdup()/wcsdup()它,然后free()在CreateProcess()调用返回后.或者,如果您确实坚持进行command适当修改,请将其&command[0]作为参数传递.
第四,不要忘记设置STARTUPINFO结构的大小:startupInfo.cb = sizeof(startupInfo).现代Windows(至少XP和7)实际上允许您将此字段保留为零,而不会产生任何有害后果,但依赖于此,这是一个草率的编程.
哦,当我们在这里时:你提到你使用的CreateProcess()是因为,除其他外,它允许你明确地为孩子指定环境.嗯,有一个关于lpEnvironment参数的轻微问题记录,但很容易被忽视.指定时NULL,子项继承父项的环境.当您指定非事物时NULL,父项的环境不会添加到它.如果要添加到父级环境中,则必须使用GetEnvironmentStrings()它来获取它,然后显式调整它.
| 归档时间: |
|
| 查看次数: |
7499 次 |
| 最近记录: |