久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ShellExecute, WinExec, CreateProcess區(qū)別 (轉(zhuǎn))

 邱濤_2013 2013-11-05

ShellExecute
  ShellExecute的功能是運行一個外部程序(或者是打開一個已注冊的文件、打開一個目錄,、打印一個文件等等),,并對外部程序有一定的控制。

  有幾個API函數(shù)都可以實現(xiàn)這些功能,,但是在大多數(shù)情況下ShellExecute是更多的被使用的,,同時它并不是太復(fù)雜。

  ShellExecute函數(shù)原型及參數(shù)含義如下:

  ShellExecute(

  HWND hwnd,           //父窗口句柄 (如:NULL,,Handle等)

  LPCSTR lpOperation, //操作類型 (如:"open")*要加英文雙引號

  LPCSTR lpFile,           //要進行操作的文件或路徑

  LPCSTR lpParameters, //當(dāng)lpOperation為“explore”時指定要傳遞的參數(shù),,通常設(shè)為NULL

  LPCSTR lpDirectory,    //指定默認目錄,通常設(shè)為NULL

  INT nShowCmd          //文件打開的方式,,以通常方式還是最大化或最小化顯示,,一般為SW_SHOWNORMAL

  ) 
參數(shù)說明:
  ●hWnd:用于指定父窗口句柄,。當(dāng)函數(shù)調(diào)用過程出現(xiàn)錯誤時,它將作為Windows消息窗口的父窗口,。例如,,可以將其設(shè)置為應(yīng)用程序主窗口句柄,即Application.Handle,,也可以將其設(shè)置為桌面窗口句柄(用GetDesktopWindow函數(shù)獲得),。

  ●Operation:用于指定要進行的操作。其中“open”操作表示執(zhí)行由FileName參數(shù)指定的程序,,或打開由FileName參數(shù)指定的文件或文件夾,;“print”操作表示打印由FileName參數(shù)指定的文件;“explore”操作表示瀏覽由FileName參數(shù)指定的文件夾,。當(dāng)參數(shù)設(shè)為nil時,,表示執(zhí)行默認操作“open”。

  ●FileName:用于指定要打開的文件名,、要執(zhí)行的程序文件名或要瀏覽的文件夾名,。

  ●Parameters:若FileName參數(shù)是一個可執(zhí)行程序,則此參數(shù)指定命令行參數(shù),,否則此參數(shù)應(yīng)為nil或PChar(0),。

  ●Directory:用于指定默認目錄。

  ●ShowCmd:若FileName參數(shù)是一個可執(zhí)行程序,,則此參數(shù)指定程序窗口的初始顯示方式,,否則此參數(shù)應(yīng)設(shè)置為0。

  若ShellExecute函數(shù)調(diào)用成功,,則返回值為被執(zhí)行程序的實例句柄,。若返回值小于32,則表示出現(xiàn)錯誤,。

  上述僅僅是ShellExecute函數(shù)的標準用法,,下面將介紹它的特殊用法,。 
