无法将线程并发模型设置为多线程单元

时间:2017-03-13 15:17:24

标签: multithreading delphi com delphi-xe5 apartments

我创建了一个新的DUnit测试项目,我正在尝试在其开始时设置多线程公寓。问题是在一台计算机上的公寓类型发生了变化。

program COMApartment;

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  Winapi.ActiveX,
  TestuApartmentInfo in 'TestuApartmentInfo.pas',
  DUnitTestRunner;

{R *.RES}

begin
  CoUninitialize;
  CoInitializeEx(nil, COINIT_MULTITHREADED); // Result is S_OK
  Log(GetCurrentApartmentType); //APTTYPE_MTA on both computers.
  DUnitTestRunner.RunRegisteredTests;
end.

现在,当我运行这个简单的测试时:

unit TestuApartmentInfo;

interface

uses
  TestFramework, Winapi.Windows, uApartmentInfo;

type
  TestIComThreadingInfo = class(TTestCase)
  published
    procedure ApartmentType;
  end;

implementation

uses
  Dialogs, System.SysUtils;

procedure TestIComThreadingInfo.ApartmentType;
begin
  //This gives APTTYPE_MTA on my dev computer (Windows 7) and APTTYPE_MAINSTA or APTTYPE_STA on virtual machine (Windows 2007 Server).
  Log(GetCurrentApartmentType); 
end;

initialization
  RegisterTest(TestIComThreadingInfo.Suite);
end.

我不了解不同计算机上的不同行为。这是由于不同的操作系统?在我的测试中,我可以生成另一个线程并为它指定公寓模型,它会起作用,但我好奇的本性想知道为什么在上面的情况下会有不同的结果。

GetCurrentApartmentType已在this文章中实施,并且正常运行。这是一个示例应用程序,用于说明我对一些需要在多线程单元模型中运行的COM对象的问题。

1 个答案:

答案 0 :(得分:-1)

this帖子中描述了我的问题的解决方案。我的错误是在已经调用其他代码之后调用CoUninitialize / CoInitialize。 应该在任何其他代码之前调用CoInitialize