VC创建进程CreateProcess的方法

VC创建进程CreateProcess的方法需要以下几步:

1. 引用头文件和命名空间

在使用CreateProcess方法前需要在工程中引入Windows.h头文件,并在代码中调用Windows命名空间。

#include <Windows.h>
using namespace std;

2. 定义参数和启动信息

我们需要定义以下几个参数:

  • lpApplicationName:要启动的应用程序名称或者NULL,如果指定了路径,还可以带参数
  • lpCommandLine:命令行参数,如果存在需要传入应用程序的命令行参数
  • lpProcessAttributes:进程的安全属性,通常为NULL
  • lpThreadAttributes:线程的安全属性,通常为NULL
  • lpStartupInfo:启动信息,包括控制台窗口的大小、标题、窗口位置、显示模式等等
  • lpProcessInformation:过程的信息,包括进程的句柄、进程的ID和主线程的句柄

代码示例:

STARTUPINFO si; 
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi)); 

3. 启动进程

使用CreateProcess函数创建新的进程,此函数将启动新的进程,并将其连接到指定的进程和主线程。

代码示例:

BOOL bResult = CreateProcess(lpApplicationName,
                            lpCommandLine,
                            lpProcessAttributes,
                            lpThreadAttributes,
                            FALSE,
                            dwCreationFlags,
                            lpEnvironment,
                            lpCurrentDirectory,
                            &si,
                            &pi);

可以看到,在函数调用时,需要传入多个参数,下面将对其中的参数进行详细解释。

  • lpApplicationName

指定要启动的应用程序名称或路径,或设置为NULL。

  • lpCommandLine

命令行参数,如果存在需要传入应用程序的命令行参数。例如: "C:\Windows\system32\cmd.exe /c dir /s"

  • lpProcessAttributes

决定了诸如进程的安全性、进程对象上的访问权限以及进程对象的名字的属性。

  • lpThreadAttributes

决定了线程的安全性、线程对象上的访问权限以及线程对象的名字的属性。

  • lpEnvironment

指向环境变量块的指针,如果设置为NULL,则使用当前进程环境块。

  • lpCurrentDirectory

指定启动目录,如果设置为NULL,则使用当前进程的目录。

  • dwCreationFlags

指定进程的创建标志,例如 CREATE_NEW_CONSOLE 创建新的控制台窗口。

如果函数调用成功,返回值为非零,反之返回值为0,我们可以通过GetLastError函数来获取错误信息。

示例1

如果我们要启动一个exe程序并传入参数,则可以这样写代码:

LPCTSTR lpApplicationName = NULL;
LPTSTR lpCommandLine = _tcsdup(TEXT("test.exe param1 param2"));
LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL;
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
BOOL bInheritHandles = FALSE;
DWORD dwCreationFlags = 0;
LPVOID lpEnvironment = NULL;
LPCTSTR lpCurrentDirectory = NULL;
LPSTARTUPINFO lpStartupInfo = new STARTUPINFO();
LPPROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION();
ZeroMemory(lpStartupInfo, sizeof(STARTUPINFO));
lpStartupInfo->cb = sizeof(lpStartupInfo);

BOOL bResult = CreateProcess(lpApplicationName,
                             lpCommandLine,
                             lpProcessAttributes,
                             lpThreadAttributes,
                             bInheritHandles,
                             dwCreationFlags,
                             lpEnvironment,
                             lpCurrentDirectory,
                             lpStartupInfo,
                             lpProcessInformation);
if (!bResult) {
    printf("Error: %d\n", GetLastError());
}
else {
    printf("Process started. Process id:%d thread id:%d\n",
           lpProcessInformation->dwProcessId,
           lpProcessInformation->dwThreadId);
}

delete lpStartupInfo;
delete lpProcessInformation;
free(lpCommandLine);

示例2

如果我们要启动一个控制台程序,并且需要在新的控制台窗口中输出信息,则可以这样写代码:

LPCTSTR lpApplicationName = _T("cmd.exe");
LPTSTR lpCommandLine = _tcsdup(TEXT("/C echo hello world"));
LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL;
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
BOOL bInheritHandles = FALSE;
DWORD dwCreationFlags = CREATE_NEW_CONSOLE;
LPVOID lpEnvironment = NULL;
LPCTSTR lpCurrentDirectory = NULL;
LPSTARTUPINFO lpStartupInfo = new STARTUPINFO();
LPPROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION();
ZeroMemory(lpStartupInfo, sizeof(STARTUPINFO));
lpStartupInfo->cb = sizeof(lpStartupInfo);

