WinExec
函數原型如下:
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);
該函數用於運行一個指定的應用程序,現在已經淘汰,僅用於保持對16位Windows操作系統的兼容,可以使用函數 CreateProcess
來代替。
參數說明:
lpCmdLine
:運行程序所需的命令行參數(文件名+可選參數),若該參數中沒有包含可執行文件的路徑,將會自動按照下面順序搜索可執行文件:
- 應用程序被加載的目錄
- 當前目錄
- Windows系統目錄,該目錄可以通過
GetSystemDirectory
函數獲得 - Windows目錄,該目錄可以通過
GetWindowsDirectory
函數獲得 - PATH環境變量中指定的目錄
uCmdShow
:顯示方式,可以接受一系列預定義的值(SW宏),改參數和 ShowWindow
函數的 nCmdShow
參數含義一致。
返回值說明:
該函數如果成功運行,返回值大於31
該函數如果執行失敗,返回值是下面錯誤值中的一個:
返回值 | 說明 |
---|---|
0 | 系統資源或者內存已用完 |
ERROR_BAD_FORMAT | 無效的可執行文件 |
ERROR_FILE_NOT_FOUND | 找不到指定的文件 |
ERROR_PATH_NOT_FOUND | 找不到指定的路徑 |
注意事項:
該函數會在被運行的程序執行 GetMessage
函數時返回,否則會一直等待直到超時。
不當地使用該函數可能會導致安全問題,因爲該函數總是將第一個空白字符分隔的字符串當成可執行文件名,因此如果可執行文件路徑包含空格就會導致錯誤:
WinExec("C:\\Program Files\\MyApp", ...);
此時會運行應用程序 Program.exe,而不是 MyApp.exe。如果別用用心的人在系統目錄下創建了 Program.exe,則所有像上面那樣錯誤使用了該函數的應用程序都會運行 Program.exe。
可以使用 CreateProcess
來避免這個錯誤,也可以給包含空格的路徑添加引號:
WinExec("\"C:\\Program Files\\MyApp.exe\" -L -S", ...)