2015-02-23 312 views
0

根据this link,我创建了Windows Processing MonitoringWindows Service Monitoring DLL,它们将由主应用程序调用并在线程中使用它们运行(使用boost::thread)以异步获取数据。考虑到这两个DLL都是由我的应用程序运行的。我的应用程序中出现了一个错误Failed to initialize security. Error code = 0x80010119。并且在停止这些DLL的线程时,CoUninitialize也会在它们中被调用。我在这里遇到了一个崩溃。这可能是因为后面的线程中的CoUninitialize可能会尝试清除以前线程清除的内存。调用CoUninitialize时崩溃

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

+0

甚至允许多个初始化?库不应该这样做,调用代码应该保证初始化为先决条件。此外,这个问题没有什么tobwith WMI本身 – Basilevs 2015-02-23 12:10:43

+0

我正在使用WMI API异步获取有关Win32_Process和Win32_Service的数据。在上面给出的链接中,有'CoInitializeEx'和'CoUninitialize'。由于我为这两个任务创建了DLL,因此调用这两个函数会导致崩溃。 – Pant 2015-02-23 14:00:47

回答

0

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

+0

如果** CoUninitialize **被调用两次,我该如何处理这种情况?事情是当线程异常发生时,我的两个线程都有** CoUninitialize **。它可以在单个进程中从线程调用两次。任何线索? – Pant 2015-03-01 07:46:35

+0

这些方法访问整个应用程序范围,并且不提供内部corrurent访问保护。只在主应用程序线程中调用Initialization和uninitialization一次,或者(不推荐)使用原子布尔变量来保护多个调用。 – Basilevs 2015-03-01 09:01:42

0

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

这告诉我你的错误,但它不在CoUninitialize。你假设CoUninitialize是整个进程。在现实中,CoUninitialize镜像CoInitializeEx,并应该在每个线程上完成。所以你的崩溃几乎肯定是由一个线程上的CoInitializeEx和另一个线程上的CoUninitialize造成的。

解决的办法是在两个线程上都执行CoInitializeEx,而在两个线程上都执行CoUninitialize

相关问题