文章目錄
- WinExec
- 作用
- 執行個體
- CreateProcess
- 作用
- 執行個體
- System
- ShellExecute和ShellExecuteEx
- ShellExecute
- ShellExecuteEx
- 差別
WinExec
微軟文檔 WinExec
作用
運作指定應用程式。
UINT WinExec(
[in] LPCSTR lpCmdLine,
[in] UINT uCmdShow
);
lpCmdLine
:指令行(檔案名+可選參數)為應用程式執行。
如果沒有包含檔案路徑将會從以下目錄按順序搜尋:
- 目錄的應用程式加載。
- 目前目錄。
- Windows系統目錄。
- GetSystemDirectory函數檢索該目錄的路徑。
- Windows目錄。
- GetWindowsDirectory函數檢索該目錄的路徑。
- 環境變量中列出的目錄路徑。
uCmdShow
:顯示選項。可接受的值的清單,請參閱nCmdShow的描述參數的顯示視窗函數。
具體值清單位址
SW_HIDE、SW_NORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED等
執行個體
隐藏控制台彈窗 執行vb彈窗腳本
WinExec("mshta vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)", SW_HIDE);
注意:
這個函數隻提供是為了與16位Windows相容。
應用程式應該使用CreateProcess函數。
CreateProcess
作用
執行個體
LPCSTR lpCmdLine = "mshta vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)";
UINT uCmdShow = 0;
PROCESS_INFORMATION pi;
STARTUPINFO si;
// 建立新程序
ZeroMemory(&si, sizeof(STARTUPINFO));
BOOL b = CreateProcess(NULL, const_cast<LPTSTR>(lpCmdLine), NULL,NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
if (!b) {
return FALSE;
}
// 阻塞調用者線程
WaitForSingleObject(pi.hProcess, INFINITE);
return TRUE;
System
System C++自帶的 會阻塞
ShellExecute和ShellExecuteEx
ShellExecute的功能是運作一個外部程式(或者是打開一個已注冊的檔案、打開一個目錄、列印一個檔案等等),并對外部程式有一定的控制。
ShellExecute
ShellExecute(NULL, "mshta", "vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)", NULL, NULL, SW_SHOW);
ShellExecuteEx
管理者運作
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = L"runas";
shExecInfo.lpFile = L"mshta.exe";
shExecInfo.lpDirectory = L"";
shExecInfo.lpParameters = L"vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)";
shExecInfo.lpClass = NULL;
shExecInfo.nShow = SW_HIDE;
shExecInfo.hInstApp = NULL;
DWORD err = ERROR_SUCCESS;
if (!ShellExecuteEx(&shExecInfo)) {
return GetLastError();
}
差別
c++ system()和WinExec()的差別
1.CreateProcess因為使用複雜,比較少用。
2.WinExec主要運作EXE檔案。如:WinExec(‘Notepad.exe Readme.txt’, SW_SHOW);
3.ShellExecute不僅可以運作EXE檔案,也可以運作已經關聯的檔案。
winExec是不同步的程序調用,就是調用起來了就傳回了,不會等調用起來的程式結束