程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> WinExec()和system()的區別

WinExec()和system()的區別

編輯:C++入門知識

WinExec()是一個WIN32 API,它的第一個參數必須包含一個可執行文件名,  System()是C庫函數,它接受一個DOS命令。 ShellExecute()和WinExec()區別 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 我認為從功能上: createprocess > shellexecute > winexec 復雜程度也是!   winexec() 只用於可執行文件,是一個老函數啦,雖然使用方便,但不推薦!(兼容性也不好)     shellexcute() 是通過windows外殼打開任意文件,非可執行文件自動通過關聯的程序打開  對於可執行文件,區別不大,不過shellexcute可以指定運行時的工作路徑   winexec() 必須有GetMessage或超時之後才返回!CreateProcess和ShellExecute都是直接返回的! InstallShield中的LaunchAppAndWait() LaunchAppAndWait 語法:LaunchAppAndWait (szProgram, szCmdLine, lWait); 說明:LaunchAppAndWait函數運行由szProgram指定的帶有szCmdLine指定的命令行參數的應用程序。第三個參數,lWait指示安裝在繼續前是否要等待直到運行的應用程序終止。   一個安裝程序只能監控由szProgram指定的應用程序;如果該應用程序要運行其它應用程序或進程,安裝程序不能監控它們。因此,安裝程序將在第一個應用程序結束後繼續,即使那時由第一個應用程序運行的其它應用程序仍在運行。注意如果運行的應用程序終止失敗,則安裝程序將無限等待運行的應用程序完成。 參數: szProgram 指定要被運行的應用程序的文件名。建議要指定應用程序的完整路徑和文件名。如果你不包括一個路徑,InstallShield將使用被Windows API 函數CreateProcess使用的相同的查找次序來定位文件。如果文件未能在這些位置找到,函數將失敗。   如果應用程序的全限定名包括長文件夾名和/或一個長文件名,在把szCommand傳遞給LaunchAppAndWait之前先把它傳遞給LongPathToQuote。 szCmdLine 指定傳遞給運行的應用程序的命令行參數。為運行沒有命令行參數的應用程序,傳遞一個空字符串。 lWait 指定安裝程序在繼續前是否要等待運行的應用程序終止。在該參數位置傳遞下列預定義常量之一: NOWAIT:指定安裝程序在運行應用程序後立即繼續,應用程序將和安裝程序腳本同時運行。注意使用該參數等效於調用函數LaunchApp。 WAIT:指定安裝程序必須等待直到由該函數運行的應用程序終止。 返回值: 1:表明應用程序成功運行。 < 0:表明應用程序未能運行。 注解: ·InstallShield 安裝程序使用函數CreateProcess。在InstallShield運行應用程序後,它查找裝入的應用程序的窗口句柄。如果它找到窗口句柄,則它在繼續前等待直到應用程序窗口消失。 ·安裝程序不能監控一個不創建窗口的應用程序。如果指定的應用程序沒有創建一個窗口,安裝程序在運行應用程序後立即繼續。注意應用程序的窗口不需要可見,但它必須存在,以便讓安裝程序等待。 ·一些應用程序試圖裝入DLLs並且當那些DLLs不能被定位時不能正確運行。為確保一個應用程序能找到它需要的DLLs,有必要在調用LaunchAppAndWait前改變到包含可執行應用程序的目錄。為改變當前目錄,調用ChangeDirectory函數。 ·如果運行的應用程序終止失敗,則安裝程序將無限等待運行的應用程序完成。 ·LaunchAppAndWait以一個全屏DOS窗口來運行DOS程序。為以一個不同類型的窗口來運行一個DOS程序,你必須直接調用Windows APIs。   ----------------------------------------------------------------------------------------------------------------------------------- 你可以這樣:  WinExec("command /C dir C:\ > dir.txt",SW_HIDE); system("dir >dir.txt") 1: UINT WinExec ( LPCSTR lpCmdLine , // address of command line         UINT uCmdShow   // window style for new application        );  Header File : winbase.h  詳細說明請參考 Win32 SDK Reference        第一個參數是程式名及參數;第二個參數用來指定目的程式被執行起來後如何顯示。    EX1: WinExec("Notepad.exe c:\\autoexec.bat",SW_SHOW); 執行 notepad.exe 並正常顯示其程式視窗      EX2: WinExec("Notepad.exe",SW_SHOWMINIMIZED); 執行 notepad.exe 但最小化其程式視窗      EX3: WinExec("Command.com /c dir c:\\",SW_SHOW); 執行 dir C:\ ,完成後關閉 MSDOS 視窗      EX4: WinExec("Command.com /k dir c:\\",SW_SHOW); 執行 dir C:\ ,完成後不關閉 MSDOS 視窗       注意:第一個參數雖然可用長檔名,但長檔名中如果有空格的話,有時候目的程式執行起來會發生錯誤,發生錯誤的原因是目的程式本身判斷輸入參數時疏忽了長檔名的關係,如果遇到這個情況時,要記得將程式名改為短檔名喔。        2: ShellExecute(HWND hwnd, // handle to parent window       LPCTSTR lpOperation, // pointer to string that specifies operation to perform      LPCTSTR lpFile, // pointer to filename or folder name string       LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters      LPCTSTR lpDirectory, // pointer to string that specifies default directory       INT nShowCmd // whether file is shown when opened       );  Head File : ShellApi.h  詳細說明請參考 Win32 SDK Reference ================== 使用WinExec命令   ⑴ 函數原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);   ⑵ 參數:   lpCmdLine:指向一個空結束的字符串,串中包含將要執行的應用程序的命令行(文件名加上可選參數)。   uCmdShow:定義Windows應用程序的窗口如何顯示,並為CreateProcess函數提供STARTUPINFO參數的wShowWindow成員的值。   ⑶ 返回值:   若函數調用成功,則返回值大於31。若函數調用失敗,則返回值為下列之一:   ① 0:系統內存或資源已耗盡。   ② ERROR_BAD_FORMAT:EXE文件無效(非Win32.EXE或.EXE影像錯誤)。   ③ ERROR_FILE_NOT_FOUND:指定的文件未找到。   ④ ERROR_PATH_NOT_FOUND:指定的路徑未找到。   雖然Microsoft認為WinExec已過時,但是在許多時候,簡單的WinExec函數仍是運行新程序的最好方式。簡單地傳送作為第一個參數的命令行,還需要決定如何顯示程序(該程序也許會忽視它)的第二個參數。通常,將其設置為SW_SHOW,也可嘗試SW_MINIMIZED或SW_MAXIMIZED。WinExec不允許用CreateProcess獲得的所有選項,而它的確簡單。   使用ShellExecute命令   ⑴ 函數原型: HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);   ⑵ 參數:   hwnd:指向父窗口的窗口句柄。此窗口接收應用程序產生的任何信息框。   lpOperation:一個空結束的字符串地址,此字符串指定要執行的操作。下面的操作字符串是有效的: "open " 此函數打開由參數lpFile指定的文件,此文件可以是一個可執行文件或文檔文件,也可是一個文件夾。  "print " 此函數打印由參數lpFile指定的文件,此文件應是一個文檔文件,假如此文件是一個可執行文件,則打開此文件。  "explore " 此函數搜索由參數lpFile指定的文件夾,此文件應是一個文檔文件,    此參數可以為空。這種情況下,函數用於打開由參數lpFile指定的文件。   lpFile:一個空結束的字符串地址,此字符串指定要打開或打印的文件或者是要打開或搜索的文件夾。   lpParameters:假如參數lpFile指定一個可執行文件,lpParameters則是一個空結束的字符串地址,此字符串指定要傳遞給應用程序的參數。假如lpFile指定一個文檔文件,lpParameters應為空。   lpDirectory:一個空結束的字符串地址,此字符串指定默認目錄。   nShowCmd:假如lpFile指定一個可執行文件,nShowCmd表明應用程序打開時如何顯示。假如lpFile指定一個文檔文件,nShowCmd應為空。   ⑶ 返回值:   若函數調用成功,則返回值大於32,否則為一個小於等於32的錯誤值。   說明:可以用此函數打開或搜索一個外殼文件夾。打開文件夾可用下面任何一種形式: ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);        或 ShellExecute(handle, "open ", path_to_folder, NULL, NULL, SW_SHOWNORMAL);   搜索文件夾,可用如下形式 ShellExecute(handle, "explore ", path_to_folder, NULL, NULL, SW_SHOWNORMAL);   ShellExecute命令雖已過時但易於得到。該命令向命令解釋程序提出打開、浏覽或打印文檔或文件夾的請求,雖然可以用ShellExecute運行程序,但通常只發送文檔名,而命令解釋程序則決定要運行那個程序。另外在打開目錄文件夾時,ShellExecute命令非常有用。   ⑷ 程序示例   下面通過一個例子來說名WinExec和ShellExecute的使用。下面程序有控制台程序示例,其使用兩種不同的方法,打開文本文件。下面程序使用WinExec,並明確指定使用記事本程序。然後,使用ShellExecute,打開文本文件。   程序清單 #include <windows.h >  #include <iostream.h > void main(int argc,char *argv[])  {   cout < <”Opening with WinExec\n”;   if (WinExec(“notepad readme.txt”,SH_SHOW) <32)    MessagBox(NULL,”Can’t WinExec”,NULL,MB_OK);    cout < <”Press Enter\n”;    MessagBox(NULL,”Press OK to continue”,”Progrm Launched”,MB_OK);    cout < <”Opening with ShellExecute\n”;   if (ShellExecute (NULL,”open”,”readme.txt”,NULL,NULL,SW_SHOW) <(HANDLE) 32)    MessagBox(NULL,”Can’t ShellExecute\n”,NULL,MB_OK);  } 使用CreateProcess命令   ⑴ 函數原型: 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  );   ⑵ 參數:   lpApplicationName:指向一個以空結尾的串,他指定了要執行的模塊   lpCommandLine:指向一個以空結尾的串,該串定義了要執行的命令行。   lpProcessAttributes:指向一個SECURITY_ATTRIBUTES結構,該結構決定了返回的句柄是否可被子進程繼承。   lpThreadAttributes:指向一個SECURITY_ATTRIBUTES結構,該結構決定了返回的句柄是否可被子進程繼承。   bInheritHandles,:表明新進程是否從調用進程繼承句柄。   dwCreationFlags:定義控制優先類和進程創建的附加標志。   lpEnvironment:指向一個新進程的環境塊。   lpCurrentDirectory:指向一個以空結尾的串,該串定義了子進程的當前驅動器和當前目錄。   lpStartupInfo:指向一個STARTUPINFO結構,該結構定義了新進程的主窗口將如何顯示。   lpProcessInformation:指向PROCESS_INFORMATION結構,該結構接受關於新進程的表示信息。   ⑶ 返回值:   若函數調用成功,則返回值不為0;若函數調用失敗,返回值為0。   ShellExecute和WinExec命令用於簡單的作業。如果要完全控制一個新進程,就必須調用CreateProcess。   在上述參數中,參數lpStartupInfo是STARTUPINFO結構。可以用來設置控台的標題,新窗口的的初始大小和位置,及重定向標准輸入和輸出。新程序通常可以忽略多數這些數據項,如果選擇那樣做的話。可以規定該結構體中的標志,已表明要設置的數據段。有時,不想設置任何信息,也必須傳遞一個有效的指針給空結構(確定設置大小到cb,及設置dwFlags成員為0)。參數lpProcessInformation返回進程和線程句柄,還包括進程和線程ID。這些句柄擁有在參數lpProcessAttributes和lpThreadAttributes中規定的訪問。   要注意,針對CreateProcess的一些參數對控制台應用程序是特定的,而其它參數則對各種應用程序有用。大多數情況下,並不一定要填入STARTUPINFO結構,但無論如何必須提供它。其返回值是布爾型的,而真正感興趣的返回值發生於作為參數傳送的結構中(PROCESS_INFORMATION)。CreateProcess返回該結構中的進程ID及其句柄,以及初始線程ID及其句柄。可以將ID發送到其它進程,或使用句柄來控制新進程。 函數名稱: system www.2cto.com 函數原型: int system(const char *command)  函數功能: 調用DOS命令  函數返回:  參數說明:  所屬文件: <stdlib.h > #include <stdlib.h >  #include <stdio.h >  int main()  {  system( "dir ");  return 0;  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved