Delphi TDataSet в пакете времени выполнения - PullRequest
0 голосов
/ 03 ноября 2010

Я создаю пакет времени выполнения, который содержит классы, которые может использовать мое основное приложение, но у меня проблемы с доступом к данным.Мое основное приложение содержит базу данных TD, которая указывает на псевдоним BDE.Во время выполнения мой пакет загружается динамически, и в пакете вызывается метод, который создает TQuery и открывает его, заполняет объект возвращенными данными и затем возвращает объект в основное приложение.TQuery использует базу данных TD в главном приложении для подключения к базе данных.Все это работает нормально, но когда я закрываю приложение, я получаю нарушение прав доступа: «Проект C: ... GUI.exe завершился ошибкой с сообщением« нарушение прав доступа по адресу 0x7c9102db: запись адреса 0x00040ffc ». Процесс остановлен. Используйте Step или RunПродолжить".Если мой метод создает TQuery, но не открывает его, эта ошибка не возникает.Я понятия не имею, почему это происходит!Когда я закрываю приложение, мой TQuery закрывается и освобождается нормально, мой пакет выгружается нормально, но после уничтожения формы возникает ошибка.Я использую Delphi 5 BTW, я пытался быть кратким, поэтому, если я пропустил любую полезную информацию, дайте мне знать, любая помощь с благодарностью получена.

Спасибо

ps Я знаю, чтоиспользование Delphi 5 и BDE является архаичным, но я застрял с ним на данный момент!

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Что если вы не освободите свой TQuery? Я имею в виду, старайтесь не освобождать ваш объект TQuery, когда приложение завершается.

0 голосов
/ 03 ноября 2010

Похоже на проблему порядка инициализации / завершения модуля.Обычно это определяется порядком единиц в списках использования и пакетами, которые требуются вашему пакету.

Лучший способ решить эту проблему - отладить Delphi с Delphi, или ваш пакет с.EXE .
Последнее важно, потому что старые версии Delphi не всегда находят символы для вашего пакета, если вы начинаете отладку с вашим EXE.

Шаги

  1. Запустите Delphi, который не содержит ваш пакет
  2. Загрузите ваш пакет в Delphi
  3. Установите хост вашего пакета как Delphi
  4. Скомпилируйте ваш пакет с полной информацией отладкии включите опцию 'debug DCU'
  5. Запустите ваш пакет (теперь он должен загрузить Delphi, а затем ваш пакет)
  6. Завершить Delphi
  7. Смотреть стек вызовов, когда AVИскры

Возможно, вы захотите установить точки останова для просмотра вашего порядка инициализации / финализации (см. этот пост , ссылки и комментарии для обсуждения по этому вопросу).

Затем поиграйте со списками ваших использований и разделами с требованиями к пакетам.

- jeroen

0 голосов
/ 03 ноября 2010

Это случилось со мной, используя dbExpress, раздел финализации запустил до деструктора модуля данных, когда приложение было Abort() ed, и это вызывало сильную головную боль.

Итак, я думаю, что

  • Драйвер соединения BDE (или какой-либо другой ресурс) завершает работу перед уничтожением того, что его использует, поэтому пытается завершить соединение дважды.

Я говорю «драйвер», потому что они обычно загружаются / инициализируются только по требованию, поэтому он не будет ошибаться, если его не использовать. Так что, возможно, когда ваш пакет выгружен, он завершает драйверы.

Попробуйте это:

  • загрузить посылку,
  • используйте TQuery, содержащийся в пакете,
  • выгрузите ваш пакет,
  • использовать другой TQuery, созданный в основном приложении,

и посмотрите, работает ли это без исключений. Если это не сработает, то, я думаю, я могу быть прав, и мы попытаемся выяснить, как заставить это работать.

Боже, благослови!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...