天天看點

MFC筆記 啟動其他外部exe程式實作

windows環境,要實作如圖所示的功能,在自己開發的程式中啟動其他的應用程式。

MFC筆記 啟動其他外部exe程式實作

該功能的實作中,可以使用兩種方式:

函數一:WinExec

該函數隻提供對16位機子的相容。應用程式應該使用CreateProcess函數。 Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long 說明 運作指定的程式 傳回值 Long,大于31表示成功,請參考 FindExecutable函數 參數表 參數 類型及說明 lpCmdLine String,包含要執行的指令行 nCmdShow Long,定義了以怎樣的形式啟動程式的常數值。參考ShowWindow函數的nCmdShow參數 注解 請參考對CreateProcess函數的說明,了解在目錄中查找指定檔案的順序 VC中如何使用 WINSHELLAPI void WINAPI WinExecErrorA(HWND hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle); WINSHELLAPI void WINAPI WinExecErrorW(HWND hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle); 參數說明: hwnd, 視窗句柄,一般為NULL。 error,出錯資訊。 lpstrFileName 檔案名。 lpstrTitle 标題名。 使用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:指定的路徑未找到。 大于 31 {調用成功} 等于 0 { 記憶體不足 } ERROR_FILE_NOT_FOUND = 2; {檔案名錯誤} ERROR_PATH_NOT_FOUND = 3; {路徑名錯誤} ERROR_BAD_FORMAT = 11; {EXE 檔案無效} //uCmdShow 參數可選值: SW_HIDE = 0; {隐藏, 并且 工作列也沒有最小化圖示} 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}

函數二:ShellExecute

功能是運作一個外部程式(或者是打開一個已注冊的檔案、打開一個目錄、列印一個檔案等等),并對外部程式有一定的控制。

注意事項:使用該函數時,需添加該頭檔案: [1] #include <shellapi.h> ShellExecute函數原型及參數含義如下: ShellExecute( hWnd: HWND; {指定父視窗句柄} Operation: PChar; {指定動作, 譬如: open、runas、print、edit、explore、find [2] } FileName: PChar; {指定要打開的檔案或程式} Parameters: PChar; {給要打開的程式指定參數; 如果打開的是檔案這裡應該是 nil} Directory: PChar; {預設目錄} ShowCmd: Integer {打開選項} ): HINST; ShowCmd 參數可選值:SW_HIDE = 0; {隐藏} 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} 傳回值:

