Насколько я понимаю, это МОЖЕТ быть сделано и ОБЯЗАНО иногда выполняться (например, в случае внедрения dll с помощью CreateRemoteThread и других методов). Таким образом,
FreeLibraryAndExitThread(hModule, 0)
сделает именно это.
С другой стороны, звонит
FreeLibrary(hModule)
здесь не подойдет - из MSDN: "Если бы они вызывали FreeLibrary и ExitThread по отдельности, было бы условие гонки. Библиотека могла бы быть выгружена до вызова ExitThread." Как замечание, ExitThread выполняет некоторую бухгалтерию, кроме простого возврата из функции потока.
Все это предполагает, что ваш Dll получил сам hModule, вызвав LoadLibrary изнутри загруженного Dll, или, скорее, вызвав из загруженного Dll следующую функцию:
GetModuleHandleEx
(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(LPCTSTR)DllMain,
&hModule
)
Это увеличивает счетчик ссылок Dll, так что вы знаете, что если вы позже освободите библиотеку, используя этот дескриптор, и если библиотека действительно выгружена, то у вас будет последняя ссылка на нее.
Если вместо этого вы пропустили увеличение счетчика ссылок Dll и получили hModule только из аргумента DllMain во время DLL_PROCESS_ATTACH , то вам не следует вызывать FreeLibraryAndExitThread , так как загруженный код Dll все еще использует его, и этот дескриптор модуля действительно не Ваш, чтобы управлять им.