【问题标题】:How to start a Win32 GUI application as a background process?如何将 Win32 GUI 应用程序作为后台进程启动?
【发布时间】: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 作为“私人”服务器访问,它不会干扰或被其他用户操作干扰。

标签: c++ excel winapi com


【解决方案1】:

Command-line switches for Microsoft Office products

/e/embed

防止出现 Excel 启动屏幕和打开新的空白工作簿。

例子

excel.exe /e

【讨论】:

  • 到目前为止,这可以满足我的需要。非常感谢。我在列表中看到了这个开关,并认为它只是隐藏了启动屏幕并避免了空白工作簿。它取代了“/x”。我的计划是使用我自己的 xla 作为启动文件启动 Excel,这将打开一个具有特定名称的新工作簿。然后我可以从 ROT 访问该工作簿名字对象,并从那里获取应用程序对象指针。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2017-09-15
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多