天天看點

基于Windows平台,C++ 如何調用exe程式

怎樣加載其他的應用程式?

三個SDK函數 winexec, shellexecute,createprocess可以使用。

WinExec最簡單,兩個參數,前一個指定路徑,後一個指定顯示方式.後一個參數值得說一下,比如泥用 SW_SHOWMAXMIZED方式去加載一個無最大化按鈕的程式,就是Neterm,calc等等,就不會出現正常的窗體,但是已經被加到任務清單裡了。

ShellExecute較WinExex靈活一點,可以指定工作目錄,下面的Example就是直接打開 c:/temp/1.txt,而不用加載與 txt檔案關聯的應用程式,很多安裝程式完成後都會打開一個視窗,來顯示Readme or Faq,我猜就是這麼作的啦. 

ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c://temp"),SW_SHOWMAXMIZED)

CreateProcess最複雜,一共有十個參數,不過大部分都可以用NULL代替,它可以指定程序的安全屬性,繼承資訊,類的優先級等等.來看個很簡單的Example: 

STARTUPINFO stinfo 

//啟動視窗的資訊 

PROCESSINFO procinfo //程序的資訊 

CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, 

NORMAL_PRIORITY_ 

CLASS,NULL,NULL, &stinfo,&procinfo)     

常用舉例:1、函數:system("C:/Program Files/Windows NT/hypertrm.exe" );2、調用 EXE 檔案有個比較簡單的方法就是這樣WinExec("c://windows//system32//cmd.exe",1);3、界面可以用MFC來做,可以做成菜單(或者按鈕)形式,還可以弄點背景圖檔在上面,調用打開EXE檔案的 方法最友善的就是使用ShellExecute函數,格式就是一樓所提到的那樣,<fully_qualified_path_to_folder>為你exe檔案所在路徑,例如:"X://XXX //XXX.exe ",另外該函數還能打開ie網頁和其他各種類型的檔案(txt,bmp,jpg,mp3,avi,wmv等等),隻要是系統能夠識别的都能打開ShellExecute(handle, "open", <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL); 

這個不可思議的函數就是:ShellExecute,取代了WinExec。你可以給它任何檔案的名字,它都能識别出來并打開它。例如:

ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);

用預設的位圖編輯器打開一個叫iloveu.bmp的位圖檔案,這個預設的位圖編輯器可能是Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。

有關ShellExecute的詳細用法資訊自己去參考有關資料吧,重要的是你知道了這個函數能打開任何檔案,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系統系統資料庫HKEY_CLASSES_ROOT中所有的内容,判斷啟動那一個執行程式,并且啟動一個新的執行個體或使用DDE将檔案名連到一打開的執行個體。然後,ShellExecute 傳回打開檔案的應用的執行個體句柄。

更奇妙的是ShellExecute不僅能打開機器上的檔案,還能打開Internet的站點位址。例如:ShellExecute(NULL, "open", "​​http://www.microsoft.com​​​ ", NULL, NULL, SW_SHOWNORMAL); 

這個代碼使你能通路微軟的首頁。當ShellExecute遇到檔案名前面的“http:”時,可以判斷出要打開的檔案是Web檔案,随之啟動 Internet Explorer 或者 Netscape Navigator 或者任何你使用的别的浏覽器打開檔案。ShellExecute還能識别其它協定,象FTP、GOPHER。甚至識别“mailto”,如果檔案名指向 “mailto:[email protected]”,它啟動電子郵件程式并打開一個待編輯的新郵件。總之,ShellExecute函數就是如此簡單地打開磁盤檔案和Internet檔案。如果将第二個參數“OPEN”改為“PRINT”或者“EXPLORE”,ShellExecute将能列印檔案和打開檔案夾。ShellExecute還有一個擴充函數ShellExecuteEx,所帶參數中有一個特殊的結構,功能更強,它的用法參見有關文檔。現在,你知道了ShellExecute的秘密,用它很容易增加一個連結到你的About對話框。不是嗎。

Q: 如何打開一個同系統程式相關連的文檔?ShellExecute(this->m_hWnd,"open","c://abc.txt","","",SW_SHOW );

Q: 如何打開一個網頁? 

ShellExecute(this->m_hWnd,"open","​​​http://www.google.com​​ ","","", SW_SHOW );

Q: 如何激活相關程式,發送EMAIL? 

ShellExecute(this->m_hWnd,"open","​​mailto:[email protected]​​ ","","", SW_SHOW );

Q: 如何用系統列印機列印文檔? 

ShellExecute(this->m_hWnd,"print","c://abc.txt","","", SW_HIDE);

Q: 如何用系統查找功能來查找指定檔案? 

ShellExecute(m_hWnd,"find","d://nish",NULL,NULL,SW_SHOW);

Q: 如何啟動一個程式,直到它運作結束? 

SHELLEXECUTEINFO ShExecInfo = {0};

ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;

ShExecInfo.hwnd = NULL;

ShExecInfo.lpVerb = NULL;

ShExecInfo.lpFile = "c://MyProgram.exe";

ShExecInfo.lpParameters = "";

ShExecInfo.lpDirectory = NULL;

ShExecInfo.nShow = SW_SHOW;

ShExecInfo.hInstApp = NULL;

ShellExecuteEx(&ShExecInfo);

WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

或: 

PROCESS_INFORMATION ProcessInfo; 

STARTUPINFO StartupInfo; //This is an [in] parameter

ZeroMemory(&StartupInfo, sizeof(StartupInfo));

StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field

if(CreateProcess("c://winnt//notepad.exe", NULL, 

     NULL,NULL,FALSE,0,NULL,

     NULL,&StartupInfo,&ProcessInfo))

     WaitForSingleObject(ProcessInfo.hProcess,INFINITE);

     CloseHandle(ProcessInfo.hThread);

     CloseHandle(ProcessInfo.hProcess);

else

{

     MessageBox("The process could not be started...");

}

Q: 如何顯示檔案或檔案夾的屬性? 

SHELLEXECUTEINFO ShExecInfo ={0};

ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;

ShExecInfo.hwnd = NULL;

ShExecInfo.lpVerb = "properties";

ShExecInfo.lpFile = "c://"; //can be a file as well

ShExecInfo.lpParameters = ""; 

ShExecInfo.lpDirectory = NULL;

ShExecInfo.nShow = SW_SHOW;

ShExecInfo.hInstApp = NULL; 

ShellExecuteEx(&ShExecInfo);