在 Windows 环境下,进程就是一个正在运行的程序实例.线程是进程内执行代码的独立实体.创建一个进程后,系统会为该进程创建一个主线程.
通常通过调用 CreateProcess 函数创建进程,该函数原形如下:
BOOL CreateProcess(
LPCSTR lpApplicationName,
//可执行文件的名称
LPSTR lpCommandLine,
//指定了要传递给执行模块的参数
NULL,
//进程安全性,设为 NULL 表示使用默认安全属性LPSECURITY_ATTRIBUTES lpProcessAttributes,
//线程安全性,设为 NULL 表示使用默认安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes
//指定当前进程的可继承句柄是否可以被新进程继承
BOOL bInheritHandle,
//指定了新进程的优先级和其它创建标志
DWORD dwCreationFlags,
LPVOID lpEnvironment,
//指定了新进程使用的环境变量
LPCSTR lpCurrenDirectory,
//新进程使用的目录
LPSTARUPINFO lpStartupinfo,
//指定新进程的显示信息
//返回新建进程的标志信息,如ID 号,句柄等
LPPROCESS_INFORMATION lpProcessInformation
)
上面的参数的数据类型是 Windows 自定义的数据类型,具体定义在 WINDEF.h文件中,下面列出一部分常用的数据类型
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD
typedef float FLOAT;
typedef void far *LPVOID;
typedef int INT;
typedef unsigned int UINT;
lpProcessInformation 参数是一个指向 PROCESS_INFORMATION 结构的指针,CreateProcess 函数返回之前会初始化这些结构成员,结构定义如下:
typedef struct
{
HANDLE hProcess; //新建进程的内核句柄
HANDLE hThread; //新建进程中主线程的内核句柄
DWORD dwProcessId; //新建进程的ID 号
DOWRD dwThreaId; //新建进程的主线程ID 号
}
创建进程以后,必须调用 CloseHandle 函数关闭所创建的进程内核对象和线程内核对象,否则进程虽然终止了,但是该进程占用的资源依然没有释放
完整示例代码如下(该程序运行的时候会自动打开系统自带的记事本程序):
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
char *szCommandLine = "notepad.exe";
STARTUPINFO si = {sizeof(si)}; //初始化STARTUPINFO 结构的大小
PROCESS_INFORMATION pi; //该变量保存新建进程的标志信息
BOOL bRet = ::CreateProcess(NULL, //不在此指定可执行的文件名
szCommandLine, //命令行参数
NULL, //默认进程安全属性
NULL, //默认线程安全属性
FALSE, //指定当前进程内的句柄不可以被新进程继承
NULL, //使用默认的创建方式
NULL, //使用本进程的环境变量
NULL, //使用本进程的目录
&si, //使用默认的显示方式
&pi); //保存新建进程的标志信息
if(bRet)
{
//关闭新建进程和主线程的句柄
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
return 0;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。