【问题标题】:How to get the main thread of a console app to be MTA?如何让控制台应用程序的主线程成为 MTA?
【发布时间】:2019-12-11 00:11:16
【问题描述】:

如何使用 Delphi 创建一个 (Windows) 控制台应用程序,该应用程序的主线程初始化为 COINIT_MULTITHREADED

如果我在第一条语句中调用CoInitializeEx(nil, COINIT_MULTITHREADED),我会得到一个 HRESULT 0x80010106(设置后无法更改线程模式),因此很明显一些之前运行的代码已经调用了CoInitialize/Ex

我怎样才能让主线程成为COINIT_MULTITHREADED

【问题讨论】:

    标签: delphi com apartments apartment-state


    【解决方案1】:

    由于您的 uses 子句,您的程序中包含的一个单元已经在其单元初始化部分初始化了 COM。

    您需要识别该单元,并将其从您的程序中删除。

    考虑这个程序:

    {$APPTYPE CONSOLE}
    
    uses
      ActiveX,
      ComObj;
    
    begin
      Writeln(CoInitializeEx(nil, COINIT_MULTITHREADED));
    end.
    

    输出为0,表明空控制台应用程序未初始化 COM。

    【讨论】:

    • 我认为这意味着“你不能,寻找解决方法”。例如。开始一个新线程。
    • 没错。不确定该解决方法应该是什么,这取决于您是否可以找到一种方法来回避在另一个单元中执行的 COM 初始化。这就是我要开始的地方。
    • 解决方法?在主线程中,我启动一个新线程,将其初始化为 MTA,在那里完成所有工作,然后让主线程等待该线程。当然,这只有在我不在该线程中使用需要 STA 的东西时才有效。也许不好,但我不明白为什么这不起作用。不过,我不会在生产代码中使用它,保证 :)
    • 它工作正常。但是我仍然会质疑使用在你背后初始化 COM 的代码。在你的情况下,我会努力弄清楚是什么造成的。
    • 也许您可以在您作为项目中第一个单元包含的单元的初始化部分初始化 COM。也许这不能解决问题,但是你的代码可以设置线程模式,而其他代码会抛出异常。这至少可以为您提供一种简单的方法来找出导致问题的代码。
    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多