Проблемы с BPL (Delphi 2007, invalid access to memory location)

Симптомы. В Delphi 2007 эта проблема вылезла на ровном месте после удаления/переноса некоторых файлов из пакета. Манипуляции проводились не из IDE, а в файловом менеджере. Аналогичный эффект наблюдался при обновлении директорий проекта на другом компьютере (часть файлов удаляется, часть добавляется).

Не помогало: удаление и полная перекомпиляция (build) с предварительной очисткой проекта (clean), ручное удаление файлов, перезагрузка. Суть в том, что основной пакет компилировался и даже устанавливался, но второй, зависимый от него стабильно выдавал "invalid access to memory location".

Пакеты изначально были разделены на runtime и design-time, объединение также не помогало. Среда Delphi 2007 при попытке использовать хотя бы первый пакет валилась даже без ошибок, просто приложение исчезало с экрана в неуловимый момент. Компиляция из командной строки проходила успешно, но EXE получался неработоспособным, выдавая при загрузке ошибки памяти. Полная переустановка Delphi также не помогает.

Лечим. Радикальный способ - переустановка ОС и установка среды на "свежую" копию. Я надеюсь, что у вас есть на такой случай backup системного диска :) Менее радикальный способ - вернуться в system restore point. Вы не забыли его сделать сразу после установки? К сожалению, под Win 2000 такая возможность отсутствует.

Ладно, я пошутил. Это крайние меры :)

Пусть ваш главный пакет называется MyPackage.bpl. Лезем в реестр (regedt32) и запускам глобальный поиск по "MyPackage". Удаляем все попавшиеся ключи. Должны как минимум найтись ключи из "Disabled packages" и "Packages cache". Заодно удалите оттуда и все зависимые от него пакеты. Закрываем реестр, запускаем Delphi, переустанавливаем пакеты - все работает. В дальнейшем рекомендую пользоваться compile вместо build.

Update. Проблема в IDE решилась.

Выявлена причина. Использовании функции Win32 API IsDebuggerPresent() в пакетах приводит к непредсказуемому поведению IDE. Соответствующий отчет об ошибке (62696) добавлен на сайт производителя.

Воспроизводящий ошибку пример можно загрузить в конце страницы.

По шагам:
1. Создать новый пакет и добавить в него новый модуль (unit).
2. В модуле пишем код:

unit Unit1;
 
interface
 
uses
  SysUtils, Types, Classes, Windows, Forms, StdCtrls, ShellApi, Controls;
 
type
  TVCLUtils = class(TObject)
  public
    class function LaunchedFromDelphiIDE: Boolean;
  end;
 
function IsDebuggerPresent(): BOOL;
  stdcall; external 'kernel32.dll.' name 'IsDebuggerPresent';
 
 
implementation
 
class function TVCLUtils.LaunchedFromDelphiIDE: Boolean;
begin
  Result := IsDebuggerPresent();
end;
 
end.

3. Компилируем пакет
4. Создаем вотрой пакет и добавляем в него модуль.
5. Добавляем в пакет ссылку (Add reference) на первый пакет
6. Сохраняем все проекты
7. Перестравиаем (Build) и устанавливаем (install) первый пакет
8. Пытаемся перестроить второй пакет (build). Должна появиться ошибка типа "Invalid access to memory location"
9. Если сразу не удалить пакет из списка установленных, то среда может накрыться в течение нескольких секунд, а при рестарте будет вести себя непредсказуемо: падать при инициализации, не показывать главную страницу (welcome page), предлагая ее открыть с диска и т.д.

Обойти проблему можно прямым вызовом функции IsDebuggerPresent в приложении и только во время исполнения.

Прикрепленный файлРазмер
Package icon PackagesInstallError.zip12.07 KB

Комментарии

Изображение пользователя Serguei_Tarassov.

Хлопотно

Хлопотно. Много кода. А готовить отдельный пример тоже не хочется.

Жаль :( Я вот

Жаль :(
Я вот тоже наткнулся на проблему при попытке создать проект с поддержкой bpl плагинов.
Сам bpl загружается, а при попытке
PluginInterf.CreateForm(HostInterf);
получаю Access violation at 0x00456cb7: read of address 0x00000000.
Беру пример проекта с http://cc.codegear.com/Item/23096
хотя под d2007 его пришлось подрихтовать чтоб скомпилился.

Вот пойди разбери, проблема с самим проектом или делфи?

Ты не мог бы выложить где-ньть пример 100% работающего проекта с загрузкой классов из BPL?

Изображение пользователя Serguei_Tarassov.

Дополнение

Проблема в IDE частично решилась после того, как bpl-ки стали компилироваться в директорию, куда указывает глобальный SearchPath уровня среды. Простого добавления этой директории в PATH недостаточно.

Примера проекта, готового к выкладке, к сожалению в наличии нет.