Метод LoadLibraryA возвращает код ошибки 1114 (ERROR_DLL_INIT_FAILED) после более чем 1000 циклов загрузки / выгрузки - PullRequest
0 голосов
/ 11 июня 2010

Я программирую на C ++, использую Visual Studio 2008, Windows XP, и у меня возникает следующая проблема: Мое приложение, которое представляет собой DLL, которую можно использовать из Python, загружает внешнюю DLL, использует необходимыеметоды, а затем выгружает эту внешнюю Dll.Он работает правильно, но после более 1000 циклов метод «LoadLibraryA» возвращает нулевую ссылку.

Основные шаги:

HINSTANCE h = NULL;
h = LoadLibraryA(dllfile.c_str());
DWORD dw = GetLastError(); 

Получена ошибка:

ERROR_DLL_INIT_FAILED
1114 (0x45A) A dynamic link library (DLL) initialization routine failed.

Dll выгружается с помощью следующего:

FreeLibrary(mDLL);
mDLL = NULL;

Где mDLL определяется следующим образом:

HINSTANCE mDLL;

Первая попытка: просто загрузите Dll только один раз, ивыгрузил его, когда приложение заканчивается.Это решает проблему, но вводит новую.

Когда приложение заканчивается, вместо того, чтобы сначала выполнить метод DllMain моего приложения, который выгружает внешнюю DLL, сначала выполняет метод DllMain другого Dll.Это вызывает следующую ошибку, потому что мое приложение пытается выгрузить Dll, который был выгружен ранее самостоятельно.

"Необработанное исключение в 0x04a00d07 (DllName.DLL) в Python.exe: 0xC0000005: Местоположение чтения нарушения доступа 0x0000006b".

Любое предложение будет приветствоваться.Заранее спасибо.Привет.

1 Ответ

0 голосов
/ 11 июня 2010

Убедитесь, что код инициализации загруженной / выгруженной библиотеки не пропускает память.Многие библиотеки ожидают загрузки только один раз и не всегда очищают свои ресурсы должным образом.

Например, в файле C ++ на верхнем уровне можно объявить и инициализировать переменную следующим образом:

AClass *a = new AClass(1,2,3);

Код будет выполнен, когда библиотека загружается автоматически.Тем не менее, теперь невозможно освободить зависший экземпляр, так как библиотека не знает точно, когда и как он будет выгружен.В этом случае можно либо заменить «AClass * a» на «AClass a», либо написать собственный DllMain для библиотеки и свободных ресурсов в DLL_PROCESS_DETACH.

Если вы не можете контролироватькод библиотеки, тогда может иметь смысл создать кеш загруженных библиотек и просто никогда не выгружать их.Очень трудно представить, что было бы неограниченное количество библиотек для перегрузки такого кэша.

...