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日

相关文章

  • 利用C#/VB.NET实现将PDF转为Word

    以下是“利用C#/VB.NET实现将PDF转为Word”完整攻略: 步骤1:安装PDF软件开发包 首先需要安装支持PDF操作的开发包,常用的有iTextSharp和Aspose.PDF等,这里以iTextSharp为例,安装方式如下: 打开NuGet包管理器 搜索iTextSharp,安装最新的版本 步骤2:编写代码,实现PDF转Word 下面给出两个示例:…

    C# 2023年6月3日
    00
  • 简单实现winform编辑器

    以下是详细的“简单实现winform编辑器”的攻略: 步骤一:创建WinForm项目 首先,在Visual Studio中创建一个新的WinForms项目,并为其命名。 步骤二:添加控件 在WinForms项目中,可以通过拖放控件的方式向窗体中添加需要的控件,如文本框、按钮、菜单、工具栏等。 步骤三:实现基础功能 编写代码来实现基本的功能,如打开文件、保存文…

    C# 2023年6月7日
    00
  • 关于STL中的map容器的一些总结

    关于STL中的map容器的一些总结 简介 在C++ STL中,map是一种关联容器。map提供了一种映射关系,它将一个关键字映射到一个值。在map中,每个关键字只能出现一次,而每个值则可以出现多次。 map底层使用红黑树实现,因此具有自动排序和快速查找的特点。map不仅支持索引访问,还支持迭代器遍历,同时具有增删改查等基本操作。 常用函数及其复杂度 以下是m…

    C# 2023年6月7日
    00
  • 在C#里面给PPT文档添加注释的实现代码

    在C#中通过对PowerPoint对象模型的操作,可以实现在PPT文档中添加注释的功能。下面是具体的步骤: 1. 引用PowerPoint对象模型 首先需要引用PowerPoint对象模型,方法如下: using Microsoft.Office.Interop.PowerPoint; 2. 创建PowerPoint文档对象并打开文件 使用下面的代码可以创建…

    C# 2023年6月6日
    00
  • 在Linux中安装ASPNET.Core3.0运行时的示例代码

    在Linux中安装ASP.NET Core 3.0运行时的示例代码 在本文中,我们将详细讲解如何在Linux中安装ASP.NET Core 3.0运行时,并提供两个示例说明。 准备工作 在开始之前,您需要安装以下软件: Linux操作系统(本文以Ubuntu 18.04为例) .NET Core 3.0 SDK 安装ASP.NET Core 3.0运行时 添…

    C# 2023年5月16日
    00
  • C#基础知识之this关键字介绍

    C#基础知识之this关键字介绍 概述 在C#中,this关键字用于指向当前实例对象。在类中,实例成员包括字段、属性、方法和构造函数,this关键字通常用于引用当前实例的成员。this关键字也可以在构造函数中使用,用于在构造函数中调用当前类的其他构造函数。 用法 引用实例成员 首先,我们来看下如何在C#类中使用this关键字引用实例成员。通常情况下,我们使用…

    C# 2023年5月31日
    00
  • c#基础系列之值类型和引用类型的深入理解

    C#基础系列之值类型和引用类型的深入理解 值类型和引用类型 C#中的变量可以分为值类型和引用类型两种。所谓值类型,就是它们在内存中直接存储它们的值,而引用类型则存储对象在内存中的地址。常见的值类型包括整型、浮点型、布尔型和枚举类型,而常见的引用类型包括类、接口、数组和委托等。 值类型使用堆栈空间存储,可以直接访问,速度较快,但是数据量较小,一般在32位系统中…

    C# 2023年5月15日
    00
  • ASP.NET Core 依赖注入框架的使用

    在 ASP.NET Core 中,依赖注入(Dependency Injection,DI)是一种设计模式,它可以帮助我们管理应用程序中的对象和服务。ASP.NET Core 内置了一个依赖注入框架,可以帮助我们轻松地实现依赖注入。以下是 ASP.NET Core 依赖注入框架的完整攻略: 步骤一:注册服务 在 ASP.NET Core 中,可以使用 Con…

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