ShellExecute和ShellExecuteEx函數(shù)主要用于執(zhí)行應(yīng)用程序,它們可以接收一個文件名并能自動獲得同文件名相關(guān)的可執(zhí)行文件名。此
外,它們還支持系統(tǒng)安全認證。如果在NT上設(shè)定了用戶的可執(zhí)行權(quán)限,ShellExecute和ShellExecuteEx函數(shù)將會在創(chuàng)建新的進程前檢查權(quán)限CreateProcess和WinExec函數(shù)則沒有這項功能)。函數(shù)調(diào)用的流程如下:
- 獲得將要執(zhí)行的程序名,例如test.exe。
- 根據(jù)程序名檢查用戶權(quán)限,如果該用戶無權(quán)操作,拒絕之。
- 激活全部已注冊的IshellExecuteHook擴展。
- 當所有擴展和權(quán)限都同意執(zhí)行,準備創(chuàng)建新的進程。
- 在注冊表中查詢程序,查找路徑為:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\windows\CurrentVersion\App Paths\程序名,在該項下找程序的啟動路徑,如果找到,啟動并返回;如果沒找到,進入步驟6。
- 根據(jù)ShellExecute的設(shè)置的目錄參數(shù)查找,如果存在程序,啟動并返回;否則返回失敗。
步驟5和6是我再查找一個程序運行錯誤時發(fā)現(xiàn)的。
原來程序之前安裝過一次,后來更改啟動策略,不再獨立安裝而采用綠色包,結(jié)果程序中用ShellExecute啟動程序時不對,查找分析之后發(fā)現(xiàn)是調(diào)用了錯誤的程序,卸載之前安裝的就正常了。
誤打誤撞,盡然發(fā)現(xiàn)之前對這兩個函數(shù)理解太過膚淺,網(wǎng)上查了查,發(fā)現(xiàn)都沒有人介紹,我這里再補充我發(fā)現(xiàn)的2點,告誡自己以后不到萬不得已,不要使用這兩個函數(shù)啟動自己的應(yīng)用程序。