BOOL bResult = CreateProcess(lpApplicationName,
                             lpCommandLine,
                             lpProcessAttributes,
                             lpThreadAttributes,
                             bInheritHandles,
                             dwCreationFlags,
                             lpEnvironment,
                             lpCurrentDirectory,
                             lpStartupInfo,
                             lpProcessInformation);
if (!bResult) {
    printf("Error: %d\n", GetLastError());
}
else {
    printf("Process started. Process id:%d thread id:%d\n",
           lpProcessInformation->dwProcessId,
           lpProcessInformation->dwThreadId);
}

delete lpStartupInfo;
delete lpProcessInformation;
free(lpCommandLine);

以上就是关于VC创建进程CreateProcess的方法的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VC创建进程CreateProcess的方法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • JS中substring与substr的用法

    JS中的substring和substr是用来截取字符串的方法,这两个方法虽然都能实现截取字符串的功能,但是它们有一些不同之处。以下是详细的讲解: substring方法 substring方法是用来截取字符串中的一部分,它接受两个参数,分别是起始位置和结束位置(不包括结束位置的字符)。如果只传入了一个参数,则从该参数所在位置截取到字符串末尾。 以下是一个示…

    C# 2023年6月7日
    00
  • 为HttpClient开启HTTP/2

    .Net Core在调用其他服务时,调用通常使用HttpClient,而HttpClient默认使用HTTP/1.1 。     配置 HttpClient 以使用 HTTP/2 h2 连接 自 .NET Core 3.0 发布以来, .NET 开发人员可以使用 HttpClient 启用 HTTP/2 。   设置 HTTP/2 的方法 DefaultRe…

    C# 2023年4月28日
    00
  • Quartz.Net调度框架配置解析

    Quartz.Net调度框架配置解析 介绍 Quartz是一个常见的.NET调度框架,可以用于构建.NET应用程序的时间触发任务。Quartz.NET是Java Quartz的一个直接端口,并在.NET平台上实现了所有Java版的原始功能。 本文将详细解释如何对Quartz的常用配置进行解析。 Quartz配置基础 Quartz的配置包含多个子元素和属性,包…

    C# 2023年5月31日
    00
  • c#泛型学习详解 创建线性链表

    C#泛型学习详解-创建线性链表 什么是泛型 在C#中,泛型是一种基于类型参数化的编程技术,它允许我们编写一个可以与任何类型一起工作的代码。使用泛型代码可以提高代码重用性和类型安全性。 什么是线性链表 线性链表是一种基本数据结构,由若干个数据节点构成,每个节点包含自己的数据或指向其他节点的引用。节点之间的关系是通过引用来体现的。具体的,我们可以用下列代码来表示…

    C# 2023年6月7日
    00
  • Asp.Net中的字符串和HTML十进制编码转换实现代码

    下面我将详细讲解如何在 Asp.Net 中实现字符串和 HTML 十进制编码的转换。 什么是字符串和 HTML 十进制编码? 在 Asp.Net 中,字符串就是一串字符(可以包含字母、数字、符号等),我们可以将其在程序中进行处理、传递和展示。而 HTML 十进制编码则是将字符按照其在 ASCII 表中对应的值进行转化,用十进制数字表示。 用 Asp.Net …

    C# 2023年5月31日
    00
  • C#递归实现显示文件夹及所有文件并计算其大小的方法

    下面是“C#递归实现显示文件夹及所有文件并计算其大小的方法”的完整攻略。 1. 确定递归终止条件 首先,我们要确定递归的终止条件。在本题中,终止条件一般是当遍历到文件时,直接输出文件的名称和大小,并返回上一级目录继续遍历。因此,我们可以使用File和Directory类来判定当前路径是否为文件或目录,并在遇到文件时直接输出。 2. 确定遍历方式 其次,我们需…

    C# 2023年6月1日
    00
  • C#加密解密类实例程序

    以下是详细的“C#加密解密类实例程序”的攻略: 一、概述 在现代信息技术领域,数据加密已经成为很多应用的基本需求。为此,C#提供了一系列的加密解密类,比如MD5、SHA1、DES、AES等等。本文将主要介绍使用C#实现加密解密的方法,其中涉及到的加密算法是DES和AES。 二、加密解密实例 2.1 DES加密解密 DES是一种常用的对称加密算法,下面是一个使…

    C# 2023年5月31日
    00
  • asp.net中Fine Uploader文件上传组件使用介绍

    下面是关于“asp.net中Fine Uploader文件上传组件使用介绍”的完整攻略。 Fine Uploader是什么? Fine Uploader是一个基于JavaScript的文件上传库,它支持大文件上传、断点续传、浏览器兼容性好等特性。Fine Uploader可以通过原生的XHR2(XMLHttpRequest Level 2)实现文件上传,在服…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部