Windows程序中带参数调用其他程序

主程序中带参数调用其他程序

1. 使用的API

typedef struct _SHELLEXECUTEINFOA {
  DWORD     cbSize;
  ULONG     fMask;
  HWND      hwnd;
  LPCSTR    lpVerb;
  LPCSTR    lpFile;
  LPCSTR    lpParameters;
  LPCSTR    lpDirectory;
  int       nShow;
  HINSTANCE hInstApp;
  void      *lpIDList;
  LPCSTR    lpClass;
  HKEY      hkeyClass;
  DWORD     dwHotKey;
  union {
    HANDLE hIcon;
    HANDLE hMonitor;
  } DUMMYUNIONNAME;
  HANDLE    hProcess;
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;

BOOL ShellExecuteExA(
  SHELLEXECUTEINFOA *pExecInfo
);

2. 示例

devconx64.exe
这个程序分为devconx64和devconx86,分别对应64位和32位系统环境。主要作用是对Windows的设备管理器中的设备进行操控,这里简单演示一下禁用USB大容量存储设备。从Windows的设备管理器中通用串口中找到“USB大容量存储设备”,右键属性,看到兼容ID是“usbstor\class_08”。然后调用方式如下:

SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = _T("open"); //open表示以主进程相同权限执行,runas表示以管理员权限执行
ShExecInfo.lpFile = _T("devconx64.exe");
ShExecInfo.lpParameters = _T("disable usbstor\\class_08"); // 注意这里因为转义的关系要使用双斜杠
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE; // SW_HIDE表示不显示调用界面,如需显示可改为SW_SHOW
ShExecInfo.hInstApp = NULL;

ShellExecuteEx(&ShExecInfo);
if (WaitForSingleObject(ShExecInfo.hProcess, INFINITE) == WAIT_OBJECT_0)
{ // 等待进程执行完成
    return TRUE;
}

3. 备注

  • 此API在Windows下使用应该是最安全最稳定的调用方式。
    如果使用此API调用CMD执行某种命令,执行完成之后需要自动关闭,切记在命令前加上"/c "
    否则可能会造成阻塞。
  • 此API会导致COM接口初始化失败,如果后续有需要初始化COM接口,请谨慎使用。

你可能感兴趣的:(Windows程序中带参数调用其他程序)