Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 卸载多个库_C++_Windows_Dll_Reference Counting - Fatal编程技术网

C++ 卸载多个库

C++ 卸载多个库,c++,windows,dll,reference-counting,C++,Windows,Dll,Reference Counting,我正在使用一个工具(certutil.exe),它正在加载我们编写的两个提供程序DLL,一个CSP DLL和一个CNG DLL。这两个都将加载我们编写的另一个DLL,提供PKCS11函数。该DLL还建立到加密硬件的会话 每个DLL可以在不同的场景中单独使用,也可以一起加载,这里就是这样 当certutil完成时,它将卸载每个DLL。问题是(到目前为止尚未检测到),每个DLL都将卸载pkcs 11库。第一次卸载时,所有会话都将关闭,句柄将呈现为无效。当第二个DLL使用它们时,程序崩溃,因为句柄不再

我正在使用一个工具(certutil.exe),它正在加载我们编写的两个提供程序DLL,一个CSP DLL和一个CNG DLL。这两个都将加载我们编写的另一个DLL,提供PKCS11函数。该DLL还建立到加密硬件的会话

每个DLL可以在不同的场景中单独使用,也可以一起加载,这里就是这样

当certutil完成时,它将卸载每个DLL。问题是(到目前为止尚未检测到),每个DLL都将卸载pkcs 11库。第一次卸载时,所有会话都将关闭,句柄将呈现为无效。当第二个DLL使用它们时,程序崩溃,因为句柄不再引用pkcs11库。如果我避免释放pkcs11库,那么我会泄漏硬件中的资源

我的想法是实现某种形式的引用计数,但我不确定该放在哪里。对于pkcs11库来说,几乎有必要计算它已加载的次数,并将其提供给任何希望查询计数的“更高级别”dll。如果计数大于1,则减小计数。如果count==1,则卸载dll并释放资源


但我觉得“不对”。。。我肯定错过了什么,什么概念或什么。这不是一个应用程序加载两个中间DLL的第一种情况,每个DLL加载一个公共的第三个DLL,然后需要清理。

::LoadLibrary
已被引用计数(隐式加载也是如此),如何加载/卸载DLL?请调用C_Finalize,然后调用FreeLibrary。但是,第二个DLL不知道第一个DLL是这样做的,所以它的句柄现在是无效的,已经从下面拉了地毯。从文档中(我想我有正确的一个,如果没有,请链接到正确的一个。)“库永远不应该调用C_Finalize()。按照惯例,应用程序负责调用C_Finalize()结束会话。”来源: