標籤:
本文轉自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html
目前知道三種方式:WinExec,ShellExecute ,CreateProcess,別人已經總結的很好了《vc中調用其他應用程式的方法(函數) winexec,shellexecute ,createprocess》,我全文轉載一下,另外後面加點自己的總結(黑體部分,除了標題)。三個SDK函數: WinExec,ShellExecute ,CreateProcess可以實現調用其他程式的要求,其中以WinExec最為簡單,ShellExecute比WinExec靈活一些,CreateProcess最為複雜。WinExec 兩個參數,前一個指定路徑,後一個指定顯示方式。ShellExecute 可以指定工作目錄,並且還可以尋找檔案的關聯直接開啟不用載入與檔案關聯的應用程式,ShellExecute還可以開啟網頁,啟動相應的郵件關聯發送郵件等等。CreateProcess 一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承資訊,類的優先順序等等。如果我們要得到足夠多的關於新的進程的資訊,控制新的進程的細節屬性,若要達到這些目的,我們就需要使用CreateProcess函數了。三個SDK函數( WinExec、ShellExec、CrateProcess )的文法:(一)WinExec這個函數最簡單,只有兩個參數,原型如下: UINT WinExec( LPCSTR lpCmdLine, // 命令路徑 UINT uCmdShow // 顯示方式 );使用方法如下:WinExec("Notepad.exe", SW_SHOW); // 開啟記事本WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式開啟Test.exe需要注意的是若用 SW_SHOWMAXMIZED 方式去載入一個無最大化按鈕的程式,譬如Neterm,Calc 等等,就不會出現正常的表單,但是已經被加到工作清單裡了。這個函數只能開啟exe檔案。需要的標頭檔:windows.h,winbase.h(前者是實驗出來,後者是msdn上說明),另外,這兩者的先後順序不能變。msdn上的說明:[url]http://msdn.microsoft.com/en-us/library/ms687393[/url](VS.85).aspx (二)ShellExecute原型如下: HINSTANCE ShellExecute( HWND hwnd, //父視窗控制代碼 LPCTSTR lpOperation, //操作, 開啟檔案 "edit","explore","open","find","print","NULL" LPCTSTR lpFile, //檔案名稱,前面可加路徑 LPCTSTR lpParameters, //參數 LPCTSTR lpDirectory, //預設資料夾 INT nShowCmd //顯示方式);使用方法如下:ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL); // 開啟C:\Test.txt 檔案ShellExecute(NULL, "open", "[url]http://www.google.com/[/url]", NULL, NULL, SW_SHOWNORMAL); // 開啟網頁[url]www.google.com[/url]ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 開啟目錄D:\C++ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL, SW_HIDE); // 列印檔案C:\Test.txtShellExecute不支援定向輸出。這個函數可以開啟任意檔案,會調用系統註冊的程式來開啟對應尾碼名的檔案。需要的標頭檔:windows.h,shellapi.h(前者是我實驗出來的,後者是msdn說需要的)。另外這兩者的先後順序不能變。msdn上說明:[url]http://msdn.microsoft.com/en-us/library/bb762153[/url](VS.85).aspx (三)CreateProcess原型如下: BOOL CreateProcess( LPCTSTR lpApplicationName, //執行程式名 LPTSTR lpCommandLine, // 參數行 //下面兩個參數描述了所建立的進程和線程的安全屬性,如果為NULL則使用預設的安全屬性 LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes BOOL bInheritHandles, // 繼承標誌 DWORD dwCreationFlags, // 建立標誌 LPVOID lpEnvironment, // 環境變數 LPCTSTR lpCurrentDirectory, // 運行該進程的初始目錄 LPSTARTUPINFO lpStartupInfo, // 用於在建立子進程時設定各種屬性 LPPROCESS_INFORMATION lpProcessInformation //用於在進程建立後接受相關資訊 );使用方法如下: PROCESS_INFORMATION pi; STARTUPINFO si; memset(&si,0,sizeof(si)); si.cb=sizeof(si); si.wShowWindow=SW_SHOW; si.dwFlags=STARTF_USESHOWWINDOW; bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);這個函數可以開啟任意檔案,會調用系統註冊的程式來開啟對應尾碼名的檔案。需要的標頭檔:windows.h,winbase.h(前者是實驗出來,後者是msdn上說明),另外,這兩者的先後順序不能變。msdn上的說明:[url]http://msdn.microsoft.com/en-us/library/ms682425[/url](VS.85).aspx可以看出,通過上面的幾個不同的方法,都可以實現在應用程式中開啟其他應用程式的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!關於三個SDK函數: WinExec, ShellExecute,CreateProcess 的其他注意事項:1、定義標頭檔原作者的內容刪去。這個是引用新函數都必須注意的內容。但是MS的標頭檔引用順序有點怪,比如上面的三種清理。另外,如果用了先行編譯,那麼記得在任何來源程式中的#include “stdafx.h”之前的引用都會失效,從其後才生效。(不可否認,先行編譯有他的好處,尤其當程式很大的時候,但是任何好處都是要付出代價的)2、定義路徑C++中所表示的路徑要用 " \\ "而不是平常所用的" \ ",所以以上三個函數表示路徑都為:Disk:\\Directory\\...\\File nameWinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi)3、注意檔案的路徑在程式a調用程式b的時候,b原來的預設的當前路徑都會變成a的當前路徑。所以,一定要注意。可以養成使用絕對路徑的習慣,另外,記得開啟檔案之類的操作,一定要驗證是否有錯。
[轉]VC中調用外部exe程式方式