PRB: Вызов LoadLibrary() для загрузки библиотеки DLL, которая имеет статический TLS

Переводы статьи Переводы статьи
Код статьи: 118816 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

Использует библиотеку динамической компоновки (DLL) __declspec(поток) для выделения памяти локальные статические потока (TLS). Нет никаких проблем, связанных с запуск приложения, связанный с соответствующим статической библиотеки. Тем не менее, при использовании в приложении Функции LoadLibrary функция загрузки библиотеки DLL, вместо использования статических версии Функции LoadLibrary сбой на Win32s с кодом ошибки 87: недопустимый параметр.

Функции LoadLibrary успешно выполняется на компьютере под управлением Windows 98, Windows NT или Windows 2000 в данной ситуации. Тем не менее вызов функций в библиотеке DLL, которые ссылаются на статические переменные TLS поведение не определено. В Windows 95 Функции LoadLibrary происходит сбой и GetLastError функция возвращает 1114 - ERROR_DLL_INIT_FAILED (динамическая библиотека программа инициализации не удалось). В Windows 2000 Функции LoadLibrary функция успешно выполнена. Тем не менее любая попытка доступа к данным TLS вызывает нарушение прав доступа (AV).

Причина

Это является ограничением Функции LoadLibrary и __declspec. Пространство глобальных переменных для потока выделяется во время выполнения. Размер основывается на расчете требований приложения, а также требований всех статически компонуемых библиотек. Если DLL использует TLS статической и динамической связаны в приложении, когда Функции LoadLibrary -или- FreeLibrary Это называется, системе необходимо найти все потоки, которые существуют в процессе и увеличить или сжимать память TLS, их соответствии размера статического TLS в только что загруженной DLL. Этот процесс является слишком большой для операционных систем управления, которые могут вызвать исключение, когда динамически загружаемые DLL, или код ссылки на данные.

Решение

Библиотеки DLL, которые используют __declspec(поток) не должны загружаться с Функции LoadLibrary.

Код библиотеки DLL должен быть изменен для использования функций TLS, таких как TlsAllocи выделить TLS, если библиотека DLL может загружаться с Функции LoadLibrary. Или библиотеки DLL, которая использует __declspec(поток) только неявно загрузки в приложение.

Дополнительная информация

Чтобы определить, использует ли библиотека DLL статических TLS, программа Dumpbin.exe может использоваться для данных заголовка дампа. DLL имеет статический TLS, если содержит НЕОБЯЗАТЕЛЬНЫЕ значения ЗАГОЛОВКА, размер которого превышает 0 (ноль) в хранилище каталога потока следующим образом:
517B20 [18] RVA [размер] потоков каталога хранения данных

Свойства

Код статьи: 118816 - Последний отзыв: 1 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Win32 Application Programming Interface на следующих платформах
    • Microsoft Windows 98 Standard Edition
    • операционная система Microsoft Windows Millennium Edition
Ключевые слова: 
kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:118816

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com