天天看點

CreateProcess()函數

bool CreateProcess()

說明:WIN32API函數CreateProcess用來建立一個新的程序和它的主線程,這個新程序運作指定的可執行檔案。

CreateProcess函數用來運作一個新的程式。

另外CreateProcess函數除了建立一個程序,還建立一個線程對象。這個線程将連同一個已初始化了的堆棧一起被建立,堆棧的大小由可執行的檔案頭中的描述決定。線程由檔案頭處開始執行。

這個程序會被配置設定一個32位的程序辨別符。直到程序終止這個辨別符都是有效的。它可以被用來辨別這個程序,或在OpenProcess函數中被指定以打開這個程序的句柄。程序中被初始化了的線程一樣會被配置設定一個32位的線程符。這個辨別符直到線程終止都是有效的且可以用來在系統中唯一辨別這個線程。這些辨別符在PROCESS_INFORMATION結構體中傳回。

#include "stdafx.h"
#include <iostream>
#include <windows.h> 
#include <stdio.h> 
#include <tchar.h>
#pragma warning(disable:4996)

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	STARTUPINFO si;

	PROCESS_INFORMATION pi; //程序資訊: 

	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	//char * commandline = "F:\\nlp\\release\\jparser.exe -http 8080 config.txt data";
	//wchar_t commandline[] = _T("C:\\Program Files (x86)\\Notepad++\\notepad++.exe");
	wchar_t commandline[] = _T("F:\\nlp\\release\\jparser.exe -http 8080 config.txt");
	ZeroMemory(&pi, sizeof(pi));
	//do{
		// 建立子程序,判斷是否執行成功
		if (!CreateProcess(NULL, commandline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
		{
			cout << "建立程序失敗.." << GetLastError() << endl;
			system("pause"); //用于測試
			return 0;
		}
		//程序執行成功,列印程序資訊 
		cout << "以下是子程序的資訊:" << endl;
		cout << "程序ID pi.dwProcessID: " << pi.dwProcessId << endl;
		cout << "線程ID pi.dwThreadID : " << pi.dwThreadId << endl;
		// 等待知道子程序退出... 
		WaitForSingleObject(pi.hProcess, INFINITE);//檢測程序是否停止 
		//WaitForSingleObject()函數檢查對象的狀态,如果是未确定的則等待至逾時 
		//子程序退出 
		cout << "子程序已經退出..." << endl;
		//關閉程序和句柄 
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
		//system("pause");//執行完畢後等待
	//} while (true);//如果程序推出就再次執行方法 
	exit(0);

	return 0;
}           
CreateProcess()函數