【发布时间】:2021-11-01 20:56:31
【问题描述】:
当 COM 通过 CoCreateInstance() 使用从 ProgId 派生的 CLSID(例如“Excel.Application”)启动进程外服务器时,这究竟是如何发生的?
当 COM 启动新的 Excel 服务器(如果尚未运行)时,excel.exe 进程在后台(任务管理器窗口的下部),并且 UI 无法访问。我想复制这个。
我试过这个简单的代码:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
string strApp{"C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE"};
string strParams{"/automation /x"};
HINSTANCE hs = ShellExecuteA(NULL, "open", strApp.c_str(), strParams.c_str(), NULL, SW_HIDE);
}
但在前台弹出 Excel。
COM 调用什么 Win32 API 来在后台启动 Excel?
【问题讨论】:
-
为什么要添加“/x”?如果您使用 Process Explorer 之类的工具,您可以看到启动程序的确切命令行。另外,您使用
ShellExecute()而不是CreateProcess()是否有原因?CreateProcess()会返回更多有用的信息。 -
@JosephWillcoxson 很高兴你问我这个问题!如果我不使用“/x”(强制 Excel 启动新实例的开关),那么它会激活一个已经在运行的 Excel 会话:我不希望这样。我使用 ShellExecute 只是因为它比尝试为包含 SW_HIDE 的 CreateProcess 构建结构更简单。基本上我正在尝试将 Excel 作为“私人”服务器访问,它不会干扰或被其他用户操作干扰。