Ограничения cлота TLS 

Технология Microsoft Layer for Unicode требует отдельного слота локальной памяти потока (TLS), чтобы хранить конкретную для потока информацию. Слот назначается в момент действия флажка DLL_PROCESS_ATTACH. Должна быть достаточная память, чтобы имелась возможность её распределения в куче процесса; если назначение завершается ошибкой, загрузка .dll завершается ошибкой, а GetLastError возвращает значение ERROR_MAX_THRDS_REACHED.

Память распределяется, если Вы вызываете какой-либо API, который применяет указатель на функцию или функцию фильтр (hook) - процедуры или функцию повторного вызова. Должна быть достаточная память, чтобы имелась возможность её распределения  в куче процесса; в противном случае вызов функции завершается ошибкой  ERROR_OUTOFMEMORY. Это - одноразовое распределение. Оно предполагает работу нижеперечисленных функций:

ChooseColor
ChooseFont
EnumCalendarInfo
EnumCalendarInfoEx
EnumDateFormats
EnumDateFormatsEx
EnumFontFamilies
EnumFontFamiliesEx
EnumFonts
EnumICMProfiles
EnumProps
EnumPropsEx
EnumSystemLocales
EnumTimeFormats
GetOpenFileName
GetSaveFileName
FindText
PageSetupDlg
PrintDlg
ReplaceText

Слот TLS, среди других элементов, хранит указатели на версии упаковщика (программу создания оболочки интерфейса) перечисления процедур и функций фильтр (hook) - процедур. В соответствии с этим, Вы можете установить одновременно только одно перечисление процедур или hook-функций, на одну функцию и на один поток. В случае перечисления, Microsoft Layer for Unicode правильно считает число ссылок для вашей функции; например, Вы можете делать вызовы внутри функции повторного вызова EnumFontFamExProc функции EnumFontFamiliesEx до тех пор, пока два вызова функции не попытаются использовать одну и ту же функцию повторного вызова на вашей стороне. Вы можете поддерживать до 15 вызовов в отдельно взятом потоке. Если Вы делаете попытку выйти за пределы этого ограничения, вызов функции завершается ошибкой; GetLastError возвращает значение ERROR_INVALID_FILTER_PROC.

В настоящее время, нет такой поддержки повторного вызова ссылок на подсчет функций повторного вызова упаковщиков внутри comdlg32.dll; Вы можете иметь только один из этих вызовов на один поток. Microsoft Layer for Unicode завершает второй вызов с той же ошибкой как упомянуто выше.

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz