При разработке DLL с использованием VCL-форм может возникнуть проблема доступа к неинициализированным данным при минимизации окна. В контексте вопроса пользователя, проблема связана с использованием стилей VCL в DLL, что приводит к нарушению доступа при минимизации формы. Основная проблема заключается в том, что VCL-стили в Delphi не предназначены для использования в DLL, и это приводит к ошибке доступа при попытке обработки сообщений, связанных с минимизацией окна.
Когда форма открывается с применённым стилем, все функции работают корректно, за исключением минимизации, что вызывает ошибку доступа.
Подробности проблемы:
Пользователь предоставил SSCCE (Short, Self Contained, Correct (Compilable), Example), который демонстрирует проблему. В коде проекта Project1.EXE используется функция InitDLL для загрузки DLL и вызова функции showfrm, которая открывает форму из DLL. В DLL определены стили, которые применяются к форме.
Пример кода из проекта Project2.dll:
library Project2;
uses
ShareMem,
Vcl.Themes,
Vcl.Styles,
...,
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas';
exports
showfrm;
begin
if TStyleManager.TrySetStyle('AnyStyle1') then
ShowMessage('True')
else
ShowMessage('False');
end.
При нажатии на кнопку минимизации формы Unit2 возникает ошибка доступа, что указывает на проблему с обработкой сообщений в минимизированной форме.
Подтвержденный ответ:
Проблема заключается в том, что VCL-стили в Delphi XE2 не предназначены для использования в DLL. Ошибка доступа возникает в обработчике сообщения WM_SIZE стилевого хука формы:
procedure TFormStyleHook.WMSize(var Message: TWMSize);
begin
if IsIconic(Handle) and (Application.MainForm.Handle <> Handle) then
InvalidateNC;
...
end.
Стилевой хук проверяет, обрабатывается ли сообщение на главной форме, но в DLL нет главной формы. Попытка доступа к неинициализированному полю вызывает исключение.
Альтернативные ответы:
Компиляция DLL и EXE в одной и той же версии RAD Studio с включенными "Runtime packages" может помочь избежать проблемы.
Создание скрытой главной формы в DLL может помочь решить проблему минимизации.
Отключение системных хуков перед установкой стиля в DLL может помочь избежать ошибок доступа.
Рекомендуемое решение:
Изменение стилевого хука для формы, чтобы он не проверял наличие главной формы:
type
TForm2StyleHook = class(TFormStyleHook)
private
procedure WMSize(var Message: TWMSIZE); message WM_SIZE;
end;
procedure TForm2StyleHook.WMSize(var Message: TWMSIZE);
begin
if IsIconic(Handle) then
begin
InvalidateNC;
Handled := False; // Позволяет продолжение обработки сообщения
end
else
inherited;
end;
Также стоит отметить, что использование стилей в DLL может приводить к другим проблемам, не связанным только с минимизацией.
Заключение:
Разработчикам следует учитывать ограничения использования VCL-стилей в DLL и искать альтернативные решения или обходные пути, если стандартные методы не работают.
Проблема связана с неправильной работой стилевых хуков в минимизированной VCL-форме, используемой в DLL, что приводит к ошибкам доступа.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.