1. 程式人生 > >呼叫ShellExecute給定引數呼叫exe或bat

呼叫ShellExecute給定引數呼叫exe或bat

函式原型:

HINSTANCE ShellExecute(
  _In_opt_ HWND    hwnd,//父視窗控制代碼或出錯時顯示錯誤父視窗的控制代碼,可以為 NULL
  _In_opt_ LPCTSTR lpOperation,//操作
  _In_     LPCTSTR lpFile,//要開啟的檔名、執行的程式名、瀏覽的資料夾等。
  _In_opt_ LPCTSTR lpParameters,//可執行程式的引數,否則為 NULL
  _In_opt_ LPCTSTR lpDirectory,//預設目錄
  _In_     INT     nShowCmd//顯示型別
);

lpOperation 是一個字串,通常為:

    edit 用編輯器開啟 lpFile 指定的文件,如果 lpFile 不是文件,則會失敗
    explore 瀏覽 lpFile 指定的資料夾
    find 搜尋 lpDirectory 指定的目錄
    open 開啟 lpFile 檔案,lpFile 可以是檔案或資料夾
    print 列印 lpFile,如果 lpFile 不是文件,則函式失敗
    properties 顯示屬性
    runas 請求以管理員許可權執行,比如以管理員許可權執行某個exe
    NULL 執行預設”open”動作

nShowCmd 執行操作之後程式顯示型別,指定該引數後執行起來的程式不一定能按照指定引數顯示,只是通知程式的顯示狀態。型別如下:

    SW_HIDE 隱藏視窗,活動狀態給令一個視窗
    SW_MINIMIZE 最小化視窗,活動狀態給令一個視窗
    SW_RESTORE 用原來的大小和位置顯示一個視窗,同時令其進入活動狀態
    SW_SHOW 用當前的大小和位置顯示一個視窗,同時令其進入活動狀態
    SW_SHOWMAXIMIZED 最大化視窗,並將其啟用
    SW_SHOWMINIMIZED 最小化視窗,並將其啟用
    SW_SHOWMINNOACTIVE 最小化一個視窗,同時不改變活動視窗
    SW_SHOWNA 用當前的大小和位置顯示一個視窗,不改變活動視窗
    SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個視窗,同時不改變活動視窗
    SW_SHOWNORMAL 與SW_RESTORE相同

返回值為被執行程式的例項控制代碼。若返回值小於32,則表示出現錯誤。錯誤如下:

    0 系統記憶體或資源不足
    ERROR_FILE_NOT_FOUND 找不到指定的檔案
    ERROR_PATH_NOT_FOUND 找不到指定路徑
    ERROR_BAD_FORMAT .exe檔案無效
    SE_ERR_ACCESSDENIED 拒絕訪問指定檔案
    SE_ERR_ASSOCINCOMPLETE 檔名關聯無效或不完整
    SE_ERR_DDEBUSY DDE事務正在處理,DDE事務無法完成
    SE_ERR_DDEFAIL DDE事務失敗
    SE_ERR_DDETIMEOUT 請求超時,無法完成DDE事務請求
    SE_ERR_DLLNOTFOUND 未找到指定dll
    SE_ERR_FNF 未找到指定檔案
    SE_ERR_NOASSOC 未找到與給的檔案拓展名關聯的應用程式,比如列印不可列印的檔案等
    SE_ERR_OOM 記憶體不足,無法完成操作
    SE_ERR_PNF 未找到指定路徑
    SE_ERR_SHARE 發生共享衝突

示例程式碼[To shut down IceBox, use iceboxadmin]:
int ret = (int)ShellExecuteA(NULL, "open", "iceboxadmin.exe  ", " --Ice.Config=config.icebox shutdown", NULL, SW_NORMAL);
 cout << "ErrorCode : " << GetLastError() << endl;