易语言api CreateProcess 创建进程_易语言创建进程-程序员宅基地

技术标签: CreateProcess  大漠  易语言API  易语言  创建进程  多线程  511遇见  

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

用到的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教程进程创建

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zcp528/article/details/106538727

智能推荐

安卓GLSurfaceView使用简单范例_简书 android glsurfaceview例子-程序员宅基地

文章浏览阅读584次。在AndroidManifest.xml要设置: <uses-feature android:glEsVersion="0x00020000" android:required="true" />代码:package net.quantum6.camerafps;import java.nio.ByteBuffer;import java.nio.By..._简书 android glsurfaceview例子

【Spark学习笔记】- 初始 Apache Spark_spark windowspec 朗格朗日-程序员宅基地

文章浏览阅读980次。首先Spark摒弃了MapReduce中的线map在reduce这样严格的方式,spark 可以执行更通用的有向无环图算子,这就意味着,在MapReduce 中需要将中间结果写入分布式文件系统时,Spark能将中间结果直接传入流水作业线的下一步。再次,Spark扩展了前辈们的内存计算能力。作为一个通用的计算引擎,它的核心API为数据转换提供了强大的基础,它独立于统计学、机器学习活矩阵代数的任何功能,它的SCALA和python API 让我们可以用表达力极强的通用编程语言编写程序,还可以访问已有的库。_spark windowspec 朗格朗日

HttpClient上传文件中文乱码(MultipartFile fileName中文乱码乱码)_httpclient mulitpartfile 中文乱码-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏3次。需要设置http为兼容模式,否则会使用mime默认的编码(US-ASCII)设置方式:MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.setCharset(Charset.forName("UTF-8"));builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式,否则后台接口接收到的文件名中文乱码?????.xlsx._httpclient mulitpartfile 中文乱码

第一章 数据结构入门_1.8学好数据结构的重要性_学好某一章节的重要性-程序员宅基地

文章浏览阅读1k次。通过前面的学习我们知道,数据结构并不是一门具体的编程语言,它教会我们的是一种思维方式,即如何以更优的方式存储数据。或者正是由于这个原因,很多读者感觉数据结构虚无缥缈,无法触及,不如学习 Python、Java 等这些编程语言可以随学随用、掷地有声,久而久之觉得学习数据结构没用。那么,数据结构真的无用吗?当然不是。作为计算机专业最重要的必修学科之一,计算机专业考研的必考知识,以及众多 IT 公司笔、面试的侧重考点,仅仅这些光环,就足以说明学习数据结构的重要性。毋庸置疑,数据结构不仅有用,更应该是每个程序员_学好某一章节的重要性

Android EditText设置为单行_android edittext single-程序员宅基地

文章浏览阅读1.9w次,点赞4次,收藏2次。在EditText设置单行,由于android:single属性显示过时,提示用使用android:maxLines=”1”代替,但是设置之后没有任何效果。这是由于android:inputType属性默认值为none的缘故.只要将android:inputType属性设置为其他就可以了,TextView应该也是一样吧_android edittext single

python连接到SQList数据库以及简单操作_为什么在python中不能直接使用sqlist-程序员宅基地

文章浏览阅读1.8k次。python连接到SQList数据库以及简单操作背景了解: Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。Python定义了一套操作数据库的API接口,任何数据库要连接到Python, 只需要提供符合Python标准的数据库驱动即可 1:代码# coding=utf-8"""@author: jiajiknag程序功能:连接-创_为什么在python中不能直接使用sqlist

随便推点

python连接impala_详解python连接impala的实例-程序员宅基地

文章浏览阅读478次。相关环境如下:Python3.4Win7 64位参照官网中的安装步骤执行:1、pip install six2、pip install bit_array3、pip install thriftpy## thrift (on Python 2.x) or thriftpy (on Python 3.x)4、pip install sasl-0.2.1-cp34-cp34m-win_amd64.wh..._pyimpala

2021-12-29 工作记录--Vue-vue背景图片的写法_vue背景图片怎么写-程序员宅基地

文章浏览阅读1.2k次。vue背景图片的写法_vue背景图片怎么写

draw9patch.bat打不开的解决办法(这个绝对能解决)-程序员宅基地

文章浏览阅读3k次。 昨天遇到这个问题,在网上百度了好久,也试了很多办法,都没有成功,浪费了很多时间顿时感觉真坑,索性不百度了,自己找办法解决。找到了两个办法: 方法一:使用SDK开发工具: 1.打开eclipse,图片在资源目录res下,选择图片右击“open with”----&gt;“other”如下图: ..._draw9patch.bat打不开

Android存储(二):openFileInput和openFileOutput私有目录下文件-程序员宅基地

文章浏览阅读2.1k次。openFileInput和openFileOutput用于处理应用程序私有目录下的指定私有文件的读取或写入数据在Android中,可以通过Context.openFileInput和Context.openFileOutput来分别获取FileInputStream和FileOutputStream。openFileInput(String fileName); 打开应用程序私有目录下的..._openfileinput

CMD命令(转自百度百科)_cmd 第一个参数-程序员宅基地

文章浏览阅读853次。CMD命令  net use ipipc$ " " /user:" " 建立IPC空链接  net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接  net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:  net use h: ipc$ 登陆后映射对方C:到本地为H:  net use ipipc$_cmd 第一个参数

GitHub开源推荐 | 一个轻量级Qt UI库_qskinny-程序员宅基地

文章浏览阅读1.9w次,点赞9次,收藏69次。分享一个轻量级 Qt UI 库 - Skinny,可以在 C++/QML 中使用。_qskinny

推荐文章

热门文章

相关标签