美文网首页
Windows程序中带参数调用其他程序

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

作者: Virtualer | 来源:发表于2019-08-27 16:29 被阅读0次

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

    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程序中带参数调用其他程序

          本文链接:https://www.haomeiwen.com/subject/soieectx.html