gpt4 book ai didi

c++ - COM 对象生命周期

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:24 25 4
gpt4 key购买 nike

考虑以下场景:

这段代码由线程A执行:

CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
globalSomeSTAComObject.CreateInstance((__uuidof(CLSID_SomeSTAComObject));
return 0;

现在在线程 A 完成后,默认 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 对象的状态是什么。

最佳答案

这取决于 COM 对象本身和创建它的线程的线程模型。

如果对象是单元线程的,它将存在于自己的 STA 中。如果 STA 线程创建对象,则该线程与对象在同一个 STA 中运行,并接收指向该对象的直接指针。如果 MTA 线程创建对象,则会创建一个新的 STA,并且该线程会收到 STA 中对象的代理。在任何一种情况下,如果其他线程想要访问该对象,则必须对其进行编码。

如果对象是多线程的,它将存在于 MTA 中。如果 STA 线程创建对象,则该线程会收到 MTA 中该对象的代理。如果 MTA 线程创建对象,它会收到一个指向该对象的直接指针。该对象可以被其他 MTA 线程直接访问,但如果被 STA 线程访问则必须编码。

如果对象是自由线程的,如果由 STA 线程创建,它将存在于 STA 中,如果由 MTA 线程创建,它将存在于 MTA 中。然后适用上述规则。

此主题在 MSDN 上有详细讨论:

Processes, Threads, and Apartments

Understanding and Using COM Threading Models

COM+ Threading Models

关于c++ - COM 对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27587914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com