为什么我的 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
在我的 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