Win32 API (1) WinExec

WinExec

函數原型如下:

UINT WinExec(
  LPCSTR lpCmdLine,
  UINT   uCmdShow
);

該函數用於運行一個指定的應用程序,現在已經淘汰,僅用於保持對16位Windows操作系統的兼容,可以使用函數 CreateProcess 來代替。

參數說明:

lpCmdLine :運行程序所需的命令行參數(文件名+可選參數),若該參數中沒有包含可執行文件的路徑,將會自動按照下面順序搜索可執行文件:

  1. 應用程序被加載的目錄
  2. 當前目錄
  3. Windows系統目錄,該目錄可以通過 GetSystemDirectory 函數獲得
  4. Windows目錄,該目錄可以通過 GetWindowsDirectory 函數獲得
  5. 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", ...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章