主程序中带参数调用其他程序
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接口,请谨慎使用。
网友评论