要在應用程式中啟動其他的應用程式,有3個函數可以使用,下面我一一說說他們(我以開啟D:\Program Files\zeecalls\目錄下的zeecalls.exe應用程式為例):
1、Winexec
這個函數最簡單,只有兩個參數,原型如下:
UINT WinExec(
LPCSTR lpCmdLine, // address of command line
UINT uCmdShow // window style for new application
);
使用方法如下:
WinExec(_T("D:\\Program Files\\zeecalls\\zeecalls.exe"),SW_SHOWMAXIMIZED);
這句話將會以最大化的方式開啟zeecalls.exe,需要注意的是,在VC中,‘/’需要以‘//’來寫。
2、ShellExecute
shellExecute比WinExex靈活一點,所以參數就要多一點,原型如下:
HINSTANCE ShellExecute(
HWND hwnd, //父視窗控制代碼
LPCTSTR lpOperation,//開啟檔案
LPCTSTR lpFile, //待開啟的檔案名稱
LPCTSTR lpParameters, LPCTSTR lpDirectory,//檔案路徑
INT nShowCmd );
同樣,我們也可以通過這個函數來開啟我們需要的檔案:
ShellExecute(NULL,_T("open"),_T("zeecalls.exe"),NULL,_T("D:\\Program Files\\zeecalls\\"),SW_SHOWNORMAL);
這句話是以用正常的顯示方式開啟zeecalls.exe
3、CreateProcess
上面的幾種方式都實現了我們在自己的應用程式中開啟其他的應用程式的目的,但是,我們沒有得到足夠多的關於新的進程的資訊,也沒有使用過多的手段去控制新的進程的細節屬性,所以,如果要達到這些目的,我們就需要使用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 //用於在進程建立後接受相關資訊
);
在上面的參數中,使用了兩個比較重要的資料結構:STARTUPINFO和PROCESS_INFORMATION。這兩個結構的定義分別如下:
typedef struct _STARTUPINFO { // si
DWORD cb; //結構長度
LPTSTR lpReserved; //保留
LPTSTR lpDesktop; //保留
LPTSTR lpTitle; //如果為控制台進程則為顯示的標題
DWORD dwX; //視窗橫座標
DWORD dwY; //視窗叢座標
DWORD dwXSize; //視窗寬度
DWORD dwYSize; //視窗高度
DWORD dwXCountChars; //控制台視窗字元號寬度
DWORD dwYCountChars; //控制台視窗字元號高度
DWORD dwFillAttribute; //控制台視窗填充模式
DWORD dwFlags; //建立標記
WORD wShowWindow; //視窗顯示標記,如同ShowWindow中的標記
3、CreateProcess
上面的幾種方式都實現了我們在自己的應用程式中開啟其他的應用程式的目的,但是,我們沒有得到足夠多的關於新的進程的資訊,也沒有使用過多的手段去控制新的進程的細節屬性,所以,如果要達到這些目的,我們就需要使用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 //用於在進程建立後接受相關資訊
);
在上面的參數中,使用了兩個比較重要的資料結構:STARTUPINFO和PROCESS_INFORMATION。這兩個結構的定義分別如下:
typedef struct _STARTUPINFO { // si
DWORD cb; //結構長度
LPTSTR lpReserved; //保留
LPTSTR lpDesktop; //保留
LPTSTR lpTitle; //如果為控制台進程則為顯示的標題
DWORD dwX; //視窗橫座標
DWORD dwY; //視窗叢座標
DWORD dwXSize; //視窗寬度
DWORD dwYSize; //視窗高度
DWORD dwXCountChars; //控制台視窗字元號寬度
DWORD dwYCountChars; //控制台視窗字元號高度
DWORD dwFillAttribute; //控制台視窗填充模式
DWORD dwFlags; //建立標記
WORD wShowWindow; //視窗顯示標記,如同ShowWindow中的標記
WORD cbReserved2; //保留參數
LPBYTE lpReserved2; //保留參數
HANDLE hStdInput; //標準輸入控制代碼
HANDLE hStdOutput; //標準輸出控制代碼
HANDLE hStdError; //標準錯誤控制代碼
} STARTUPINFO, *LPSTARTUPINFO;
typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess; //進程控制代碼
HANDLE hThread; //進程的主線程控制代碼
DWORD dwProcessId; //進程的ID
DWORD dwThreadId; //進程的主線程ID
} PROCESS_INFORMATION;
作為例子,我們來看看如何使用CreateProcess來開啟相同的檔案:
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:\\Program Files\\zeecalls\\zeecalls.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
可以看出,通過上面的幾個不同的方法,都可以實現在應用程式中開啟其他應用程式的目的,以上幾種方法可能有些會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!