三個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 等等,就不會出現正常的 表單,但是已經被加到工作清單裡了。
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", "http://www.google.com",/
NULL, NULL, SW_SHOWNORMAL); // 開啟網頁www.google.com
ShellExecute(NULL,"explore", "D://C++",NULL,NULL,SW_SHOWNORMAL); // 開啟目錄D:/C++
ShellExecute(NULL,"print","C://Test.txt",NULL,NULL, SW_HIDE); // 列印檔案C:/Test.txt
ShellExecute不支援定向輸出。
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);
可以看出,通過上面的幾個不同的方法,都可以實現在應用程式中開啟其他應用程式的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!
關於三個SDK函數: WinExec, ShellExecute,CreateProcess 的其他注意事項:
1、定義標頭檔
在標頭檔stdafx.h中必須定義以下兩個標頭檔:
#include <shlobj.h> // 可替換為 windows.h
#include <shellapi.h>
如果定義了標頭檔 #include <windows.h>的話就不必定義 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它還定義了許多資料類型,如果沒有這些資料類型,shellapi.h本身會出錯。
2、定義路徑
C++中所表示的路徑要用 " // "而不是平常所用的" / ",所以以上三個函數表示路徑都為:
Disk://Directory//...//File name
WinExec("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);