我们遇到了一个案例,将FreeLibrary
呼叫放入DllMain
/将是我们的最佳解决方案DLL_PROCESS_DETACH
。
当然,你不能这样做:
从 DllMain 调用 FreeLibrary 是不安全的。
用例是我们有这样的情况:
(unknown client dll or exe) links dynamically or statically to ->
-> DLL_1, loads dynamically -> DLL_x
DLL_1 应该透明地加载 DLL_x。到它的客户端代码,它应该动态加载 DLL_x。现在,加载可以延迟完成,因此LoadLibrary
调用不必驻留在DLL_PROCESS_ATTACH
DLL_1 的部分。
但是一旦客户端完成了 DLL_1,当 DLL_1 从进程中卸载时/之前,它也应该卸载 (== FreeLibrary) DLL_x。
DLL_1/Uninitialize
如果没有客户端必须调用的显式函数,有什么方法可以做到这一点?
我会注意:
DllMain
,因此也不能使用任何 C++ 全局静态析构函数。- kernel32/ntdll 或者共享的 MS CRT 中是否有任何其他回调机制来实现这一点?
- 是否有其他模式可以使这个用例工作?