VC创建进程CreateProcess的方法

yizhihongxing

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#中IEnumerable接口介绍并实现自定义集合

    下面是详细讲解“C#中IEnumerable接口介绍并实现自定义集合”的完整攻略: 什么是IEnumerable接口 IEnumerable接口是C#中的一个接口,可以用来枚举数据集合中的数据。 IEnumerable接口定义了一个方法GetEnumerator,这个方法返回一个IEnumerator接口的实例,这个实例可以用来依次访问集合中的元素。 在C#…

    C# 2023年5月31日
    00
  • Go语言中转换JSON数据简单例子

    以下是“Go语言中转换JSON数据简单例子”的完整攻略。 1. 什么是JSON格式 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用程序和移动应用程序之间的数据传输。JSON格式以文本的形式进行数据存储,由键值对组成,类似于JavaScript对象。 2. Go语言中的JSON库 在Go语言中,官方…

    C# 2023年5月31日
    00
  • 详解JAVA调用WCF服务的示例代码

    Java和WCF都是用于构建分布式应用程序的技术。Java可以通过调用WCF服务来实现与.NET平台的通信。本文将详细讲解如何使用Java调用WCF服务的示例代码,并提供两个示例。 1. 使用Java调用WCF服务的示例代码 以下是使用Java调用WCF服务的示例代码: import java.net.URL; import javax.xml.namesp…

    C# 2023年5月15日
    00
  • Unity InputFiled TMP属性和各种监听示例详解

    Unity InputField TMP属性和各种监听示例详解 什么是InputField? InputField是Unity中的一个UI控件,它可以让用户在UI界面中输入文本。InputField通常结合TextMeshPro(简称TMP)组件使用,用于控制文本的显示。InputField有丰富的属性和事件可以掌控,本文将详细解析。 InputField常…

    C# 2023年6月3日
    00
  • C# TreeNode案例详解

    下面是详细讲解“C# TreeNode案例详解”的完整攻略。 1. 概述 在使用 C# 编写 WinForm 窗体程序时,经常会使用 TreeView 控件来实现树形结构的展示。而 TreeView 控件中的节点则是通过 TreeNode 类来表示的。本文将详细介绍如何使用 C# 中的 TreeNode 类来实现一个简单的树形结构。 2. 创建根节点 要创建…

    C# 2023年6月7日
    00
  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    ASP.NET Core是一个开源的Web框架,支持多种平台,包括Windows、macOS和Linux等。在ASP.NET Core中,使用Entity Framework(EF)来操作数据库,可以很方便地进行数据的增删改查等操作。本文将详细介绍ASP.NET Core使用EF保存数据、级联删除和事务使用的完整攻略,同时附带两个示例说明。 一、ASP.NE…

    C# 2023年6月3日
    00
  • MASAMinimalAPI:创建MinimalAPI项目

    项目准备 1.创建项目,选择webapi。取消勾选使用控制器。创建minimal Api项目 2.创建成功后MinimalAPI的接口直接写在program.cs中 3.引入nuget包:Masa.Contrib.Service.MinimalAPIs MinimalAPI改造 1. 在program.cs中加入以下内容 将原有的 var app = bui…

    C# 2023年5月9日
    00
  • C#实现多线程的Web代理服务器实例

    当实现一个Web代理服务器时,需要考虑到多线程的实现,因为同时需要处理多个请求和响应。下面是一个基于C#的多线程Web代理服务器的实现攻略: 1. 开发环境 为了开发一个C#多线程Web代理服务器,需要安装如下软件: Visual Studio:用于编写C#代码和构建Web代理服务器。 .NET Framework:Web代理服务器运行所需的软件框架。 2.…

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