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#测量程序运行时间及cpu使用时间实例方法

    下面我将详细讲解一下如何在C#测量程序运行时间及 CPU 使用时间的实例方法。 步骤一:获取系统时间 为了测量程序运行时间和 CPU 使用时间,我们需要获取系统时间。可以使用 C# 的 System.DateTime 类来获取当前系统时间,并将其转换为毫秒数。例如: DateTime start = DateTime.Now; 这将创建一个名为“start”…

    C# 2023年6月1日
    00
  • C#字符串的截取函数用法总结

    下面是关于“C#字符串的截取函数用法总结”完整攻略的内容: 目录 介绍 SubString() 方法 Remove() 方法 示例说明 总结 介绍 在C#中,字符串截取是一种常见的操作。有许多方法可以截取 C# 字符串,其中最常用的是 SubString() 和 Remove() 方法。本文将对这两种方法进行详细的说明,并提供示例说明。 SubString(…

    C# 2023年6月8日
    00
  • Sql Server2012 使用IP地址登录服务器的配置图文教程

    下面我来为您详细讲解SQL Server 2012使用IP地址登录服务器的配置图文教程,包含以下几个步骤: 步骤一:启用SQL Server Mixed Mode身份验证 首先,我们需要开启SQL Server的Mixed Mode身份验证,才能使用账号密码登录。步骤如下: 1.以Windows管理员身份启动SQL Server Management Stu…

    C# 2023年6月7日
    00
  • asp.net 字符串、二进制、编码数组转换函数

    asp.net提供了多个字符串、二进制、编码数组的转换函数,它们可以帮助我们在不同的数据类型之间进行转换。下面是一些常用的转换函数: Convert.ToBase64String Method 该方法可以将给定的二进制数据转换成base64编码的字符串: byte[] data = new byte[] { 0x48, 0x65, 0x6c, 0x6c, 0…

    C# 2023年5月31日
    00
  • 用C#编写ActiveX控件(二)

    这里是详细讲解“用C#编写ActiveX控件(二)”的完整攻略。 1. 什么是ActiveX控件 ActiveX控件是一种运行在Windows操作系统上的可重用组件技术,它可以通过Web页面在Internet上进行传播使用,早期广泛应用于Internet Explorer中的插件。ActiveX控件的编写可以使用多种语言实现,如C++、VB、C#等。 2. …

    C# 2023年5月15日
    00
  • C#绘制实时曲线图的方法详解

    针对网站上的这篇文章“C#绘制实时曲线图的方法详解”,以下是完整的攻略: 1. 了解实时曲线图的作用和实现原理 实时曲线图主要是用于显示一些随时间变化的数据,并实时更新数据,常见的使用场景是嵌入式监控、数据采集和控制等。关于实时曲线图的实现原理,一般使用的是C#中的Graphics技术。 2. 准备工作 引入namespace: using System.D…

    C# 2023年6月7日
    00
  • Unity中的静态批处理和动态批处理操作

    在Unity中,静态批处理和动态批处理都是优化游戏性能的常用方法。静态批处理操作是在游戏启动时进行的优化,而动态批处理是在运行过程中动态进行的优化。 静态批处理操作 静态批处理操作主要是对游戏场景中的物体进行合并处理,将多个相同材质的物体合并成一个大的网格物体,以减少渲染次数和提高性能。 在使用静态批处理时,需要将相同材质的物体先进行设置,然后使用合并网格组…

    C# 2023年6月3日
    00
  • C#调用存储过程详解(带返回值、参数输入输出等)

    介绍 在使用C#开发的过程中,经常需要调用存储过程来完成某些任务,比如从数据库中获取数据或者执行一些复杂的数据处理操作。本文将详细介绍C#调用存储过程的方法,包括如何传入参数、传递多个参数、以及如何获取存储过程的返回值。 调用带参数的存储过程 首先,我们需要连接到数据库。以使用SQL Server为例: using System.Data.SqlClient…

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