有些時候,我們需要在一個應用程序中打開另外的應用程序,我這幾天就做了這樣的事,總結了一些東西,希望可以跟大家一起分享和交流一下。其中有可能有一些東西是錯誤的或者走了彎路,懇請大家能夠給我提意見!另外我這些天一直在學習多線程與多進程,期待找到一些共同進步的人!
閒話少說了,還是回答主題上面來。要在應用程序中啟動其他的應用程序,有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中的標記
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);
可以看出,通過上面的幾個不同的方法,都可以實現在應用程序中打開其他應用程序的目的,以上幾種方法可能有些會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!
最後,我希望大家可以多給我提提意見,因為我也是初學,有許多地方還不是很明白,有些方法可能是走彎路的,這就需要大家給我幫助了!