執行成功會傳回 應用程式句柄 傳回的HINSTANCE可以将它轉換為一個整數(%d),并比較它的值大于還是小于32或比較它的錯誤代碼 傳回值大于32表示執行成功 傳回值小于32表示執行錯誤 傳回值可能的錯誤有: = 0 { 記憶體不足} ERROR_FILE_NOT_FOUND = 2; {檔案名錯誤} ERROR_PATH_NOT_FOUND = 3; {路徑名錯誤} ERROR_BAD_FORMAT = 11; {EXE 檔案無效} SE_ERR_SHARE = 26; {發生共享錯誤} SE_ERR_ASSOCINCOMPLETE = 27; {檔案名不完全或無效} SE_ERR_DDETIMEOUT = 28; {逾時} SE_ERR_DDEFAIL = 29; {DDE 事務失敗} SE_ERR_DDEBUSY = 30; {正在處理其他 DDE 事務而不能完成該 DDE 事務} SE_ERR_NOASSOC = 31; {沒有相關聯的 應用程式} 例子: //調用電腦 ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL); //調用 記事本 ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL); ●hWnd:用于指定父 視窗句柄。當 函數調用過程出現錯誤時,它将作為Windows消息視窗的父視窗。例如,可以将其設定為 應用程式主 視窗句柄,即Application.Handle,也可以将其設定為 桌面視窗句柄(用GetDesktopWindow函數獲得)。 ●Operation:用于指定要進行的操作。其中“open”操作表示執行由FileName參數指定的程式,或打開由FileName參數指定的檔案或檔案夾;“print”操作表示列印由FileName參數指定的檔案;“explore”操作表示浏覽由FileName參數指定的檔案夾。當參數設為nil時,表示執行預設操作“open”。 ●FileName:用于指定要打開的檔案名、要執行的程式檔案名或要浏覽的檔案夾名。 ●Parameters:若FileName參數是一個可執行程式,則此參數指定 指令行參數,否則此參數應為nil或PChar(0)。 ●Directory:用于指定預設目錄。 ●ShowCmd:若FileName參數是一個可執行程式,則此參數指定程式視窗的初始顯示方式,否則此參數應設定為0。 若ShellExecute 函數調用成功,則傳回值為被執行程式的執行個體句柄。若傳回值小于32,則表示出現錯誤。 上述僅僅是ShellExecute函數的标準用法,下面将介紹它的特殊用法。 特殊用法: 如果将FileName參數設定為“http:”協定格式,那麼該函數将打開預設 浏覽器并連結到指定的URL位址。若使用者機器中安裝了多個 浏覽器,則該函數将根據Windows 9x/NT系統資料庫中http協定處理程式(Protocols Handler)的設定确定啟動哪個浏覽器。 格式一:http://網站域名 如:ShellExecute(Handle, "open", "http:// ; www.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL); 格式二:http://網站域名/網頁檔案名 如:ShellExecute(Handle, "open"," http:// ; www.neu.edu.cn/default.htm",NULL,NULL, SW_SHOWNORMAL); 如果将FileName參數設定為“mailto:”協定格式,那麼該函數将啟動預設郵件客戶程式,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若使用者機器中安裝了多個郵件客戶程式,則該函數将根據Windows 9x/NT系統資料庫中mailto協定處理程式的設定确定啟動哪個郵件客戶程式。 格式一:mailto 如:ShellExecute(Handle,"open", "mailto:", NULL, NULL, SW_SHOWNORMAL);打開新郵件視窗。 格式二:mailto:使用者賬号@郵件伺服器位址 如:ShellExecute(Handle, "open"," mailto:[email protected]", NULL, NULL, SW_SHOWNORMAL);打開新郵件視窗,并自動填入收件人位址。若指定多個收件人位址,則收件人位址之間必須用分号或逗号分隔開(下同)。 格式三:mailto:使用者賬号@郵件伺服器位址 subject=郵件主題&body=郵件正文 如:ShellExecute(handle, ‘open’, ‘ mailto:[email protected]?subject=Hello&Body=This is a test’,NULL, NULL, SW_SHOWNORMAL);打開新郵件視窗,并自動填入收件人位址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行 轉義字元%0a。 例子(delphi): 在一個 應用程式調用c:\Project1.exe; ShellExecute(handle, 'open',"c:\Project1.exe",'字串内容',NULL, SW_SHOWNORMAL); 在Project1.exe裡可以調用: procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i:=1 to paramcount do if ParamStr(i)<>'' then showmessage(ParamStr(i)); end; 最後的那個參數,為視窗指定可視性方面的一個指令。 請用下述任何一個常數 SW_HIDE 隐藏視窗,活動狀态給另一個視窗 SW_MINIMIZE 最小化視窗,活動狀态給另一個視窗 SW_RESTORE 用原來的大小和位置顯示一個視窗,同時令其進入活動狀态 SW_SHOW 用目前的大小和位置顯示一個視窗,同時令其進入活動狀态 SW_SHOWMAXIMIZED 最大化視窗,并将其激活 SW_SHOWMINIMIZED 最小化視窗,并将其激活 SW_SHOWMINNOACTIVE 最小化一個視窗,同時不改變 活動視窗 SW_SHOWNA 用目前的大小和位置顯示一個視窗,不改變 活動視窗 SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個視窗,同時不改變 活動視窗 SW_SHOWNORMAL 與SW_RESTORE相同

具體代碼如下所示:

void CNniceDlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	WinExec(_T("D:\\soft\\Qvod\\QvodPlayer\\QvodPlayer.exe"),SW_SHOWMAXIMIZED);
}

void CNniceDlg::OnQQ() 
{
	// TODO: Add your control notification handler code here
	ShellExecute(NULL,_T("open"),_T("QQProtect.exe"),NULL,_T("D:\\soft\\tencent\\QQProtect\\Bin\\"),SW_SHOWNORMAL);
}

void CNniceDlg::OnMatlab() 
{
	// TODO: Add your control notification handler code here
	WinExec(_T("D:\\soft\\matlab\\bin\\matlab.exe"),SW_SHOWMAXIMIZED);
}


void CNniceDlg::OnVC6() 
{
	// TODO: Add your control notification handler code here
	WinExec(_T("C:\\Program Files\\Microsoft Visual Studio\\COMMON\\MSDev98\\Bin\\MSDEV.EXE"),SW_SHOWMAXIMIZED);
}

void CNniceDlg::OnPhotoshopCs6() 
{
	// TODO: Add your control notification handler code here
	WinExec(_T("D:\\soft\\photoshop\\Adobe Photoshop CS6\\Photoshop.exe"),SW_SHOWMINIMIZED);	
}

void CNniceDlg::OnVS2012() 
{
	// TODO: Add your control notification handler code here
	WinExec(_T("D:\\soft\\Visual Studio2012\\Common7\\IDE\\devenv.exe"),SW_SHOWNORMAL);
}