为什么我的 IUnknown 释放函数会阻塞我的子线程?

why my IUnknown release function block my child thread?

在我的 C 应用程序中,我有一个子线程在他的生命开始时检索一个 IUnknown 接口:

static struct IUnknown* punk = NULL;

void DispatcherStart(){
    CoInitialize(NULL);
    CheckHRESULT(GetActiveObject(&MY_CLSID,NULL,&punk));
}

一切都很好,它被用来调用一些 activeX 函数并且可以工作!然而,当我的程序结束时,它要求线程终止,所以我的线程调用正在结束函数的 :

void DispatcherStop(){
    if(punk) (punk)->lpVtbl->Release(punk); // BLOCK here
    punk = NULL;
    CoUninitialize();
}

我的 thead 从来没有 return 因为我的 IUnknow ptr 上的 Release 阻止了它。 (如果我删除 Release 然后 COUnitialize() 块也)

我做错了什么? (朋克初始化不能在主线程中完成)

执行 CoInitialize 的线程如果没有消息泵将失败。因此,如果线程没有自己的线程,请使用 CoInitializeEx(NULL,COINIT_MULTITHREADED);
但后一种情况仅适用于 mta com。
这并不意味着您只需将 CoInitialize 更改为 CoInitializeEx..
mta com 应该有自己的基地。你应该提供它。就像我在那里所做的那样 https://github.com/alexeyneu/tool3/blob/00bfd2aaf2973626f166ea754b756fd0f2fa0d0b/tool3/MainFrm.cpp#L254