天天看點

Windows API調用外部程式

要在應用程式中啟動其他的應用程式,有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);

  可以看出,通過上面的幾個不同的方法,都可以實作在應用程式中打開其他應用程式的目的,以上幾種方法可能有些會麻煩一點,是以就需要我們根據不同的目的去選擇最适合自己的方法去實作自己的目的!

繼續閱讀