Articles of createprocess

Linux的CreateProcess?

我在linux平台上开发。 我想在我的库中创build一个新的进程,而不用replace当前正在执行的图像。 因为我正在开发一个库,所以我没有一个主要function。 我希望在调用者closures之后继续新的进程(就像CreateProcess Windows API一样)。 在Linux中可能吗? 像这样的function: void Linux_CreateProcess(const char* app_name) { // Executing app_name. // ???????? what is the code ?????? // app_name is running and never close if current application close. return; } 注意: system()阻塞当前进程,这并不好。 我想继续当前的过程。 exec()系列取代当前正在执行的映像,这并不好。 如果当前进程closures,popen()将closures新进程。

创build隐藏进程(窗口不可见)

我使用的CreateProcess()启动标志设置为STARTF_USESHOWWINDOW和SW_HIDE启动一个应用程序在其窗口隐藏的背景。 我这样做是为了运行一个计划的维护任务,我不想被打扰与Windows。 在大多数情况下,窗口是隐藏的,但有些情况下,程序的窗口在你面前popup(例如谷歌的Chrome浏览器 – 我开始testing不同的应用程序,看看这是否是一次性问题,但不是)。 这种情况在Windows XP中发生得比较less,但在Vista上发生了很多。 有没有我失踪的国旗? 有没有其他的方式来创build一个窗口隐藏的过程? 谢谢! 我的示例代码是: char *ProgramName STARTUPINFO StartupInfoF; PROCESS_INFORMATION ProcessInfoF; memset(&StartupInfoF, 0, sizeof(StartupInfoF)); memset(&ProcessInfoF, 0, sizeof(ProcessInfoF)); StartupInfoF.cb = sizeof(StartupInfoF); StartupInfoF.wShowWindow = SW_HIDE; StartupInfoF.dwFlags = STARTF_USESHOWWINDOW; if (CreateProcess(ProgramName, "", 0, 0, FALSE, DETACHED_PROCESS, 0, 0, &StartupInfoF, &ProcessInfoF) == FALSE) { // error } else { // OK }

CreateProcess执行Windows命令

我正在尝试使用CreateProcess函数执行一个dos命令: LPWSTR cmd=(LPWSTR)QString("C:\\windows\\system32\\cmd.exe subst " + DLetter+" \""+mountPath+"\"").utf16(); STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); if ( CreateProcessW(0, // Application name cmd, // Application arguments NULL, NULL, TRUE, 0, NULL, L"C:\\windows\\system32", // Working directory &si, &pi) == TRUE) { … 它给出最后一个错误3 = ERROR_PATH_NOT_FOUND,当我分开应用程序path"C:\\windows\\system32\\cmd.exe"从它显示控制台,而不执行我的subst命令的命令。 任何帮助将不胜感激。

Ndk-build:CreateProcess:make(e = 87):参数不正确

在Windows平台上使用NDK构build静态库时出现错误: process_begin: CreateProcess( "PATH"\android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ar.exe, "some other commands" ) failed. make (e=87): The parameter is incorrect. make: *** [obj/local/armeabi-v7a/staticlib.a] Error 87 make: *** Waiting for unfinished jobs…. 所有源文件都可以成功构build,并且在编写目标文件时发生此错误。 在Ubuntu中构build这个项目时,我不会得到这个错误,它只发生在Windows上。 我想我发现了这个问题 : CreateProcess Win API函数的第二个参数lpCommandLine最大长度为32,768个字符。 但在我的情况下,它是超过32,768个字符。 我如何解决这个问题?

使CreateProcessinheritance调用进程的控制台

当我在Windows中调用CreateProcess时,新进程似乎不会inheritance调用进程的控制台。 我做了一个运行“ruby xtest”的testing程序,xtest是一个将“hello”写入标准输出的脚本。 我从Emacs运行这个testing程序,并没有输出。 我也尝试了下面的代码调用GetStdHandle,但是再次没有输出。 然后,我尝试将dwCreationFlags中的CREATE_NEW_CONSOLE传递给CreateProcess,它使用Ruby输出创build了一个全新的窗口。 最后,我做了一个简单的fork / exectesting程序,并使用Cygwin的GCC进行编译。 这个程序的工作:Ruby的输出显示在Emacs的预期。 我尝试破译Cygwin源代码http://cygwin.com/cgi-bin/cvsweb.cgi/src/winsup/cygwin/spawn.cc?rev=1.268&content-type=text/x-cvsweb-markup&cvsroot= src但失败。 那么,如何使新进程inheritance父进程的控制台,以便subprocess的输出按预期显示? STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.dwFlags |= STARTF_USESTDHANDLES; si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); si.hStdError = GetStdHandle(STD_ERROR_HANDLE); if(!CreateProcess(0, "ruby xtest", 0, 0, 1, 0, 0, 0, &si, &pi)) die("CreateProcess");

system()和CreateProcess()/ CreateProcessW()

我想在C程序中执行一个TEST.exe。 当我使用 system( "TEST.exe <input-file> output-file" ); 我可以得到我的预期。 但是,当我使用下面的代码时,CreateProcessW()无法正常工作(请参阅如何运行外部程序? ): if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), pwszParam, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, 0, 0, &siStartupInfo, &piProcessInfo) != false) { /* Watch the process. */ dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000)); iReturnVal = GetLastError(); } else { /* CreateProcess failed */ iReturnVal = GetLastError(); } 哪里 FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file". WaitForSingleObject()返回258,GetLastError()返回1813(“在图像文件中找不到指定的资源types”)。 […]

