【问题标题】:How do I solve this COM issue in C++? [duplicate]如何在 C++ 中解决这个 COM 问题? [复制]
【发布时间】:2014-08-12 10:44:13
【问题描述】:

我有一个 C# 类库 (dll),我想通过托管 C++ 静态库从非托管 C++ 应用程序中使用它。

 Unmanaged C++ Project(.exe) --> Managed C++ Project(.lib) --> C# Class Library(.dll)

C# dll 有一个带有 WebBrowser 控件的表单,该控件是一个 COM 组件,问题就在于此。现在,我应该通过托管 C++ 静态库调用表单,当我这样做时,

Unhandled Exception: System.Threading.ThreadStateException: ActiveX control '885
6f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current th
read is not in a single-threaded apartment.

出现此错误。是的,这是由于当前线程不在单线程单元模型中。但是我不能将任何线程属性添加到我的入口点,因为该项目是一个非托管项目。

我还尝试创建一个新线程来打开表单,如here 所述。它起作用了,但是当我这样做时,WebBrowser 控件似乎没有响应事件。所以我不想创建一个新线程。那么有没有办法将当前正在运行的线程更改为 STA。另一个原因是我根本不想创建单独的线程。

我也试过CoInitialize,但我无法解决这个问题。

我无法将 STAThread 属性添加到入口点,因为入口点位于非托管 C++ 项目中。

出于某种原因,我不想在我的非托管项目中启用公共语言运行时支持。

有没有办法解决这个问题?

【问题讨论】:

  • 必须在 main() 函数中自己调用 CoInitializeEx()。并且泵送消息循环,STA 线程和 WebBrowser 的硬性要求将无法正常工作,如果您不这样做。如果您的本机程序无法提供这些保证,那么它就不是浏览器的合适宿主,您必须启动自己的线程。

标签: c# multithreading c++-cli


【解决方案1】:

继续在应用程序的主条目中添加 [STAThread],这表明 COM 线程模型是单线程单元 (STA)

示例:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new WebBrowser());
    }
}

Single-threaded apartment - cannot instantiate ActiveX control

Why an ActiveX Control on a Managed Window Form Must Be STA-based

【讨论】:

  • 不,我不能将 STAThread 属性添加到入口点,因为它是一个非托管 C++ 项目。
  • 我想做一些与原生 C++ 项目中的 STAThread 属性等效的事情。这就是我问这个问题的原因。
猜你喜欢
  • 1970-01-01
  • 2020-06-12
  • 2016-01-24
  • 2021-08-22
  • 1970-01-01
  • 2021-07-06
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多