考慮以下情形:COM對象生存
由線程A執行該代碼:
後CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
globalSomeSTAComObject.CreateInstance((__uuidof(CLSID_SomeSTAComObject));
return 0;
現在線程A完成它的執行不會對default STA
「繼承」 globalSomeSTAComObject,它可以通過使用其他線程?
或者這個物體變得不可用?
與線程A相同的問題,但現在認爲該對象是在MTA線程上創建的MTA Com對象。
當線程A完成它的執行時,MTA Com對象是否在Multithreaded Apartment
內仍然有效並且可以使用?
MSXML2::IXMLDOMDocumentPtr xml;
unsigned __stdcall CreateXml(void*)
{
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
xml.CreateInstance(__uuidof(MSXML2::FreeThreadedDOMDocument60));
xml->load("c:\\test.xml");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
HANDLE handle = reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, CreateXml, nullptr, 0, nullptr));
WaitForSingleObject(handle, INFINITE);
long numOfSections = xml->documentElement->childNodes->length; //This works why ?
xml.Release();
CoUninitialize();
return 0;
}
請不是在CreateXml
我故意不叫CoUninitialize
,因爲我想知道什麼是XML對象在這種情況下的狀態。
顯示的代碼段很危險。不僅你不顯示你將如何去做'CoUnitinialize',而且你還要在主管STA /線程完成之後在其他線程和AND上使用STA特定的COM指針做一些假設。 'globalSomeSTAComObject'只能在這個線程上使用,並且可以在'CoUnitinialize'之前使用。在其他線程上使用可能會奏效,但通常不正確,行爲未定義。 –
如果MTA線程創建MTA對象(全局對象)並終止。 MTA公寓裏的物體還活着嗎?或者在這種情況下,行爲是不確定的? – JobNick
COM要求您在調用'CoUninitialize'之前終止您的COM活動。因此,在此初始化之外留下COM指針是不正確的。然而,在MTA情況下,由於指針在任何其他MTA線程的存在下仍然有效,所以它是一個不太常見的問題。總而言之,您有時可能會將COM對象從幫助程序MTA線程「泄漏」,但總結一切,我會說,您仍然在以某種方式錯誤地提出您的問題。嘗試在COM初始化之外嘗試使用COM單例對象時,首先會出現問題。 –