如何获得CreateProcess启动的python 子进程返回回的结果

CreateProcess启动进程(VC)
进程bbb.exe通过CreateProcess启动进程aaa.exe//指定进程aaa.exe的当前目录(库文件从该目录开始查找)CString strCurDir="C://Program Files//aaa//";//aaa.exe实际的工作目录CString strSwp
="C://Program Files//aaa//aaa.exe";PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW; si.dwFlags=STARTF_USESHOWWINDOW;
bool fRet=CreateProcess(strSwp,NULL,NULL,FALSE,NULL,NULL,NULL,strCurDir,&si,&pi);
没有更多推荐了,CreateProcess与ShellExecuteEx的选择问题(获取管理员权限)
[问题点数:50分]
本版专家分:2025
结帖率 95.83%
CSDN今日推荐
本版专家分:0
本版专家分:3222
本版专家分:4944
匿名用户不能发表回复!|
其他相关推荐[转]WinExec、ShellExecute和CreateProcess及返回值判断方式 - 子坞 - 博客园
  有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。&&
  WinExec主要运行EXE文件。  ⑴ 函数原型:&UINT&Win&Exec(LPCSTR&lpCmdLine,&UINT&uCmdShow);&  ⑵ 参数:&  lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。&  uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。&  ⑶ 返回值:&  若函数调用成功,则返回值大于31。若函数调用失败,则返回值为下列之一:&  ① 0:系统内存或资源已耗尽。&  ② ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。&  ③ ERROR_FILE_NOT_FOUND:指定的文件未找到。&  ④ ERROR_PATH_NOT_FOUND:指定的路径未找到。&  虽然Microsoft认为WinExec已过时,但是在许多时候,简单的WinExec函数仍是运行新程序的最好方式。简单地传送作为第一个参数的 命令行,还需要决定如何显示程序(该程序也许会忽视它)的第二个参数。通常,将其设置为SW_SHOW,也可尝试SW_MINIMIZED或 SW_MAXIMIZED。WinExec不允许用CreateProcess获得的所有选项,而它的确简单。&
  ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。&
1、标准用法  ShellExecute函数原型及参数含义如下:&&
HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters,
LPCTSTR lpDirectory, INT nShowCmd);
  ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。&&  ●lpOperation:用于指定要进行的操作。其中&open&操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;&print&操作表示打印由FileName参数指定的文件;&explore&操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作&open&。&&  ●lpFileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。&&  ●lpParameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。&&  ●lpDirectory:用于指定默认目录。&&  ●lpShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。&
  返回值:
#include &stdio.h&#include &stdlib.h&#include &windows.h&#include &shellapi.h&int main( void ){
HINSTANCE hNewExe = ShellExecuteA(NULL, "open", "d:\\tese.log", NULL, NULL, SW_SHOW);
if ((DWORD)hNewExe &= 32)
printf("return value:%d\n", (DWORD)hNewExe);
printf("successed!\n");
}   printf("GetLastError: %d\n", GetLastError());
system("pause");
return 1;}
  当&D:\\test.log&文件不存在是,执行结果如下:  这里若函数执行错误, GetLastError()不一定能捕获到错误代码,例如当&d:\\tese.log&文件存在,将记事本"notepad.exe"命名为其他名字时:
  另外两个函数的返回值就不列出了。
2、特殊用法
  1)如果将FileName参数设置为&http:&协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。&&  格式一:http://网站域名。&&      如:ShellExecute(handle, &open&, &http://www.neu.edu.cn&, nil, nil, SW_SHOWNORMAL);&&  格式二:http://网站域名/网页文件名。  如:ShellExecute(handle, &open&, &http://www.neu.edu.cn/default.htm&, nil, nil, SW_SHOWNORMAL);&&  2)如果将FileName参数设置为&mailto:&协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。&&  格式一:mailto:&    如:ShellExecute(handle, "open", "mailto:", nil, nil, SW_SHOWNORMAL);打开新邮件窗口。&&  格式二:mailto:用户账号@邮件服务器地址&&如:ShellExecute(handle, "open", "mailto:who@mail.neu.edu.cn", nil, nil, SW_SHOWNORMAL);  打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)如:ShellExecute(this-&m_hWnd, "open", "mailto:", "", "", SW_SHOW);  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文&&  如:ShellExecute(handle, "open", "mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test", nil, nil, SW_SHOWNORMAL);  打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。
