易语言api CreateProcess 创建进程

171 篇文章 26 订阅
143 篇文章 13 订阅

封装进程创建的原因主要是易语言自带的运行和执行命令不能启动游戏,当我们写一键启动,批量启动游戏时,便用到了进程_创建的命令。

用到的API CreateProcess

WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件,我们先学习它的函数原型,参数和返回值。

函数原型

BOOL CreateProcess
(
LPCTSTR lpApplicationName,//程序路径可以是相对也可以是绝对路径
LPTSTR lpCommandLine,//启动参数可空
LPSECURITY_ATTRIBUTES lpProcessAttributes。//为空句柄不被继承
LPSECURITY_ATTRIBUTES lpThreadAttributes,// 参数为空,新进程使用默认的安全描述符
BOOL bInheritHandles,// TRUE表示允许当前进程中的所有句柄都由新建的子进程继承
DWORD dwCreationFlags,// 指定附加的、用来控制优先类和进程的创建的标志。
LPVOID lpEnvironment,// 指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
LPCTSTR lpCurrentDirectory,// 这个字符串必须是一个包含驱动器名的绝对路径。
LPSTARTUPINFO lpStartupInfo,// 指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
LPPROCESS_INFORMATIONlpProcessInformation//指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
);

511遇见易语言模块API教程

参数:

lpApplicationName

指向一个NULL结尾的、用来指定可执行模块的字符串。

这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。

这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数最前面并由空格符与后面的字符分开。

lpCommandLine

指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。

这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。

如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。

lpProcessAttributes

指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。

在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。

lpThreadAttributes

同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.

bInheritHandles

指示新进程是否从调用进程处继承了句柄。

如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。

dwCreationFlags

指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。

⑴值:CREATE_DEFAULT_ERROR_MODE

含义:新的进程不继承调用进程的错误模式。CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式。

这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。

对于CreateProcess函数,默认的行为是为新进程继承调用者的错误模式。设置这个标志以改变默认的处理方式。

⑵值:CREATE_NEW_CONSOLE

含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。

⑶值:CREATE_NEW_PROCESS_GROUP

含义:新进程将是一个进程树的根进程。进程树中的全部进程都是根进程的子进程。新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程。

⑷值:CREATE_SEPARATE_WOW_VDM

如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。

⑸值:CREATE_SHARED_WOW_VDM

如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程。

⑹值:CREATE_SUSPENDED

含义:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。

⑺值:CREATE_UNICODE_ENVIRONMENT

含义:如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。

⑻值:DEBUG_PROCESS

含义:如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程。系统把被调试程序发生的所有调试事件通知给调试器。

如果你使用这个标志创建进程,只有调用进程(调用CreateProcess函数的进程)可以调用WaitForDebugEvent函数。

⑼值:DEBUG_ONLY_THIS_PROCESS

含义:如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。如果调用进程没有被调试,有关调试的行为就不会产生。

⑽值:DETACHED_PROCESS

含义:对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。

〔11〕值:CREATE_NO_WINDOW

含义:系统不为新进程创建CUI窗口,使用该标志可以创建不含窗口的CUI程序。

dwCreationFlags参数

还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级。如果下面的优先级类标志都没有被指定,那么默认的优先类是NORMAL_PRIORITY_CLASS,除非被创建的进程是IDLE_PRIORITY_CLASS。在这种情况下子进程的默认优先类是IDLE_PRIORITY_CLASS

可以选择下面的标志中的一个:

优先级:HIGH_PRIORITY_CLASS

含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的CPU关联应用程序可以占用几乎全部的CPU可用时间。

优先级:IDLE_PRIORITY_CLASS

含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护程序。空闲优先级会被子进程继承。

优先级:NORMAL_PRIORITY_CLASS

含义:指示这个进程没有特殊的任务调度要求。

优先级:REALTIME_PRIORITY_CLASS

含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。

lpEnvironment

指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。

一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。每个字符串都是name=value的形式。

因为相等标志被当做分隔符,所以它不能被环境变量当做变量名。

与其使用应用程序提供的环境块,不如直接把这个参数设为空,系统驱动器上的当前目录信息不会被自动传递给新创建的进程。对于这个情况的探讨和如何处理,请参见注释一节。

环境块可以包含Unicode或ANSI字符。如果lpEnvironment指向的环境块包含Unicode字符,那么dwCreationFlags字段的CREATE_UNICODE_ENⅥRONMENT标志将被设置。如果块包含ANSI字符,该标志将被清空。

请注意一个ANSI环境块是由两个零字节结束的:一个是字符串的结尾,另一个用来结束这个快。一个Unicode环境块是由四个零字节结束的:两个代表字符串结束,另两个用来结束块。

lpCurrentDirectory

指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。

lpStartupInfo

指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体

lpProcessInformation

指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

返回值:

如果函数执行成功,返回非零值。

如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。

自定义数据类型

自定义数据类型:
1、STARTUPINFO(进程信息)

.版本 2

.数据类型 STARTUPINFO, 公开, 进程启动信息(进程_创建)
.成员 cb, 整数型
.成员 lpReserved, 整数型
.成员 lpDesktop, 整数型
.成员 lpTitle, 整数型
.成员 dwX, 整数型
.成员 dwY, 整数型
.成员 dwXSize, 整数型
.成员 dwYSize, 整数型
.成员 dwXCountChars, 整数型
.成员 dwYCountChars, 整数型
.成员 dwFillAttribute, 整数型
.成员 dwFlags, 整数型
.成员 wShowWindow, 长整数型
.成员 cbReserved2, 长整数型
.成员 lpReserved2, 整数型
.成员 hStdInput, 整数型
.成员 hStdOutput, 整数型
.成员 hStdError, 整数型

2、PROCESS_INFORMATION(进程标识)

.版本 2

.数据类型 PROCESS_INFORMATION, 公开, 进程标识(进程_创建)
.成员 hProcess, 整数型, , , 进程句柄
.成员 hThread, 整数型, , , 线程句柄
.成员 dwProcessId, 整数型, , , 进程标识符
.成员 dwThreadId, 整数型, , , 线程标识符

进程_创建命令源码

.版本 2

.子程序 进程_创建, 整数型, 公开, 返回非 0 表示成功,0表示失败
.参数 程序路径, 文本型, , 程序的路径
.参数 启动参数, 文本型, 可空
.局部变量 目录, 文本型
.局部变量 传参, STARTUPINFO
.局部变量 a, PROCESS_INFORMATION

目录 = 取文本左边 (程序路径, 倒找文本 (程序路径, “\”, , 假))
返回 (CreateProcess (程序路径, 启动参数, 0, 0, 4, 0, 0, 目录, 传参, a))

易语言模块API教程进程创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

511遇见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值