We hit a case where it would be the best solution for us to put a FreeLibrary
call into DllMain
/ DLL_PROCESS_DETACH
.
Of course, you must not do that:
It is not safe to call FreeLibrary from DllMain.
The use case is that we have a situation like this:
(unknown client dll or exe) links dynamically or statically to ->
-> DLL_1, loads dynamically -> DLL_x
DLL_1 should load DLL_x transparently wrt. to it's client code, and it should to load DLL_x dynamically. Now, the loading can be done lazily, so that the LoadLibrary
call needn't reside in the DLL_PROCESS_ATTACH
part of DLL_1.
But once the client is done with DLL_1, when/before DLL_1 is unloaded from the process, it should also unload (== FreeLibrary) DLL_x.
Is there any way to do this without an explicit DLL_1/Uninitialize
function that must be called by the client?
I'll note:
DllMain
, and thus also any C++ global static destructor cannot be used.- Is there any other callback mechanism in either kernel32/ntdll or maybe in the shared MS CRT to make this happen?
- Are there other patterns to make this usecase work?