2017-03-13 32 views
-1

我已經創建了一個新的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

您是否知道'CoUninitialize'並不總是完全不初始化COM?在單個線程中,您可以使用同一間公寓多次安全地調用'CoInitialize'。每次通話都會增加一個計數。每次調用'CoUninitialize'都會減少該計數。當計數達到0時,公寓被毀壞。我的猜測是,您使用的框架在Windows 2007服務器上的計數上增加了+1。但是,我不知道爲什麼會這樣。 –

+0

要測試此理論,可以使用['CoRegisterInitializeSpy'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679753.aspx)註冊['IInitializeSpy'](https: //msdn.microsoft.com/en-us/library/windows/desktop/ms690179.aspx)實例(您將不得不創建自己的實現來執行此操作)。在那裏,你可以看到裏/不合格和他們的計數。 –

+0

你爲什麼要叫CoUninitialize?你認爲已經註冊了什麼? –

回答

-1

我的問題的解決方案在this後描述。我的錯誤是在其他一些代碼已經調用它之後調用CoUninitialize/CoInitializeCoInitialize應在任何其他代碼之前調用。

+0

@DavidHeffernan我確實有VCL應用程序,你在這種情況下是錯誤的伴侶。順便說一句:我「愛」這個社區給我一個有效的問題和有效的答案downvotes。爲什麼我甚至在這裏打擾:) – Wodzu

+0

不當你不調用Application.Initialize來初始化COM。你想學習嗎?看來你根本不想理解這一點。爲什麼不? –

+0

正如我所說的Application.Initialize被調用,但實際上這不是問題在這裏,因爲別的是早期初始化COM。如果你想我可以學習你是什麼。問題是,你想學習嗎? – Wodzu