【问题标题】:How to make COM object's method be run not in main thread如何使 COM 对象的方法不在主线程中运行
【发布时间】:2011-07-11 06:14:01
【问题描述】:

我有一个实现 COM 本地服务器的 Windows 服务。

当作为应用程序运行时,COM 对象方法在一个单独的(不是在主线程中)调用,这很好。作为服务运行时情况会发生变化 - 然后在服务线程的上下文中调用 COM 对象方法,这对我来说并不酷。

我发现它与公寓、MTA、STA 等有关。但我不知道如何强制 COM 在单独的线程中而不是在服务线程中调用我的对象方法。

这可能与服务启动时注册 com 对象有关吗?

我的环境是 windows 7 + delphi,但欢迎使用 c++ 解决方案。

2011-04-26 更新
感谢@sharptooth 和@Chris Dickson,他们让我在“消息循环”的方向上搜索解决方案。

因为它是 STA,所以应用程序依赖消息泵将 COM 消息传递到注册 coclass 的线程。我将 coclass 的注册重新定位到具有消息循环的单独线程中,并且所有 com 调用现在都在该线程中执行。我之前尝试过这种方法,但忘记了消息循环,所以这是拼图中缺失的部分。谢谢大家!

【问题讨论】:

  • 您是否运行消息循环来分派请求?
  • 请您澄清一下“作为应用程序运行时”和“作为服务运行时”之间的区别以及在这两种情况下客户端调用是否来自不同进程的含义。另外,当您注册 COM coclass 时,您指定的是什么公寓模型?
  • @sharptooth: 服务线程有消息循环
  • @Chris Dickson:我能够将 exe 作为应用程序和服务运行 - 在第一种情况下,它在当前用户的会话中运行,即用户手动执行它,在第二种情况它作为由“net start”启动的系统运行。该模型由 Delphi VCL 自动设置为 STA。我在主/服务线程中注册了 coclass(分别作为应用程序/服务运行时)。调用来自外部测试应用程序 (exe)。

标签: windows delphi com service


【解决方案1】:

这些对象将在您注册它们的任何线程上被调用。如果您希望在单独的单元 (STA) 中调用对象,则必须从该单元注册类对象。这可以通过创建一个单独的线程并从那里注册来完成。

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2021-04-27
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多