CreateProcess和命令行参数

背景信息: Windows 7,Visual C ++ 2010 Express 问题: CreateProcess()保持返回“无效的命令行参数” 说明:我正在编写一段使用Windows API的CreateProcess调用外部程序的代码。 到目前为止,我已经得到了一个外部程序的调用: if( !CreateProcess( "C:\\Temp\\convert.exe", t_str, // Arguments … } //where t_str is " C:\\img1.jpeg C:\\img1.pgm" (ImageMagick if you're wondering). 即使数据量很大,我也可以将所有内容都推送到Windowsstring和指针中。 所以我复制了所有的CreateProcess()调用另一个外部程序的调用: if( !CreateProcess( "C:\\Temp\\sift.exe", t_str2, // Arguments … } //where t_str2 is ` < C:\\img1.pgm > C:\\img1.key` 基本上,非常相似的东西,但所有的variables名称更改(因为我有这两个调用运行串行)。 这就是问题所在。 这不会运行,而是打印出“无效的命令行参数:<C:\ img1.pgm”。 当然,这个命令在命令提示符下工作正常,但在我的代码中没有。 我把t_str2转换成了一些不那么复杂的东西(因为我知道sift.exe是如何工作的),并得到了相同的结果。 同样的事情发生时,我只是运行筛选,而不是转换。 […]

如何创build一个不是创build过程的subprocess?

我有两个进程,A和B.在某个时间点,A创buildB.创buildB之后,如果A的进程树被杀死,我希望B仍然在。 我正在使用CreateProcess()来创buildB,而我似乎无法find任何方法来使它在没有孩子的情况下创build过程。 同样的事情与ShellExecuteEx(),但我可能会错过一些标志。 有谁知道我可以用来做什么? 编辑:我忘了提及这两个进程需要一个处理或进程ID到另一个

如何在由CreateProcess实例化的命令中使用或扩展环境variables?

以下代码利用CreateProcess运行带有环境variables的命令。 在这里,它试图运行notepad %APPDATA%\test.txt 。 如果我在notepad %APPDATA%\test.txt直接运行notepad %APPDATA%\test.txt ,%APPDATA%将被展开。 但是,由CreateProcess执行时,环境variables不能被扩展。 你能帮忙评论一下原因和解决办法吗? 任何评论将不胜感激! program TestConsole2; {$APPTYPE CONSOLE} uses Windows, SysUtils; var I: Integer; ProgramName: String; StartInfo : TStartupInfo; ProcInfo : TProcessInformation; CreateOK : Boolean; begin try FillChar(StartInfo, SizeOf(StartInfo), #0); FillChar(ProcInfo, SizeOf(ProcInfo), #0); StartInfo.cb := SizeOf(StartInfo); ProgramName := 'NOTEPAD %APPDATA%\test.txt'; CreateOK := CreateProcess( nil, PChar(ProgramName), nil, nil, True, […]