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