文章目录
- 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是不同步的进程调用,就是调用起来了就返回了,不会等调用起来的程序结束
system是同步调用进程,调用进程不结束,它就不返回,它可以获取调用进程所返回的值










