我已經創建了一個新的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對象的問題。
您是否知道'CoUninitialize'並不總是完全不初始化COM?在單個線程中,您可以使用同一間公寓多次安全地調用'CoInitialize'。每次通話都會增加一個計數。每次調用'CoUninitialize'都會減少該計數。當計數達到0時,公寓被毀壞。我的猜測是,您使用的框架在Windows 2007服務器上的計數上增加了+1。但是,我不知道爲什麼會這樣。 –
要測試此理論,可以使用['CoRegisterInitializeSpy'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679753.aspx)註冊['IInitializeSpy'](https: //msdn.microsoft.com/en-us/library/windows/desktop/ms690179.aspx)實例(您將不得不創建自己的實現來執行此操作)。在那裏,你可以看到裏/不合格和他們的計數。 –
你爲什麼要叫CoUninitialize?你認爲已經註冊了什麼? –