Я реализовал DLL, включающую функцию ввода DllMain (): -
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
case DLL_PROCESS_ATTACH:
/* here im doing file memory mapped through CreateFileMapping() API
and using it through MapViewOfFile() API
storing some data structure in the file mapped area */
...
case DLL_THREAD_ATTACH:
...
case DLL_THREAD_DETACH:
...
case DLL_PROCESS_DETACH:
/* Here unmapping first through UnmapViewOfFile() API
then tries to access the stroed data structure which is illegal
as we have already closed the file mapping
This is the buggy code. The order should be first access the mapped memory
region and then unmap it */
cout <<" some message"<<endl;
...
}
К сожалению, я допустил ошибку в случае DLL_PROCESS_DETACH и доступа к нелегальной памяти (нарушение прав доступа).
Я создал пример программы, которая загружает библиотеку с помощью функции LoadLibrary (), использует библиотечную функцию и, наконец, вызывает FreeLibrary () и возвращает.
Когда я выполнил эту программу, я не получил никакого сообщения об ошибке.
Но если я удаляю FreeLibrary (), в этом случае случай DLL_PROCESS_DETACH выполняется неявно, и на этот раз он выдает диалоговое окно с сообщением об ошибке, указывающим на нарушение прав доступа.
Почему вызов FreeLibrary () подавляет эту ошибку? ИЛИ внутренне это обрабатывает это исключение?
Какой предложенный способ.
Обновление: я добавил подробности для ATTACH и DETACH. Вероятно, это поможет, почему мне не ясно о наблюдаемом поведении.
При вызове FreeLibrary () я не получил ни одного сообщения об ошибке, но сообщение cout не отображалось. Кажется, он тоже разбился, но не был помечен
Но если я удаляю FreeLibrary (), в этом случае случай DLL_PROCESS_DETACH выполняется неявно и дает диалоговое окно нарушения доступа.
В идеале в первом случае также должна отображаться ошибка. Поэтому я предполагаю, что FreeLibrary () подавляет эту ошибку нарушения доступа.