Ограничения 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 завершает второй вызов с той же ошибкой как упомянуто выше.