怎樣加載其他的應用程式?
三個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);
或