在 Windows 環(huán)境下,進(jìn)程就是一個(gè)正在運行的程序實(shí)例.線(xiàn)程是進(jìn)程內執行代碼的獨立實(shí)體.創(chuàng )建一個(gè)進(jìn)程后,系統會(huì )為該進(jìn)程創(chuàng )建一個(gè)主線(xiàn)程.
通常通過(guò)調用 CreateProcess 函數創(chuàng )建進(jìn)程,該函數原形如下:
BOOL CreateProcess(
LPCSTR lpApplicationName,
//可執行文件的名稱(chēng)
LPSTR lpCommandLine,
//指定了要傳遞給執行模塊的參數
NULL,
//進(jìn)程安全性,設為 NULL 表示使用默認安全屬性LPSECURITY_ATTRIBUTES lpProcessAttributes,
//線(xiàn)程安全性,設為 NULL 表示使用默認安全屬性
LPSECURITY_ATTRIBUTES lpThreadAttributes
//指定當前進(jìn)程的可繼承句柄是否可以被新進(jìn)程繼承
BOOL bInheritHandle,
//指定了新進(jìn)程的優(yōu)先級和其它創(chuàng )建標志
DWORD dwCreationFlags,
LPVOID lpEnvironment,
//指定了新進(jìn)程使用的環(huán)境變量
LPCSTR lpCurrenDirectory,
//新進(jìn)程使用的目錄
LPSTARUPINFO lpStartupinfo,
//指定新進(jìn)程的顯示信息
//返回新建進(jìn)程的標志信息,如ID 號,句柄等
LPPROCESS_INFORMATION lpProcessInformation
)
上面的參數的數據類(lèi)型是 Windows 自定義的數據類(lèi)型,具體定義在 WINDEF.h文件中,下面列出一部分常用的數據類(lèi)型
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 參數是一個(gè)指向 PROCESS_INFORMATION 結構的指針,CreateProcess 函數返回之前會(huì )初始化這些結構成員,結構定義如下:
typedef struct
{
HANDLE hProcess; //新建進(jìn)程的內核句柄
HANDLE hThread; //新建進(jìn)程中主線(xiàn)程的內核句柄
DWORD dwProcessId; //新建進(jìn)程的ID 號
DOWRD dwThreaId; //新建進(jìn)程的主線(xiàn)程ID 號
}
創(chuàng )建進(jìn)程以后,必須調用 CloseHandle 函數關(guān)閉所創(chuàng )建的進(jìn)程內核對象和線(xiàn)程內核對象,否則進(jìn)程雖然終止了,但是該進(jìn)程占用的資源依然沒(méi)有釋放
完整示例代碼如下(該程序運行的時(shí)候會(huì )自動(dòng)打開(kāi)系統自帶的記事本程序):
#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; //該變量保存新建進(jìn)程的標志信息
BOOL bRet = ::CreateProcess(NULL, //不在此指定可執行的文件名
szCommandLine, //命令行參數
NULL, //默認進(jìn)程安全屬性
NULL, //默認線(xiàn)程安全屬性
FALSE, //指定當前進(jìn)程內的句柄不可以被新進(jìn)程繼承
NULL, //使用默認的創(chuàng )建方式
NULL, //使用本進(jìn)程的環(huán)境變量
NULL, //使用本進(jìn)程的目錄
&si, //使用默認的顯示方式
&pi); //保存新建進(jìn)程的標志信息
if(bRet)
{
//關(guān)閉新建進(jìn)程和主線(xiàn)程的句柄
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
return 0;
}