例子(delphi):&&在一个应用程序调用c:Project1.&&  ShellExecute(handle, &open&,&c:Project1.exe&,&字串内容&,nil, SW_SHOWNORMAL);&&在Project1.exe里可以调用:&&
procedure TForm1.FormCreate(Sender: TObject);
for i:=1 to paramcount do
if ParamStr(i)〈〉&& then showmessage(ParamStr(i));
最后的那个参数,为窗口指定可视性方面的一个命令。&请用下述任何一个常数&&SW_HIDE 隐藏窗口,活动状态给令一个窗口&&SW_MINIMIZE 最小化窗口,活动状态给令一个窗口&&SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态&&SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态&&SW_SHOWMAXIMIZED 最大化窗口,并将其激活&&SW_SHOWMINIMIZED 最小化窗口,并将其激活&&SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口&&SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口&&SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口&&SW_SHOWNORMAL 与SW_RESTORE相同
  3、深入浅出ShellExecute& 译者:徐景周(原作:Nishant&&&&&& S)& & & Q: &如何打开一个应用程序? 正如您所看到的,我并没有传递程序的完整路径。  ShellExecute(this-&m_hWnd, "open", "calc.exe", "", "", SW_SHOW);&&&&& 或ShellExecute(this-&m_hWnd, "open", "notepad.exe", "c:\\MyLog.log", "", SW_SHOW);&&&& & & Q: &如何打开一个同系统程序相关连的文档?&&&&&& ShellExecute(this-&m_hWnd, "open",&"c:\\abc.txt", "", "", SW_SHOW);&&&&&&&& Q: &如何打开一个网页? & & & ShellExecute(this-&m_hWnd, "open",&"http://www.google.com", "", "", SW_SHOW);&&&&&&&& Q: &如何激活相关程序,发送EMAIL? & & & ShellExecute(this-&m_hWnd,"open",&"mailto:","","",&&&&&& SW_SHOW&&&&&& );&&&&&&&& Q: &如何用系统打印机打印文档? & & & ShellExecute(this-&m_hWnd, "print",&"c:\\abc.txt", "", "", SW_HIDE);&&&&&&&& Q: &如何用系统查找功能来查找指定文件? & & & ShellExecute(m_hWnd, "find", "d:\\nish", NULL, NULL, SW_SHOW);&&&&&&&& Q: &如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO
ShExecInfo
ShExecInfo.cbSize
sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask
SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd
ShExecInfo.lpVerb
ShExecInfo.lpFile
"c:\\MyProgram.exe";
ShExecInfo.lpParameters
ShExecInfo.lpDirectory
ShExecInfo.nShow
ShExecInfo.hInstApp
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
PROCESS_INFORMATION
STARTUPINFO
ZeroMemory(&StartupInfo,
sizeof(StartupInfo));
StartupInfo.cb
sizeof(StartupInfo);
compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo))
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
MessageBox("The
started...");
  Q: 如何显示文件或文件夹的属性?
SHELLEXECUTEINFO
ShExecInfo
ShExecInfo.cbSize
sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask
SEE_MASK_INVOKEIDLIST;
ShExecInfo.hwnd =
ShExecInfo.lpVerb
"properties";
ShExecInfo.lpFile
ShExecInfo.lpParameters
ShExecInfo.lpDirectory
ShExecInfo.nShow
ShExecInfo.hInstApp
ShellExecuteEx(&ShExecInfo);
使用CreateProcess命令&  ⑴ 函数原型:&
BOOL CreateProcess(  LPCTSTR lpApplicationName,  LPTSTR lpCommandLine,  LPSECURITY_ATTRIBUTES lpProcessAttributes,
 LPSECURITY_ATTRIBUTES lpThreadAttributes,
 BOOL bInheritHandles,
 DWORD dwCreationFlags,  LPVOID lpEnvironment,
 LPCTSTR lpCurrentDirectory,
 LPSTARTUPINFO lpStartupInfo,
 LPPROCESS_INFORMATION lpProcessInformation
  ⑵ 参数:&  lpApplicationName:指向一个以空结尾的串,他指定了要执行的模块&  lpCommandLine:指向一个以空结尾的串,该串定义了要执行的命令行。&  lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。&  lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。&&  bInheritHandles,:表明新进程是否从调用进程继承句柄。&  dwCreationFlags:定义控制优先类和进程创建的附加标志。&  lpEnvironment:指向一个新进程的环境块。&  lpCurrentDirectory:指向一个以空结尾的串,该串定义了子进程的当前驱动器和当前目录。&  lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程的主窗口将如何显示。&  lpProcessInformation:指向PROCESS_INFORMATION结构,该结构接受关于新进程的表示信息。&  ⑶ 返回值:&  若函数调用成功,则返回值不为0;若函数调用失败,返回值为0。&
  在上述参数中,参数lpStartupInfo是STARTUPINFO结构。可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入 和输出。新程序通常可以忽略多数这些数据项,如果选择那样做的话。可以规定该结构体中的标志,已表明要设置的数据段。有时,不想设置任何信息,也必须传递 一个有效的指针给空结构(确定设置大小到cb,及设置dwFlags成员为0)。参数lpProcessInformation返回进程和线程句柄,还包 括进程和线程ID。这些句柄拥有在参数lpProcessAttributes和lpThreadAttributes中规定的访问。&  要注意,针对CreateProcess的一些参数对控制台应用程序是特定的,而其它参数则对各种应用程序有用。大多数情况下,并不一定要填入 STARTUPINFO结构,但无论如何必须提供它。其返回值是布尔型的,而真正感兴趣的返回值发生于作为参数传送的结构中 (PROCESS_INFORMATION)。CreateProcess返回该结构中的进程ID及其句柄,以及初始线程ID及其句柄。可以将ID发送到 其它进程,或使用句柄来控制新进程。&
  ShellExecute和WinExec命令用于简单的作业。如果要完全控制一个新进程,就必须调用CreateProcess。&【参考资料 感谢作者】1、&2、【转】VC中如何启动其它程序,并且获得启动程序的PID 创建进程CreateProcess函数
【转】VC中如何启动其它程序,并且获得启动程序的PID 创建进程CreateProcess函数
这样就可以执行c:\test.exe
如果你要的PID是进程ID那么这个
piProcInfoGPS.dwProcessId就是PID。
当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1。
  该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然后,系统为新进程创建一个虚拟地址
空间,并将可执行文件或任何必要的D L L文件的代码和数据加载到该进程的地址空间中。
  然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。与进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结构。通过执行C / C + +运行期启动代码,该主
线程便开始运行,它最终调用WinMain、wWinMain、main或wmain函数。如果系统成功地创建了新进程和主线程,CreateProcess便返回TRUE。
  pszApplicationName和pszCommandLine参数分别用于设定新进程将要使用的可执行文件的名字和传递给新进程的命令行字符串
  pszCommandLine参数的原型是PTSTR。这意味着CreateProcess期望你将传递一个非常量字符串的地址。从内部来讲,CreateProcess实际上并不修改你传递给它的命令行字符串。不过,在
CreateProcess返回之前,它将该字符串恢复为它的原始形式。
  如果命令行字符串不包含在文件映象的只读部分中,就会出现违规访问的问题。解决这个问题的最好办法是在调用CreateProcess之前像下面这样将常量字符串拷贝到临时缓存中。当CreateProcess分
析pszCommandLine字符串时,它将查看字符串中的第一个标记,并假设该标记是想运行的可执行文件的名字。如果可执行文件的文件名没有扩展名,便假设它的扩展名为.exe。CreateProcess也按下面
的顺序搜索该可执行文件:
  1) 包含调用进程的. e x e文件的目录。
  2) 调用进程的当前目录。
  3) Wi n d o w s的系统目录。
  4) Wi n d o w s目录。
  5) PAT H环境变量中列出的目录。
  如果文件名包含全路径,系统将使用全路径来查看可执行文件,并且不再搜索这些
  目录。如果系统找到了可执行文件,那么它就创建一个新进程,并将可执行文件的代码和数据
  映射到新进程的地址空间中。然后系统将调用C / C + +运行期启动例程。
  这一切都是在pszApplicationName参数是NULL(99%以上的时候都应该属于这种情况)时
  发生的。如果不传递NULL,可以将地址传递给pszApplicationName参数中包含想运行的可执行
  文件的名字的字符串。请注意,必须设定文件的扩展名,系统将不会自动假设文件名有一
  个.exe扩展名。CreateProcess假设该文件位于当前目录中,除非文件名前面有一个路径。如果在当前目录中找不到该文件,CreateProcess将不会在任何其他目录中查找该文件,它运行失败了。
  可以使用psaProcess和psaThread参数分别设定进程对象和线程对象需要的安全性。,在这种情况下,系统为这些对象赋予默认安全性描述符。也可以指定两
  个SECURITY_ATTRIBUTES结构,并对它们进行初始化,以便创建自己的安全性权限,并将它们赋予进程对象和线程对象。
  将SECURITY_ATTRIBUTES结构用于psaProcess和psaThread参数的另一个原因是,父进
  程将来生成的任何子进程都可以继承这两个对象句柄中的任何一个。
  fdwCreate参数用于标识标志,以便用于规定如何来创建新进程。
  pvEnvironment参数用于指向包含新进程将要使用的环境字符串的内存块。,使子进程能够继承它的父进程正在使用的一组环境字符串。也可以
  使用GetEnvironmentStrings函数。
  该函数用于获得调用进程正在使用的环境字符串数据块的地址。可以使用该函数返回的地
  址,作为CreateProcess的pvEnvironment参数。如果为pvEnvironment参数传递NULL,那么这正
  是CreateProcess函数所做的操作。当不再需要该内存块时,应该调用FreeEnvironmentString s函数将内存块释放。
  pszCurDir参数允许父进程设置子进程的当前驱动器和目录。如果本参数是NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么pszCurDi r
  必须指向包含需要的工作驱动器和工作目录的以0结尾的字符串。注意,必须设定路径中的驱
  动器名。
  psiStartInfo参数用于指向一个STARTUPINFO结构。
  当Windows创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应
  用程序仅仅使用默认值。  如果未能将该结构的内容初始化为零,那么该结构的成员将包含调用线程的堆栈上的任何
  无用信息。将该无用信息传递给CreateProcess,将意味着有时会创建新进程,有时则不能创建
  新进程,完全取决于该无用信息。有一点很重要,那就是将该结构的未用成员设置为零,这样,
  CreateProcess就能连贯一致地运行。不这样做是开发人员最常见的错误。
    ppiProcInfo参数用于指向你必须指定的PROCESS_INFORMATION结构。CreateProcess在
  返回之前要对该结构的成员进行初始化。
  在创建进程的时候,系统为每个对象赋予一个初始使用计数值1。然后,在createProcess返回之前,该函数打开进程对象和线程对象,并将每个对象的与进程相关的句柄放入PROCESS_IN
FORMATION结构的hProcess和hThread成员中。当CreateProcess在内部打开这些对象时,每个对象的使用计数就变为2。
  在系统能够释放进程对象前,该进程必须终止运行(将使用计数递减为1),并且
  父进程必须调用CloseHandle(再将使用计数递减1,使之变为0)。同样,若要释放线程对象,
  该线程必须终止运行,父进程必须关闭线程对象的句柄。
  当进程内核对象创建后,系统赋予该对象一个独一无二的标识号,系统中的其他任何进程
  内核对象都不能使用这个相同的I D号。线程内核对象的情况也一样。当一个线程内核对象创建
  时,该对象被赋予一个独一无二的、系统范围的I D号。进程I D和线程I D共享相同的号码池。
  这意味着进程和线程不可能拥有相同的I D 。另外,对象决不会被赋予0 作为其I D。在
  CreateProcess返回之前,它要用这些ID填入PROCESS_INFORMATION结构的dwProcessId和dwThre adId成员中。
  应用程序使用I D来跟踪进程和线程,必须懂得系统会立即复用进程I D和线程I D
  系统无法记住每个进程的父进程的I D,但是,由于I D是被立即重复使用的,因此,等到获
  得父进程的I D时,该I D可能标识了系统中一个完全不同的进程。父进程可能已经终止运行。如果应用程序想要与它的“创建者”进行通信,最好不要使用I D。应该定义一个持久性更
  好的机制,比如内核对象和窗口句柄等。
  若要确保进程I D或线程I D不被重复使用,唯一的方法是保证进程或线程的内核对象不会
  被撤消。
没有更多推荐了,如何使用CreateProcess建立IE进程,并使打开指定链接
[问题点数:50分,结帖人stoneg]
本版专家分:262
结帖率 100%
CSDN今日推荐
本版专家分:155459
2002年 总版技术专家分年内排行榜第二
2001年 总版技术专家分年内排行榜第七
2002年1月 总版技术专家分月排行榜第一
2002年4月 总版技术专家分月排行榜第二
本版专家分:155459
2002年 总版技术专家分年内排行榜第二
2001年 总版技术专家分年内排行榜第七
2002年1月 总版技术专家分月排行榜第一
2002年4月 总版技术专家分月排行榜第二
本版专家分:262
本版专家分:7427
2001年12月 VC/MFC大版内专家分月排行榜第二
本版专家分:262
匿名用户不能发表回复!|
其他相关推荐

我要回帖

更多关于 进程返回0 的文章

 

随机推荐