1. 程式人生 > >windows下建立程序,CreateProcess()詳解及用法

windows下建立程序,CreateProcess()詳解及用法

windows下想要建立一個子程序不如linux的fork函式來得方便,通過CreateProcess函式建立一個新的程序,函式的定義如下

  1. BOOL CreateProcess(  
  2.  LPCTSTR lpApplicationName, // 應用程式名稱
  3.  LPTSTR lpCommandLine, // 命令列字串
  4.  LPSECURITY_ATTRIBUTES lpProcessAttributes, // 程序的安全屬性
  5.  LPSECURITY_ATTRIBUTES lpThreadAttributes, // 執行緒的安全屬性
  6.  BOOL bInheritHandles, // 是否繼承父程序的屬性
  7.  DWORD dwCreationFlags, // 建立標誌
  8.  LPVOID lpEnvironment, // 指向新的環境塊的指標
  9.  LPCTSTR lpCurrentDirectory, // 指向當前目錄名的指標
  10.  LPSTARTUPINFO lpStartupInfo, // 傳遞給新程序的資訊
  11.  LPPROCESS_INFORMATION lpProcessInformation // 新程序返回的資訊
  12. );  

下面寫一個建立程序和簡單的控制示例,首先建立一個小程式,作為子程序的實體

  1. #include<iostream>
  2. #include<Windows.h>
  3. using
    namespace std;  
  4. int main(int argc, char *argv[])  
  5. {  
  6.     cout << "args_num: " << argc << endl;  
  7.     for(int i = 0;i < argc;i ++){  
  8.         cout << "arg " << i << " = " << argv[i] << endl;  
  9.     }  
  10.     return 0;  
  11. }  
主要是列印程序的傳入引數列表,下面是建立子程序的程式碼,執行後可以看到,子程序也能獲取到傳入引數了。
  1. #include<iostream>
  2. #include<Windows.h>
  3. usingnamespace std;  
  4. int main()  
  5. {  
  6.     char cWindowsDirectory[MAX_PATH];  
  7.     //LPTSTR 與 wchar_t* 等價(Unicode環境下)
  8.     LPTSTR cWinDir = newTCHAR[MAX_PATH];  
  9.     GetCurrentDirectory(MAX_PATH, cWinDir);  
  10.     LPTSTR sConLin = wcscat(cWinDir , L"\\..\\Debug\\another.exe a b c d");  
  11.     STARTUPINFO si;  
  12.     PROCESS_INFORMATION pi;  
  13.     ZeroMemory(&si, sizeof(si));  
  14.     ZeroMemory(&pi, sizeof(pi));  
  15.     //建立一個新程序
  16.     if(CreateProcess(  
  17.         NULL,   //  指向一個NULL結尾的、用來指定可執行模組的寬位元組字串
  18.         sConLin, // 命令列字串
  19.         NULL, //    指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的控制代碼可以被子程序繼承。
  20.         NULL, //    如果lpProcessAttributes引數為空(NULL),那麼控制代碼不能被繼承。<同上>
  21.         false,//    指示新程序是否從呼叫程序處繼承了控制代碼。 
  22.         0,  //  指定附加的、用來控制優先類和程序的建立的標
  23.             //  CREATE_NEW_CONSOLE  新控制檯開啟子程序
  24.             //  CREATE_SUSPENDED    子程序建立後掛起,直到呼叫ResumeThread函式
  25.         NULL, //    指向一個新程序的環境塊。如果此引數為空,新程序使用呼叫程序的環境
  26.         NULL, //    指定子程序的工作路徑
  27.         &si, // 決定新程序的主窗體如何顯示的STARTUPINFO結構體
  28.         &pi  // 接收新程序的識別資訊的PROCESS_INFORMATION結構體
  29.         ))  
  30.     {  
  31.         cout << "create process success" << endl;  
  32.         //下面兩行關閉控制代碼,解除本程序和新程序的關係,不然有可能不小心呼叫TerminateProcess函式關掉子程序
  33. //      CloseHandle(pi.hProcess);
  34. //      CloseHandle(pi.hThread);
  35.     }  
  36.     else{  
  37.         cerr << "failed to create process" << endl;  
  38.     }  
  39.     Sleep(100);  
  40.     //終止子程序
  41.     TerminateProcess(pi.hProcess, 300);  
  42.     //終止本程序,狀態碼
  43.     ExitProcess(1001);  
  44.     return 0;  
  45. }  

=======================CreateProcess()詳解及用法=======================

CreateProcess() 函式原型如下:

[C++] 純文字檢視 複製程式碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 BOOLWINAPI CreateProcess(   __in_opt    LPCTSTRlpApplicationName,   __inout_opt  LPTSTRlpCommandLine,   __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,   __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,   __in        BOOLbInheritHandles,   __in        DWORDdwCreationFlags,   __in_opt    LPVOIDlpEnvironment,   __in_opt    LPCTSTRlpCurrentDirectory,   __in         LPSTARTUPINFO lpStartupInfo,   __out        LPPROCESS_INFORMATION lpProcessInformation );

