Как я понимаю, он МОЖЕТ быть выполнен и MEANT, чтобы иногда выполняться (например, в случае инъекции 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, все еще использует его, и этот обработчик модуля действительно не для вас.