C++ 呼叫时崩溃

C++ 呼叫时崩溃,c++,wmi,C++,Wmi,基于,我正在创建由主应用程序调用的Windows处理监控和Windows服务监控dll,并在线程中运行它们(使用boost::thread)以异步获取数据。考虑到这两个DLL都是由我的应用程序运行的。我得到错误初始化安全性失败。我的一个应用程序的错误代码=0x80010119。而且,当停止这些dll的线程时,在这两个dll中都会调用coninitialize。这里有一个碰撞。这可能是因为后一个线程中的coninitialize可能试图清除前一个线程清除的内存 如果是,我如何检查一个线程中的CoU

基于,我正在创建由主应用程序调用的
Windows处理监控
Windows服务监控
dll,并在线程中运行它们(使用
boost::thread
)以异步获取数据。考虑到这两个DLL都是由我的应用程序运行的。我得到错误
初始化安全性失败。我的一个应用程序的错误代码=0x80010119
。而且,当停止这些dll的线程时,在这两个dll中都会调用
coninitialize
。这里有一个碰撞。这可能是因为后一个线程中的
coninitialize
可能试图清除前一个线程清除的内存


如果是,我如何检查一个线程中的
CoUninitialize
是否成功,以便我不会在另一个线程中调用它。

CoUninitialize是COM库的一部分,WMI可以使用COM接口,但与它的初始化或处理无关。不要在一个进程内调用CononInitialize两次。请注意,您的两个DLL可能共享应用程序上下文并在其中执行。

如何检查一个线程中的
conInitialize
是否成功,以便我不会在另一个线程中调用它

这告诉我您的错误,但它不在
中。您假设
coninitialize
是进程范围的。实际上,
conInitialize
镜像了
CoInitializeEx
,这应该在每个线程上都完成。因此,崩溃几乎肯定是由一个线程上的
CoInitializeEx
和另一个线程上的
CoInitializeEx
引起的


修复方法是在两个线程上执行
CoInitializeEx
,在两个线程上也执行
counInitializeEx

是否允许多次初始化?库不应该这样做,调用代码应该保证初始化作为先决条件。此外,这个问题与WMI本身无关。我正在使用WMI API异步获取有关Win32_进程和Win32_服务的数据。在我上面给出的链接中,有
CoInitializeEx
CoUninitialize
。由于我已经为这两个任务创建了DLL,调用这两个函数会导致崩溃。如果调用了两次ConInitialize,我该如何处理这种情况?问题是,当线程异常发生时,我的两个线程都已初始化。它可以从单个进程内的线程调用两次。有什么线索吗?这些方法访问应用程序范围很广,不提供内部相应的访问保护。仅在主应用程序线程中调用初始化和取消初始化一次,或者(不推荐)使用原子布尔变量来防止多次调用。