При работе с интерфейсами в среде разработки Delphi XE может возникнуть проблема, связанная с управлением памятью, которая проявляется при повторной компиляции проекта. Это может привести к ошибке доступа с чтением адреса 00000000, что указывает на попытку доступа к несуществующему ресурсу.
Пример кода, вызывающего ошибку
В приведенном ниже примере кода используется интерфейс IOTAProjectCompileNotifier, который предназначен для уведомления о начале и окончании компиляции проекта. Однако, при повторной компиляции проекта, среда разработки выдает ошибку доступа.
Проблема заключается в том, что созданный интерфейс TProjectCompileNotifier не сохраняется, и попытка его удаления приводит к ошибке, так как ссылка на него уже потеряна. Правильный подход заключается в сохранении ссылки на интерфейс и его корректном удалении после использования.
procedure TCompileNotifier.ProjectCompileStarted(const Project: IOTAProject; Mode: TOTACompileMode);
var
i: Integer;
Intf: IOTAProjectCompileNotifier;
begin
Intf := TProjectCompileNotifier.Create;
i := Project.ProjectBuilder.AddCompileNotifier(Intf);
// Необходимо сохранить значение i для последующего удаления
end;
initialization
i := (BorlandIDEServices as IOTACompileServices).AddNotifier(TCompileNotifier.Create);
finalization
(BorlandIDEServices as IOTACompileServices).RemoveNotifier(i); // Используем сохраненное значение i
Project.ProjectBuilder.RemoveCompileNotifier(Intf); // Удаляем созданный нотификатор
Альтернативное решение
В качестве альтернативного решения можно рассмотреть установку уведомления при открытии проекта и его удаление при закрытии. Это позволяет избежать ручного управления удалением нотификатора и потенциальных ошибок, связанных с этим.
initialization
begin
(BorlandIDEServices as IOTAIDENotifier).FileNotification := FileNotificationMethod;
end;
finalization
begin
(BorlandIDEServices as IOTAIDENotifier).FileNotification := nil;
end;
procedure FileNotificationMethod(const AFile: IOTAFile);
var
Intf: IOTAProjectCompileNotifier;
begin
Intf := TProjectCompileNotifier.Create;
i := (CurrentProject as IOTAProject).ProjectBuilder.AddCompileNotifier(Intf);
// Сохраняем пару (проект, индекс нотификатора) для последующего удаления
end;
Заключение
При работе с интерфейсами в Delphi важно правильно управлять ресурсами, особенно при использовании функций, связанных с уведомлениями о событиях среды разработки. Необходимо тщательно следить за созданием и удалением объектов, а также за сохранением и использованием индексов, возвращаемых функциями добавления нотификаторов.
При работе с интерфейсами в Delphi XE возникают ошибки управления памятью при повторной компиляции проекта, связанные с неправильным управлением объектами и их индексами, что приводит к доступу к освобожденной памяти.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.