c++ - COM 对象生命周期

标签 c++ visual-c++ com

考虑以下场景:

这段代码由线程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/

相关文章:

c#-4.0 - C# 4、COM 互操作和 UPnP : A trying triumvirate

python - 如何使用 python win32com 或 comtypes 中的 COM 访问 IRTDServer?

C++ 奇怪的访问冲突 Visual Studio 2015 RC

c++ - 如何将全局变量传递给 C++ 中的函数?

c++ - 使用循环使相同的线程在没有 sleep 的情况下一次又一次地获得相同的互斥锁

C++11接口(interface)纯虚析构函数

c++ - MSVC 用 double 支撑初始化似乎违反了标准?

c++ - 如何防止 COM Server EXE 打开命令提示符窗口

c++ - 将文本从子 GUI 进程发送到控制台父进程的最简单方法是什么?

c++ - 通过cmd向C++编译的exe传递参数