該函式用來建立一個新的程序。

第 1 個引數 lpApplicationName 是輸入引數,指向啟動程序的 exe 檔案。

第 2 個引數 lpCommandLine 是輸入引數,是啟動程序的命令列中的引數。

當這兩個引數都不為 NULL 時,第 1 個引數指定要啟動的程序 exe 檔案(不帶引數),第 2 個引數指定啟動程序所需引數。第 1 個引數也可以為 NULL,此時第 2 個引數就不能為 NULL,在 lpCommandLine 需要指定出要啟動的程式名以及所接引數,彼此間以空格隔開,其中第 1 個引數即是程式名。

第 3 個引數 lpProcessAttributes 是輸入引數,指向 SECURITY_ATTRIBUTES 結構變數,是程序的安全屬性,可以為 NULL 則使用預設的安全屬性。

第 4 個引數 lpThreadAttributes 是輸入引數,同第 3 個引數一樣,指向 SECURITY_ATTRIBUTES 結構變數。

第 5個引數 bInheritHandles 是輸入引數,表示新程序是否從呼叫程序處繼承了控制代碼。如果引數的值為 TRUE,呼叫程序中的每一個可繼承的開啟控制代碼都將被子程序繼承。被繼承的控制代碼與原程序擁有完全相同的值和訪問許可權;如果設為 FALSE,那麼不繼承。

第 6 個引數 dwCreationFlags 是輸入引數,表示程序的建立標誌以及優先順序控制。如 :CREATE_NEW_CONSOLE 會使新建的控制檯程式擁有一個新的控制檯;DEBUG_PROCESS 呼叫程序將被當作一個除錯程式,並且新程序會被當作被除錯的程序。系統把被除錯程式發生的所有除錯事件通知給偵錯程式。

第 7 個引數 lpEnvironment 是輸入引數,指向新程序的環境變數塊,如果設定為 NULL,那麼使用父程序的環境變數。

第 8 個引數 lpCurrentDirectory 是輸入引數,指定建立後新程序的當前目錄,如果設定為 NULL,那麼就在父程序所在的當前目錄。

第 9 個引數 lpStartupInfo 是輸入引數,指向一個 STARTUPINFO 結構,該結構裡可以設定啟動資訊,可以設定為 NULL 。

第 10 個引數 lpProcessInformation 是輸出引數,指向一個 PROCESS_INFORMATION 結構,返回被建立程序的資訊。

測試程式碼
[C++] 純文字檢視 複製程式碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include "stdafx.h" #include <locale.h> #include <Windows.h> int_tmain(intargc, _TCHAR* argv[]) {     PROCESS_INFORMATION ProInfo;    //程序資訊結構     STARTUPINFO    StartInfo;     ZeroMemory ( &StartInfo,sizeof(StartInfo)); LPTSTR  szPrameter = TEXT("C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe [url]www.groad.net[/url]"); TCHARszCmdLine[2048] = {0};     CopyMemory(szCmdLine, szPrameter, 2*_tcslen(szPrameter));         ZeroMemory (&ProInfo,sizeof(ProInfo)); if(!CreateProcess ( NULL,        // 執行的程式名             szCmdLine,                    // 命令列指定             NULL,                        // 程序安全屬性,NULL 時使用預設安全屬性             NULL,                        // 執行緒安全屬性,NULL 時使用預設安全屬性             FALSE,                        // 不繼承控制代碼             0,                            // 程序建立標誌             NULL,                        // 環境變數塊,為 NULL 時使用父程序環境變數             NULL,                    // 新程序目錄             &StartInfo,                        // 啟動資訊結構             &ProInfo)                    // 程序資訊結構         ) {             _tprintf (TEXT("CreateProcess failed : %d\n"

相關推薦

windows建立程序CreateProcess()用法

windows下想要建立一個子程序不如linux的fork函式來得方便,通過CreateProcess函式建立一個新的程序,函式的定義如下 BOOL CreateProcess(    LPCTSTR lpApplicationName, // 應用程式名稱  L

WindowsVTK6.0.0安裝(CMake使用說明)

操作 工具 generate 其中 con htm 目錄下的文件 ima 新建 操作系統:Windows7,用到工具:Visual studio、CMake。 1.準備工作 VTK下載: 下載最新VTK穩定版(6.0.0,截至2013年7月)http://www.vtk

windows生成github ssh key

一、ssh是什麼:ssh是Secure Shell(安全外殼協議)的縮寫,建立在應用層和傳輸層基礎上的安全協議。為了便於訪問github,要生成ssh公鑰,這樣就不用每一次訪問github都要輸入使用者名稱和密碼。 二、 1.在本地成功安裝好Git之後。單擊滑鼠右鍵,選擇Git Bush h

WindowsOpenssl安裝與使用

Windows下Openssl安裝與使用詳解 一、安裝 1.1 安裝環境:      1、作業系統:Windows XP SP2       2、C++編譯器:VC++ 6.0 1.2下載: 下載ActivePerl  5.10.1.1007(最新的版本或較低的版

windows安裝rabbitmq的步驟

(僅作為個人的備忘記錄) Rabbit MQ 是建立在強大的Erlang OTP平臺上,因此安裝Rabbit MQ的前提是安裝Erlang。通過下面兩個連線可以下載安裝最新的版本: 下載並安裝 Er

Linux程序間通訊-

   詳細的講述程序間通訊在這裡絕對是不可能的事情,而且筆者很難有信心說自己對這一部分內容的認識達到了什麼樣的地步,所以在這一節的開頭首先向大家推薦著 名作者Richard Stevens的著名作品:《Advanced Programming in the UNIX Environment》,它的中文譯本《U

Linux建立程序的三種方式特點

在Linux中主要提供了fork、vfork、clone三個程序建立方法。  在linux原始碼中這三個呼叫的執行過程是執行fork(),vfork(),clone()時,通過一個系統呼叫表對映到sys_fork(),sys_vfork(),sys_clone(),再在這三個函式中去呼叫d

PowerShell 的 grep —— Select-String 二者對比

使用 help Select-String -ShowWindow 命令我們可以很容易的得到一份中文的幫助文件,其中有這樣兩段話: Select-String cmdlet 在輸入字串和檔案中搜索文字和文字模式。你可以像使用 UNIX 中的 Grep 和 Windo

bash配置檔案/etc/profile/etc/bashrc~/.bash_profile~/.bashrc修改PATH環境變數

 1.bash的配置檔案 1)、全域性配置與個人配置 全域性配置 /etc/profile, /rtc/profile.d/*.sh,/etc/bashrc 個人配置 ~/.bash_pr

NIGINX 中的location上下文的參數用法

Nginx location配置參數詳解nginx中只支持三種請求轉發方式:round-robin(輪流調度方式):它是把客戶端流量請求依次按順序分發給每個後端服務器。缺點是:會出現某個服務器已經在 處理很多的請求而再有新的請求進來,nginx代理服務器還是會給它分發流量進來,這會導致服務器down掉。ip_

keras之ImageDataGenerator引數用法例項-01

keras圖片生成器ImageDataGenerator keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,     samplewise_center=False,   &nbs

ADB 操作命令用法大全

ADB 操作命令詳解及用法大全 一、ADB是什麼? 二、ADB有什麼作用? 三、ADB命令語法 單一裝置/模擬器連線 多個裝置/模擬器連線

queue與deque用法

使用佇列時,標頭檔案 #include<queue> #include<iostream> using namespace std; 定義佇列 queue<int>

Java學習9:super(隱式引數)關鍵字記憶體分析用法

super關鍵字,是一個隱式引數(另一個隱式引數是this)。 注:super關鍵字和this關鍵字極為類似,學習時可參考this關鍵字用法。this(隱式引數)關鍵字記憶體分析詳解及用法 1.概述 super是直接父類的引用(this是當前物件的引用

linux系統程式設計之程序(八):守護程序建立daemon()使用

一,守護程序概述 Linux Daemon(守護程序)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要使用者輸入就能執行而且提供某種服務,不是對整個系統就是對某個使用者程式提供服務。Linux系統的大多數伺服器就是通過守護程序實現的。常見的守護程序包括系

linux守護程序建立daemon()使用

Linux Daemon(守護程序)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要使用者輸入就能執行而且提供某種服務,不是對整個系統就是對某個使用者程式提供服務。Linux系統的大多數伺服器就是通過守護程序實現的。常見的守護程序包括系統日誌程序sysl

windows建立netcore控制臺程序然後傳送到centos7的docker容器裏運行

ram .com window下 cspro 建立 col obj inf div 1、首先,在window下用vs2017開發netcore控制臺項目。 2、把建立好的項目傳送到centos7下面的容器裏。 docker cp sharefoldersfo

exec族函式迴圈建立程序

  前言:之前也知道exec族函式,但沒有完全掌握,昨天又重新學習了一遍,基本完全掌握了,還有一些父子程序和迴圈建立子程序的問題,還要介紹一下環境變數,今天分享一下。   一、環境變數   先介紹下環境的概念和特性,再舉例子吧。   環境變數,是指在作業系統中用來指定作業系統執行環境的一些引數。通常具備

【django】windows安裝django建立new project

一、 進入:python 退出:exit()    二、 安裝django: 1.解壓官方下載的django-1.10.1 2.在該目錄下,python setup.py install  大概需要1分鐘的時間安裝完成,Django將被安

python3windows程序監控指令碼

1  安裝psutil,pip install psutil、 2  檢視程序id,可通過工作管理員檢視 3  cmd下進入指令碼所在路徑 4  執行指令碼(python monitor.py 30658) 5 指令碼所在路徑下,生成監控日誌檔案 指令碼如下: