考虑以下情形: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单例对象时,首先会出现问题。 –