Как исправить задержку объявления в UxTheme

В модуле Delphi XE UxTheme есть следующая декларация

function DrawThemeTextEx(hTheme: HTHEME; hdc: HDC; iPartId: Integer;  iStateId: Integer;
  pszText: LPCWSTR; cchText: Integer; dwTextFlags: DWORD; pRect: PRect;
  var pOptions: TDTTOpts): HResult; stdcall; 
  external themelib name 'DrawThemeTextEx' delayed;

Моя Windows XP Professional с пакетом обновления 3 (SP3) не имеет такой функции в файле uxtheme.dll (проверено с помощью dllexp.exe по http://www.nirsoft.net/utils/dll_export_viewer.html).

Похоже, что мое приложение задерживает загрузку процедуры и отказывает во время выполнения со следующей ошибкой:

Project mtgstudio.exe raised exception class EExternalException 
with message 'External exception C0FB007F'.

Эта проблема также встречалась в JVCL, но решалась там в соответствии с http://andy.jgknet.de/blog/2009/09/once-upon-a-delayed-jvcl-time/

Мне нужно исправить UxTheme, потому что они также используются компонентами DevExpress.

Есть ли способ исправить / исправить объявление DrawThemeTextEx UxTheme.pas, чтобы оно не задерживалось?

1 ответ

Решение

Основная проблема заключается в том, что этот API был представлен в Vista и недоступен в XP.

Весь смысл ключевого слова с задержкой состоит в том, чтобы позволить подобным функциям быть легко доступными для разработчиков, которые хотят воспользоваться преимуществами новых функций API. Но для этого разработчик, как правило, должен также предоставить запасные реализации для более старых версий ОС, что DevExpress, похоже, не смог сделать.

Следовательно, ошибка не в UxTheme.pas, а в компоненте DevExpress, который вызывает API, который не реализован на платформе. Исправление заключается в переработке кода DevExpress, чтобы избежать вызова этого API в XP.

Я предлагаю вам связаться с DevExpress, который, вероятно, уже имеет исправление в своих последних версиях.

Другие вопросы по тегам