例子如下:

  //調(diào)用記事本

  ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL);


  2.特殊用法

  如果將FileName參數(shù)設(shè)置為“http:”協(xié)議格式,,那么該函數(shù)將打開默認瀏覽器并鏈接到指定的URL地址。若用戶機器中安裝了多個瀏覽器,,則該函數(shù)將根據(jù)Windows 9x/NT注冊表中http協(xié)議處理程序(Protocols Handler)的設(shè)置確定啟動哪個瀏覽器,。

  格式一:http://網(wǎng)站域名。

  如:ShellExecute(Handle, "open", http:// ;

  www.neu.edu.cn’, NULL, NULL, SW_SHOWNORMAL);

  格式二:http://網(wǎng)站域名/網(wǎng)頁文件名,。

  如:ShellExecute(Handle, "open", http:// ;

  www.neu.edu.cn/default.htm',NULL,NULL,

  SW_SHOWNORMAL);

  如果將FileName參數(shù)設(shè)置為“mailto:”協(xié)議格式,,那么該函數(shù)將啟動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger,。若用戶機器中安裝了多個郵件客戶程序,,則該函數(shù)將根據(jù)Windows 9x/NT注冊表中mailto協(xié)議處理程序的設(shè)置確定啟動哪個郵件客戶程序,。

  格式一:mailto:

  如:ShellExecute(Handle,"open", "mailto:", NULL, NULL, SW_SHOWNORMAL);打開新郵件窗口。

  格式二:mailto:用戶賬號@郵件服務(wù)器地址

  如:ShellExecute(Handle, "open"," mailto:[email protected]", NULL, NULL, SW_SHOWNORMAL);打開新郵件窗口,,并自動填入收件人地址,。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同),。

  格式三:mailto:用戶賬號@郵件服務(wù)器地址?subject=郵件主題&body=郵件正文

  如:ShellExecute(handle, ‘open’, ‘ mailto:[email protected],?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,并自動填入收件人地址,、郵件主題和郵件正文,。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉(zhuǎn)義字符%0a,。


  例子(delphi):

  在一個應(yīng)用程序調(diào)用c:\Project1.exe;

  ShellExecute(handle, 'open','c:\Project1.exe','字串內(nèi)容',nil, SW_SHOWNORMAL);

  在Project1.exe里可以調(diào)用:

  procedure TForm1.FormCreate(Sender: TObject);

  var i:integer;

  begin

  for i:=1 to paramcount do

  if ParamStr(i)<>'' then showmessage(ParamStr(i));

  end;

  最后的那個參數(shù),,為窗口指定可視性方面的一個命令。

  請用下述任何一個常數(shù)

  SW_HIDE 隱藏窗口,,活動狀態(tài)給另一個窗口

  SW_MINIMIZE 最小化窗口,,活動狀態(tài)給另一個窗口

  SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態(tài)

  SW_SHOW 用當(dāng)前的大小和位置顯示一個窗口,,同時令其進入活動狀態(tài)

  SW_SHOWMAXIMIZED 最大化窗口,,并將其激活

  SW_SHOWMINIMIZED 最小化窗口,并將其激活

  SW_SHOWMINNOACTIVE 最小化一個窗口,,同時不改變活動窗口

  SW_SHOWNA 用當(dāng)前的大小和位置顯示一個窗口,,不改變活動窗口

  SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口

  SW_SHOWNORMAL 與SW_RESTORE相同

 
 
 
WinExec
//聲明
WinExec(
  lpCmdLine: LPCSTR; {文件名和參數(shù); 如沒指定路徑會按以下順序查找: 程序目錄/當(dāng)前目錄/System32/Windows/PATH環(huán)境變量}
  uCmdShow: UINT     {啟動選項}
): UINT;

//說明 :運行指定的程序

//返回值 
大于 31                    {調(diào)用成功}
等于 0 {內(nèi)存不足}
ERROR_FILE_NOT_FOUND = 2;  {文件名錯誤}
ERROR_PATH_NOT_FOUND = 3;  {路徑名錯誤}
ERROR_BAD_FORMAT     = 11; {EXE 文件無效}
(請參考FindExecutable函數(shù))

//參數(shù)表: 
參數(shù) 類型及說明 
lpCmdLine String,,包含要執(zhí)行的命令行 
uCmdShow Long,,定義了以怎樣的形式啟動程序的常數(shù)值。
//uCmdShow 參數(shù)可選值:
SW_HIDE            = 0; {隱藏, 并且任務(wù)欄也沒有最小化圖標} SW_SHOWNORMAL = 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL          = 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED   = 2; {最小化, 激活}
SW_SHOWMAXIMIZED   = 3; {最大化, 激活}
SW_MAXIMIZE        = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE  = 4; {用最近的大小和位置顯示, 不激活}
SW_SHOW            = 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE        = 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA          = 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE         = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT     = 10; {同 SW_SHOWNORMAL}
SW_MAX             = 10; {同 SW_SHOWNORMAL} 
 
 
 
  
CreateProcess
  說明:
  WIN32API函數(shù)CreateProcess用來創(chuàng)建一個新的進程和它的主線程,,這個新進程運行指定的可執(zhí)行文件,。
  函數(shù)原型:
  BOOL CreateProcess
  (
  LPCTSTR lpApplicationName, 
  LPTSTR lpCommandLine, 
  LPSECURITY_ATTRIBUTES lpProcessAttributes。
  LPSECURITY_ATTRIBUTES lpThreadAttributes, 
  BOOL bInheritHandles, 
  DWORD dwCreationFlags,
  LPVOID lpEnvironment, 
  LPCTSTR lpCurrentDirectory, 
  LPSTARTUPINFO lpStartupInfo, 
  LPPROCESS_INFORMATION lpProcessInformation 
  );
  參數(shù):
  lpApplicationName:指向一個NULL結(jié)尾的,、用來指定可執(zhí)行模塊的字符串,。
  這個字符串可以使可執(zhí)行模塊的絕對路徑,也可以是相對路徑,,在后一種情況下,,函數(shù)使用當(dāng)前驅(qū)動器和目錄建立可執(zhí)行模塊的路徑。
  這個參數(shù)可以被設(shè)為NULL,,在這種情況下,,可執(zhí)行模塊的名字必須處于 lpCommandLine 參數(shù)的最前面并由空格符與后面的字符分開。
  這個被指定的模塊可以是一個Win32應(yīng)用程序,。如果適當(dāng)?shù)淖酉到y(tǒng)在當(dāng)前計算機上可用的話,,它也可以是其他類型的模塊(如MS-DOS 或 OS/2),。
  在Windows NT中,如果可執(zhí)行模塊是一個16位的應(yīng)用程序,,那么這個參數(shù)應(yīng)該被設(shè)置為NULL并且因該在lpCommandLine參數(shù)中指定可執(zhí)行模塊的名稱,。16位的應(yīng)用程序是以DOS虛擬機或Win32上的Windows(WOW) 為進程的方式運行。
  lpCommandLine:指向一個NULL結(jié)尾的,、用來指定要運行的命令行,。
  這個參數(shù)可以為空,那么函數(shù)將使用參數(shù)指定的字符串當(dāng)作要運行的程序的命令行,。
  如果lpApplicationName和lpCommandLine參數(shù)都不為空,,那么lpApplicationName參數(shù)指定將要被運行的模塊,lpCommandLine參數(shù)指定將被運行的模塊的命令行,。新運行的進程可以使用GetCommandLine函數(shù)獲得整個命令行,。C語言程序可以使用argc和argv參數(shù)。
  如果lpApplicationName參數(shù)為空,,那么這個字符串中的第一個被空格分隔的要素指定可執(zhí)行模塊名,。如果文件名不包含擴展名,那么.exe將被假定為默認的擴展名,。如果文件名以一個點(.)結(jié)尾且沒有擴展名,,或文件名中包含路徑,.exe將不會被加到后面,。如果文件名中不包含路徑,,Windows將按照如下順序?qū)ふ疫@個可執(zhí)行文件:
  1.當(dāng)前應(yīng)用程序的目錄。
  2.父進程的目錄,。
  3.Windows 95:Windows系統(tǒng)目錄,,可以使用GetSystemDirectory函數(shù)獲得,。
  Windows NT:32位Windows系統(tǒng)目錄,。可以使用GetSystemDirectory函數(shù)獲得,,目錄名是SYSTEM32,。
  4.在Windows NT中:16位Windows系統(tǒng)目錄,。不可以使用Win32函數(shù)獲得這個目錄,但是它會被搜索,,目錄名是SYSTEM,。
  5.Windows目錄,??梢允褂肎etWindowsDirectory函數(shù)獲得這個目錄。
  6.列在PATH環(huán)境變量中的目錄,。
  如果被創(chuàng)建的進程是一個以MS-DOS或16位Windows為基礎(chǔ)的應(yīng)用程序,,lpCommandLine參數(shù)應(yīng)該是一個以可執(zhí)行文件的文件名作為第一個要素的絕對路徑,,因為這樣做可以使32位Windows程序工作的很好,這樣設(shè)置lpCommandLine參數(shù)是最強壯的,。
  lpProcessAttributes:指向一個SECURITY_ATTRIBUTES結(jié)構(gòu)體,,這個結(jié)構(gòu)體決定是否返回的句柄可以被子進程繼承。如果lpProcessAttributes參數(shù)為空(NULL),,那么句柄不能被繼承,。
  在Windows NT中:SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員指定了新進程的安全描述符,如果參數(shù)為空,,新進程使用默認的安全描述符,。
  在Windows95中:SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員被忽略。
  lpThreadAttributes:指向一個SECURITY_ATTRIBUTES結(jié)構(gòu)體,,這個結(jié)構(gòu)體決定是否返回的句柄可以被子進程繼承,。如果lpThreadAttributes參數(shù)為空(NULL),那么句柄不能被繼承,。
  在Windows NT中,,SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員指定了主線程的安全描述符,如果參數(shù)為空,,主線程使用默認的安全描述符,。
  在Windows95中:SECURITY_ATTRIBUTES結(jié)構(gòu)的lpSecurityDescriptor成員被忽略。
  bInheritHandles:指示新進程是否從調(diào)用進程處繼承了句柄,。如果參數(shù)的值為真,,調(diào)用進程中的每一個可繼承的打開句柄都將被子進程繼承。被繼承的句柄與原進程擁有完全相同的值和訪問權(quán)限,。
  dwCreationFlags:指定附加的,、用來控制優(yōu)先類和進程的創(chuàng)建的標志。以下的創(chuàng)建標志可以以除下面列出的方式外的任何方式組合后指定,。
  值:CREATE_DEFAULT_ERROR_MODE
  含義:新的進程不繼承調(diào)用進程的錯誤模式,。CreateProcess函數(shù)賦予新進程當(dāng)前的默認錯誤模式作為替代。應(yīng)用程序可以調(diào)用SetErrorMode函數(shù)設(shè)置當(dāng)前的默認錯誤模式,。
  這個標志對于那些運行在沒有硬件錯誤環(huán)境下的多線程外殼程序是十分有用的,。
  對于CreateProcess函數(shù),默認的行為是為新進程繼承調(diào)用者的錯誤模式,。設(shè)置這個標志以改變默認的處理方式,。
  值:CREATE_NEW_CONSOLE
  含義:新的進程將使用一個新的控制臺,而不是繼承父進程的控制臺,。這個標志不能與DETACHED_PROCESS標志一起使用,。
  值:CREATE_NEW_PROCESS_GROUP
  含義:新進程將使一個進程樹的根進程。進程樹種的全部進程都是根進程的子進程。新進程樹的用戶標識符與這個進程的標識符是相同的,,由 lpProcessInformation參數(shù)返回,。進程樹經(jīng)常使用GenerateConsoleCtrlEvent函數(shù)允許發(fā)送CTRL+C或 CTRL+BREAK信號到一組控制臺進程。
  值:CREATE_SEPARATE_WOW_VDM
  含義:(只適用于 Windows NT)這個標志只有當(dāng)運行一個16位的Windows應(yīng)用程序時才是有效的,。如果被設(shè)置,,新進程將會在一個私有的虛擬DOS機(VDM)中運行。另外,,默認情況下所有的16位Windows應(yīng)用程序都會在同一個共享的VDM中以線程的方式運行,。單獨運行一個16位程序的優(yōu)點是一個應(yīng)用程序的崩潰只會結(jié)束這一個VDM的運行;其他那些在不同VDM中運行的程序會繼續(xù)正常的運行,。同樣的,,在不同VDM中運行的16位Windows應(yīng)用程序擁有不同的輸入隊列,這意味著如果一個程序暫時失去響應(yīng),,在獨立的VDM中的應(yīng)用程序能夠繼續(xù)獲得輸入,。
  值:CREATE_SHARED_WOW_VDM
  含義:(只適用于Windows NT)這個標志只有當(dāng)運行一個16位的Windows應(yīng)用程序時才是有效的。如果WIN.INI中的Windows段的 DefaultSeparateVDM選項被設(shè)置為真,,這個標識使得CreateProcess函數(shù)越過這個選項并在共享的虛擬DOS機中運行新進程,。
  值:CREATE_SUSPENDED
  含義:新進程的主線程會以暫停的狀態(tài)被創(chuàng)建,直到調(diào)用ResumeThread函數(shù)被調(diào)用時才運行,。
  值:CREATE_UNICODE_ENVIRONMENT
  含義:如果被設(shè)置,,由lpEnvironment參數(shù)指定的環(huán)境塊使用Unicode字符,如果為空,,環(huán)境塊使用ANSI字符,。
  值:DEBUG_PROCESS
  含義:如果這個標志被設(shè)置,調(diào)用進程將被當(dāng)作一個調(diào)試程序,,并且新進程會被當(dāng)作被調(diào)試的進程,。系統(tǒng)把被調(diào)試程序發(fā)生的所有調(diào)試事件通知給調(diào)試器。
  如果你使用這個標志創(chuàng)建進程,,只有調(diào)用進程(調(diào)用CreateProcess函數(shù)的進程)可以調(diào)用WaitForDebugEvent函數(shù),。
  值:DEBUG_ONLY_THIS_PROCESS
  含義:如果此標志沒有被設(shè)置且調(diào)用進程正在被調(diào)試,新進程將成為調(diào)試調(diào)用進程的調(diào)試器的另一個調(diào)試對象,。如果調(diào)用進程沒有被調(diào)試,,有關(guān)調(diào)試的行為就不會產(chǎn)生。
  值:DETACHED_PROCESS
  含義:對于控制臺進程,,新進程沒有訪問父進程控制臺的權(quán)限,。新進程可以通過AllocConsole函數(shù)自己創(chuàng)建一個新的控制臺。這個標志不可以與CREATE_NEW_CONSOLE標志一起使用,。
  dwCreationFlags參數(shù)還用來控制新進程的優(yōu)先類,,優(yōu)先類用來決定此進程的線程調(diào)度的優(yōu)先級,。如果下面的優(yōu)先級類標志都沒有被指定,那么默認的優(yōu)先類是NORMAL_PRIORITY_CLASS,,除非被創(chuàng)建的進程是IDLE_PRIORITY_CLASS。在這種情況下子進程的默認優(yōu)先類是IDLE_PRIORITY_CLASS,。
  可以下面的標志中的一個:
  優(yōu)先級:HIGH_PRIORITY_CLASS 
  含義:指示這個進程將執(zhí)行時間臨界的任務(wù),,所以它必須被立即運行以保證正確。這個優(yōu)先級的程序優(yōu)先于正常優(yōu)先級或空閑優(yōu)先級的程序,。一個例子是 Windows任務(wù)列表,,為了保證當(dāng)用戶調(diào)用時可以立刻響應(yīng),放棄了對系統(tǒng)負荷的考慮,。確保在使用高優(yōu)先級時應(yīng)該足夠謹慎,,因為一個高優(yōu)先級的CPU關(guān)聯(lián)應(yīng)用程序可以占用幾乎全部的CPU可用時間。
  優(yōu)先級:IDLE_PRIORITY_CLASS 
  含義:指示這個進程的線程只有在系統(tǒng)空閑時才會運行并且可以被任何高優(yōu)先級的任務(wù)打斷,。例如屏幕保護程序,。空閑優(yōu)先級會被子進程繼承,。
  優(yōu)先級:NORMAL_PRIORITY_CLASS 
  含義:指示這個進程沒有特殊的任務(wù)調(diào)度要求,。
  優(yōu)先級:REALTIME_PRIORITY_CLASS 
  含義:指示這個進程擁有可用的最高優(yōu)先級。一個擁有實時優(yōu)先級的進程的線程可以打斷所有其他進程線程的執(zhí)行,,包括正在執(zhí)行重要任務(wù)的系統(tǒng)進程,。例如,一個執(zhí)行時間稍長一點的實時進程可能導(dǎo)致磁盤緩存不足或鼠標反映遲鈍,。
  lpEnvironment:指向一個新進程的環(huán)境塊,。如果此參數(shù)為空,新進程使用調(diào)用進程的環(huán)境,。
  一個環(huán)境塊存在于一個由以NULL結(jié)尾的字符串組成的塊中,,這個塊也是以NULL結(jié)尾的。每個字符串都是name=value的形式,。
  因為相等標志被當(dāng)作分隔符,,所以它不能被環(huán)境變量當(dāng)作變量名。
  與其使用應(yīng)用程序提供的環(huán)境塊,,不如直接把這個參數(shù)設(shè)為空,,系統(tǒng)驅(qū)動器上的當(dāng)前目錄信息不會被自動傳遞給新創(chuàng)建的進程。對于這個情況的探討和如何處理,,請參見注釋一節(jié),。
  環(huán)境塊可以包含Unicode或ANSI字符。如果lpEnvironment指向的環(huán)境塊包含Unicode字符,,那么 dwCreationFlags字段的CREATE_UNICODE_ENVIRONMENT標志將被設(shè)置,。如果塊包含ANSI字符,,該標志將被清空。
  請注意一個ANSI環(huán)境塊是由兩個零字節(jié)結(jié)束的:一個是字符串的結(jié)尾,,另一個用來結(jié)束這個快,。一個Unicode環(huán)境塊石油四個零字節(jié)結(jié)束的:兩個代表字符串結(jié)束,另兩個用來結(jié)束塊,。
  lpCurrentDirectory:指向一個以NULL結(jié)尾的字符串,,這個字符串用來指定子進程的工作路徑。這個字符串必須是一個包含驅(qū)動器名的絕對路徑,。如果這個參數(shù)為空,,新進程將使用與調(diào)用進程相同的驅(qū)動器和目錄。這個選項是一個需要啟動啟動應(yīng)用程序并指定它們的驅(qū)動器和工作目錄的外殼程序的主要條件,。
  lpStartupInfo:指向一個用于決定新進程的主窗體如何顯示的STARTUPINFO結(jié)構(gòu)體,。
  lpProcessInformation:指向一個用來接收新進程的識別信息的PROCESS_INFORMATION結(jié)構(gòu)體。
  返回值:
  如果函數(shù)執(zhí)行成功,,返回非零值,。
  如果函數(shù)執(zhí)行失敗,返回零,,可以使用GetLastError函數(shù)獲得錯誤的附加信息,。
  注釋:
  CreateProcess函數(shù)用來運行一個新程序。WinExec和LoadModule函數(shù)依舊可用,,但是它們同樣通過調(diào)用CreateProcess函數(shù)實現(xiàn),。
  另外CreateProcess函數(shù)除了創(chuàng)建一個進程,還創(chuàng)建一個線程對象,。這個線程將連同一個已初始化了的堆棧一起被創(chuàng)建,,堆棧的大小由可執(zhí)行文件的文件頭中的描述決定。線程由文件頭處開始執(zhí)行,。
  新進程和新線程的句柄被以全局訪問權(quán)限創(chuàng)建,。對于這兩個句柄中的任一個,如果沒有安全描述符,,那么這個句柄就可以在任何需要句柄類型作為參數(shù)的函數(shù)中被使用,。當(dāng)提供安全描述符時,在接下來的時候當(dāng)句柄被使用時,,總是會先進行訪問權(quán)限的檢查,,如果訪問權(quán)限檢查拒絕訪問,請求的進程將不能使用這個句柄訪問這個進程,。
  這個進程會被分配給一個32位的進程標識符,。直到進程中止這個標識符都是有效的。它可以被用來標識這個進程,,或在 OpenProcess函數(shù)中被指定以打開這個進程的句柄,。進程中被初始化了的線程一樣會被分配一個32位的線程標識符,。這個標識符直到縣城中止都是有效的且可以用來在系統(tǒng)中唯一標識這個線程。這些標識符在PROCESS_INFORMATION結(jié)構(gòu)體中返回,。
  當(dāng)在lpApplicationName或lpCommandLine參數(shù)中指定應(yīng)用程序名時,,應(yīng)用程序名中是否包含擴展名都不會影響運行,只有一種情況例外:一個以.com為擴展名的MS-DOS程序或Windows程序必須包含.com擴展名,。
  調(diào)用進程可以通過WaitForInputIdle函數(shù)來等待新進程完成它的初始化并等待用戶輸入,。這對于父進程和子進程之間的同步是極其有用的,因為 CreateProcess函數(shù)不會等待新進程完成它的初始化工作,。舉例來說,,在試圖與新進程關(guān)聯(lián)的窗口之前,,進程應(yīng)該先調(diào)用 WaitForInputIdle,。
  首選的結(jié)束一個進程的方式是調(diào)用ExitProcess函數(shù),因為這個函數(shù)通知這個進程的所有動態(tài)鏈接庫(DLLs)程序已進入結(jié)束狀態(tài),。其他的結(jié)束進程的方法不會通知關(guān)聯(lián)的動態(tài)鏈接庫,。注意當(dāng)一個進程調(diào)用ExitProcess時,這個進程的其他縣城沒有機會運行其他任何代碼(包括關(guān)聯(lián)動態(tài)鏈接庫的終止代碼),。
  ExitProcess, ExitThread, CreateThread, CreateRemoteThread,,當(dāng)一個進程啟動時(調(diào)用了CreateProcess的結(jié)果)是在進程中序列化進行的。在一段地址空間中,,同一時間內(nèi)這些事件中只有一個可以發(fā)生,。這意味著下面的限制將保留:
  *在進程啟動和DLL初始化階段,新的線程可以被創(chuàng)建,,但是直到進程的DLL初始化完成前它們都不能開始運行,。
  *在DLL初始化或卸下例程中進程中只能有一個線程。
  *直到所有的線程都完成DLL初始化或卸下后,,ExitProcess函數(shù)才返回,。
  在進程中的所有線程都終止且進程所有的句柄和它們的線程被通過調(diào)用CloseHandle函數(shù)終止前,進程會留在系統(tǒng)中,。進程和主線程的句柄都必須通過調(diào)用CloseHandle函數(shù)關(guān)閉,。如果不再需要這些句柄,最好在創(chuàng)建進程后立刻關(guān)閉它們,。
  當(dāng)進程中最后一個線程終止時,,下列的事件發(fā)生:
  *所有由進程打開的對象都會關(guān)閉。
  *進程的終止?fàn)顟B(tài)(由GetExitCodeProcess函數(shù)返回)從它的初始值STILL_ACTIVE變?yōu)樽詈笠粋€結(jié)束的線程的結(jié)束狀態(tài),。
  *主線程的線程對象被設(shè)置為標志狀態(tài),,供其他等待這個對象的線程使用。
  *進程對象被設(shè)置為標志狀態(tài),,供其他等待這個對象的線程使用,。
  假設(shè)當(dāng)前在C盤上的目錄是\MSVC\MFC且有一個環(huán)境變量叫做C:,,它的值是C:\MSVC\MFC,就像前面lpEnvironment中提到過的那樣,,這樣的系統(tǒng)驅(qū)動器上的目錄信息在CreateProcess函數(shù)的lpEnvironment參數(shù)不為空時不會被自動傳遞到新進程里,。一個應(yīng)用程序必須手動地把當(dāng)前目錄信息傳遞到新的進程中。為了這樣做,,應(yīng)用程序必須直接創(chuàng)建環(huán)境字符串,,并把它們按字母順序排列(因為Windows NT和Windows 95使用一種簡略的環(huán)境變量),并把它們放進lpEnvironment中指定的環(huán)境塊中,。類似的,,他們要找到環(huán)境塊的開頭,又要重復(fù)一次前面提到的環(huán)境塊的排序,。
  一種獲得驅(qū)動器X的當(dāng)前目錄變量的方法是調(diào)用GetFullPathName("x:",..),。這避免了一個應(yīng)用程序必須去掃描環(huán)境塊。如果返回的絕對路徑是X:\,,就不需要把這個值當(dāng)作一個環(huán)境數(shù)據(jù)去傳遞了,,因為根目錄是驅(qū)動器X上的新進程的默認當(dāng)前目錄。
  由CreateProcess函數(shù)返回的句柄對于進程對象具有PROCESS_ALL_ACCESS的訪問權(quán)限,。
  由lpcurrentDirectory參數(shù)指定的當(dāng)前目錄室子進程對象的當(dāng)前目錄,。lpCommandLine參數(shù)指定的第二個項目是父進程的當(dāng)前目錄。
  對于Windows NT,,當(dāng)一個進程在指定了CREATE_NEW_PROCESS_GROUP的情況下被創(chuàng)建時,,一個對于 SetConsoleCtrlHandler(NULL,True)的調(diào)用被用在新的進程上,這意味著對新進程來說CTRL+C是無效的,。這使得上層的外科程序可以自己處理CTRL+C信息并有選擇的把這些信號傳遞給子進程,。CTRL+BREAK依舊有效,并可被用來中斷進程/進程樹的執(zhí)行,。
  安全注釋:
  第一個參數(shù)lpApplicationName可能是空,,這種情況下,可執(zhí)行文件的名字必須在lpCommandLine 中,,lpCommandLine參數(shù)中可以包含空格,。如果可執(zhí)行文件或路徑中包含空格,那么就會有執(zhí)行不正確文件的風(fēng)險,,這是由于這個函數(shù)解析空格的方法引起的,。例如:下邊這個例子就很危險,因為它試圖運行Program.exe文件,,如果這個文件存在,,它就會代替MyApp.exe文件的運行。
  CreateProcess(NULL,,”C:\\Program Files\\MyApp.exe”,,…….)
  如果有惡意的用戶在系統(tǒng)編寫了一個名為Program.exe的文件,,那么任何調(diào)用CreateProcess函數(shù),且在文件路徑中使用Program Files文件夾的參數(shù),,都有可能會運行Program.exe文件,,而不是運行本來打算運行的文件。
  要避免這個問題,,可以不要將NULL值傳遞給lpApplicationName參數(shù),,或者在lpCommandLine中使用雙引號(轉(zhuǎn)義符)括起可執(zhí)行文件的全路徑名,如下所示:
  CreateProcess(NULL,”\”C:\\Program Files\\MyApp.exe\” -L -S”,…….)
  -L和-S是MyApp.exe可執(zhí)行文件的參數(shù),。
  最后要說明的一點是:在lpApplicationName中的參數(shù)和lpCommandLine中的第一個參數(shù)是一樣的,,有人說顯得有些重復(fù),其實這樣做純粹是一種被公認化了習(xí)慣,!
  參見
  AllocConsole, CloseHandle, CreateRemoteThread, CreateThread, ExitProcess, ExitThread, GenerateConsoleCtrlEvent, GetCommandLine, GetEnvironmentStrings, GetExitCodeProcess, GetFullPathName, GetStartupInfo, GetSystemDirectory, GetWindowsDirectory, LoadModule, OpenProcess, PROCESS_INFORMATION, ResumeThread, SECURITY_ATTRIBUTES, SetConsoleCtrlHandler, SetErrorMode, STARTUPINFO, TerminateProcess, WaitForInputIdle, WaitForDebugEvent, WinExec
  快捷信息:
  導(dǎo)入庫:kernel32.lib
  頭文件:Winbase.h 
  簡單例子:
  #include <iostream>
  #include<windows.h>
  using namespace std;
  int main()
  {
  TCHAR szCmdLine[]={TEXT("d:\\test\\te.exe")};//added by 江湖三腳貓 2009-4-28
  STARTUPINFO si; //一些必備參數(shù)設(shè)置
  memset(&si, 0, sizeof(STARTUPINFO)); 
  si.cb = sizeof(STARTUPINFO); 
  si.dwFlags = STARTF_USESHOWWINDOW; 
  si.wShowWindow = SW_SHOW; 
  PROCESS_INFORMATION pi; //必備參數(shù)設(shè)置結(jié)束
  //lpCommandLine不能寫成"d:\\test\\te.exe"常量形式 ,,改成 TCHAR szCmdLine[]={"d:\\test\\te.exe"}
  //lpCommandLine需要改成 TCHAR szCmdLine[]={TEXT("d:\\test\\te.exe")};
  if(!CreateProcess(NULL,szCmdLine/*"d:\\test\\te.exe"*/,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
  //if(!CreateProcess(NULL,"d:\\test\\te.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) //"d:\\test\\te.exe"是您要運行的程序//的路徑
  {
  cout<<"Create Fail!"<<endl;
  exit(1);
  }
  else
  {
  cout<<"Sucess!"<<endl;
  }
  return 0;
  }

區(qū)別:
功能上: createprocess   >   shellexecute   >   winexec   復(fù)雜程度也是!

winexec() 只用于可執(zhí)行文件,,是一個老函數(shù)啦,,雖然使用方便,,但不推薦,!(兼容性也不好)
shellexcute()是通過windows外殼打開任意文件,非可執(zhí)行文件自動通過關(guān)聯(lián)的程序打開對于可執(zhí)行文件,,區(qū)別不大,,不過shellexcute可以指定運行時的工作路徑

winexec() 必須有GetMessage或超時之后才返回!CreateProcess和ShellExecute都是直接返回的,!


本文來自CSDN博客,,轉(zhuǎn)載請標明出處:http://blog.csdn.net/duck04551/archive/2009/07/01/4312260.aspx

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多