Windows下创建进程-CreateProcess()
来源:互联网 发布:淘宝店铺会员怎么取消 编辑:程序博客网 时间:2024/06/08 11:58
函数说明:
CreateProcess是Windows下用于创建进程的API函数,用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
函数原型:
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
);
参数定义:
指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
大多数应用程序都希望生成的应用程序只是使用默认值,最起码要全部初始化为0,再把cb成员设为此结构体的大小,如果没有清0,则新进程可能创建失败.
STARTUPINFO 结构的成员
成员窗口,控制台还是两者兼有作用cb两者兼有包含S TA RT U P I N F O 结构中的字节数。如果M i c r o s o f t 将来扩展该结构,它可用作版本控制手段。应用程序必须将c b 初始化为s i z e o f ( S TA RT U P I N F O )lpReserved两者兼有保留。必须初始化为N U L LlpDesktop两者兼有用于标识启动应用程序所在的桌面的名字。如果该桌面存在,新进程便与指定的桌面相关联。如果桌面不存在,便创建一个带有默认属性的桌面,并使用为新进程指定的名字。如果l p D e s k t o p 是N U L L (这是最常见的情况),那么该进程将与当前桌面相关联lpTitle控制台用于设定控制台窗口的名称。如果l p Ti t l e 是N U L L ,则可执行文件的名字将用作窗口名dwXdwY两者兼有用于设定应用程序窗口在屏幕上应该放置的位置的x 和y 坐标(以像素为单位)。只有当子进程用C W _ U S E D E FA U LT 作为C r e a t e Wi n d o w 的x 参数来创建它的第一个重叠窗口时,才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角dwXSize两者兼有用于设定应用程序窗口的宽度和长度(以像素为单位)只有dwYsize 当子进程将C W _ U S E D E FA U LT 用作C r e a t e Wi n d o w 的n Wi d t h参数来创建它的第一个重叠窗口时,才使用这些值。若是创建控制台窗口的应用程序,这些成员将用于指明控制台窗口的宽度dwXCountChars
dwYCountChars控制台用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)dwFillAttribute控制台用于设定子应用程序的控制台窗口使用的文本和背景颜色dwFlags两者兼有请参见下一段和表4 - 7 的说明wShowWindow窗口用于设定如果子应用程序初次调用的S h o w Wi n d o w 将S W _ S H O W D E FA U LT 作为n C m d S h o w 参数传递时,该应用程序的第一个重叠窗口应该如何出现。本成员可以是通常用于Show Wi n d o w 函数的任何一个S W _ *标识符cbReserved2两者兼有保留。必须被初始化为0lpReserved2两者兼有保留。必须被初始化为N U L LhStdInput
hStdOutput
hStdError控制台用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,h S t d I n p u t 用于标识键盘缓存,h S t d O u t p u t 和h S t d E r r o r用于标识控制台窗口的缓存
dwFlags包含一组标志,大多数标志都只是告诉CreateProcess函数,STARTUPINFO 中其他成员是否包含有用的信息,或者是否应该忽略一些成员
使用标志及含义
标志含义STARTF_USESIZE使用d w X S i z e 和d w Y S i z e 成员STARTF_USESHOWWINDOW使用w S h o w Wi n d o w 成员STARTF_USEPOSITION使用d w X 和d w Y 成员STARTF_USECOUNTCHARS使用d w X C o u n t C h a r s 和dwYCount Chars 成员STARTF_USEFILLATTRIBUTE使用d w F i l l A t t r i b u t e 成员STARTF_USESTDHANDLES使用h S t d I n p u t 、h S t d O u t p u t 和h S t d E r r o r 成员STARTF_RUN_FULLSCREEN强制在x 8 6 计算机上运行的控制台应用程序以全屏幕方式启动运行
另外还有两个标志即STARTF_ORCEONFEEDBACK和STARTFFORCEOFFFEEDBACK,当启动一个新进程时,它们可以用来控制鼠标的光标,由于windows支持真正的多任务抢占式运行方式,因此可以启动一个应用程序,然后在进程初始化时使用另一个程序,为了向用户提供视觉反馈,CreateProcess临时会把系统的光标改成一个新的光标,但
如果指定了STARTF_ORCEONFEEDBACK,CreateProcess就不会改变光标
如果指定了STARTFFORCEOFFFEEDBACK,CreateProcess会改变成新的光标,在2秒之后,如果新进程没有执行任何GUI调用,光标还原,如果执行了GUI调用,则在5秒内必须显示窗口,否则光标同样还原,
PROCESS_INFORMATION结构体:
- typedef struct _PROCESS_INFORMATION {
- HANDLE hProcess;
- HANDLE hThread;
- DWORD dwProcessId;
- DWORD dwThreadId;
- } PROCESS_INFORMATION
运行实例:
注意:lpCommandLine是LPTSTR而不是LPCTSTR,所以这个参数不能是字符串常量,必须是可写的字符串数组。
如果要执行c:\\program files\\internet explorer\\iexplore.exe并传入命令行"http://community.csdn.net/"(用IE打开http://community.csdn.net网址),一般有两种方法。
方法1:
#include "stdafx.h"#include <windows.h>#include <stdio.h>void RunExe(){STARTUPINFO stStartUpInfo;::memset(&stStartUpInfo, 0 ,sizeof(stStartUpInfo));stStartUpInfo.cb = sizeof(stStartUpInfo);PROCESS_INFORMATION stProcessInfo;::memset(&stProcessInfo, 0 ,sizeof(stProcessInfo));TCHAR szPath[] = _T("c:\\program files\\internet explorer\\iexplore.exe");TCHAR szCmd[] = _T(" http://community.csdn.net/"); //lpCommandLine的内容中开头需要一个空格,不然就和lpApplicationName连在一起去了try{bool bRet = ::CreateProcess(szPath,szCmd,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&stStartUpInfo,&stProcessInfo);if (bRet){//等待3s后关闭进程WaitForSingleObject(stProcessInfo.hProcess,3000L);::CloseHandle(stProcessInfo.hProcess);::CloseHandle(stProcessInfo.hThread);stProcessInfo.hProcess = NULL;stProcessInfo.hThread = NULL;stProcessInfo.dwProcessId = 0;stProcessInfo.dwThreadId = 0;}else{//如果创建进程失败,查看错误码DWORD dwErrCode = GetLastError();printf_s("ErrCode : %d\n",dwErrCode);}}catch( ... ){}}int main(int argc, char* argv[]) { RunExe();system("pause");return 0; }
#include "stdafx.h"#include <windows.h>#include <stdio.h>void RunExe(){STARTUPINFO stStartUpInfo;::memset(&stStartUpInfo, 0 ,sizeof(stStartUpInfo));stStartUpInfo.cb = sizeof(stStartUpInfo);PROCESS_INFORMATION stProcessInfo;::memset(&stProcessInfo, 0 ,sizeof(stProcessInfo));TCHAR szCmd[] = _T("\"c:\\program files\\internet explorer\\iexplore.exe\" http://community.csdn.net/");try{bool bRet = ::CreateProcess(NULL,szCmd,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&stStartUpInfo,&stProcessInfo);if (bRet){//等待3s后关闭进程WaitForSingleObject(stProcessInfo.hProcess,3000L);::CloseHandle(stProcessInfo.hProcess);::CloseHandle(stProcessInfo.hThread);stProcessInfo.hProcess = NULL;stProcessInfo.hThread = NULL;stProcessInfo.dwProcessId = 0;stProcessInfo.dwThreadId = 0;}else{//如果创建进程失败,查看错误码DWORD dwErrCode = GetLastError();printf_s("ErrCode : %d\n",dwErrCode);}}catch( ... ){}}int main(int argc, char* argv[]) { RunExe();system("pause");return 0; }
- Windows下创建进程-CreateProcess()
- Windows创建进程winAPI-CreateProcess
- Windows下的进程创建API--CreateProcess使用经验漫谈
- windows下创建进程,CreateProcess()详解及用法
- 创建进程CreateProcess函数----windows 核心编程
- Windows CreateProcess fail 创建进程失败。
- windows核心编程-CreateProcess创建进程
- 关于进程创建,CreateProcess
- CreateProcess创建进程
- CreateProcess创建进程
- windows 下在一个进程中使用createprocess创建一个窗口进程,并获取这个窗口的HWND句柄
- 创建进程CreateProcess函数---------《windows核心编程》读书笔记(3)
- CreateProcess创建新的进程
- CreateProcess创建的子进程
- 创建进程API CreateProcess Demo
- CreateProcess创建一个隐藏进程
- 创建进程-CreateProcess (一)
- 创建进程-CreateProcess (二)
- C语言知识
- 关于W5500的一些理解
- QT 自定义IP输入框(自己重写一部分,增加一部分功能)
- LNMP架构(六)php-fpm pool
- Cmake使用教程
- Windows下创建进程-CreateProcess()
- Java之public、protected、private区别
- 板子映射到服务器
- Andriod布局
- 【Scikit-Learn 中文文档】半监督学习
- leetcode 239. Sliding Window Maximum
- 一个PHP文件搞定支付宝系列之当面付(扫码支付)
- Java反射机制与工厂模式
- 使用注解@StringDef替代枚举-以切换环境为例