天天看點

[筆記]Windows 代碼執行指令行

文章目錄

  • ​​WinExec​​
  • ​​作用​​
  • ​​執行個體​​
  • ​​CreateProcess​​
  • ​​作用​​
  • ​​執行個體​​
  • ​​System​​
  • ​​ShellExecute和ShellExecuteEx​​
  • ​​ShellExecute​​
  • ​​ShellExecuteEx​​
  • ​​差別​​

WinExec

​​微軟文檔 WinExec​​

作用

運作指定應用程式。

UINT WinExec(
  [in] LPCSTR lpCmdLine,
  [in] UINT   uCmdShow
);      

​lpCmdLine​

​:指令行(檔案名+可選參數)為應用程式執行。

如果沒有包含檔案路徑将會從以下目錄按順序搜尋:

  1. 目錄的應用程式加載。
  2. 目前目錄。
  3. Windows系統目錄。
  4. GetSystemDirectory函數檢索該目錄的路徑。
  5. Windows目錄。
  6. GetWindowsDirectory函數檢索該目錄的路徑。
  7. 環境變量中列出的目錄路徑。

​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是不同步的程序調用,就是調用起來了就傳回了,不會等調用起來的程式結束

繼續閱讀