Delphi TDataSet в пакет за изпълнение

Създавам пакет за изпълнение, който съдържа класове, които основното ми приложение може да използва, но имам проблеми с достъпа до данните. Основното ми приложение съдържа TDatabase, която сочи към BDE псевдоним. По време на изпълнение пакетът ми се зарежда динамично и се извиква метод в пакета, който създава TQuery и го отваря, попълва обект с върнатите данни и след това връща обекта в основното приложение. TQuery използва TDatabase в основното приложение, за да се свърже с базата данни. Всичко това работи добре, но когато затворя приложението, получавам нарушение на достъпа: „Проект C:...GUI.exe с грешка със съобщение „нарушение на достъпа при 0x7c9102db: запис на адрес 0x00040ffc“. Процесът е спрян. Използвайте стъпка или изпълнение за продължи". Ако моят метод създава TQuery, но не го отваря, тази грешка не възниква. Нямам идея защо се случва това! Когато затворя това приложение, моят TQuery се затваря и освобождава добре, пакетът ми се разтоварва добре, но след като формулярът бъде унищожен, възниква грешка. Между другото използвам Delphi 5, опитах се да бъда кратък, така че ако съм пропуснал някаква полезна информация, уведомете ме, получавам всяка помощ с благодарност.

Благодаря

p.s. Знам, че използването на Delphi 5 и BDE е архаично, но засега съм останал с него!


person Steve    schedule 03.11.2010    source източник


Отговори (3)


Ами ако не освободите своя TQuery? Искам да кажа, опитайте се да не освобождавате вашия TQuery обект, когато приложението приключи.

person heximal    schedule 03.11.2010
comment
Добре, току-що опитах това, но няма значение, грешката все още се появява - person Steve; 03.11.2010
comment
TQuery притежава ли се от друг компонент? Или създаден като Qry := TQuery.Create(nil)? Ако първото - person Gerry Coll; 03.11.2010
comment
Не е собственост на нищо, създавам го с нулев собственик, както показахте (защото класът, в който се намира, не е извлечен от TComponent) - person Steve; 03.11.2010

Това се случи с мен, използвайки dbExpress, секцията за финализиране се задейства преди деструктор на модул с данни, когато приложението беше Abort()ed и това причини много главоболие.

И така, моето предположение би било това

  • Драйверът за връзка на BDE (или някакъв друг ресурс) се финализира преди унищожаването на нещо, което го използва, следователно се опитва да финализира връзката два пъти.

Казвам драйвер, защото те обикновено се зареждат/инициализират само при поискване, така че няма да има грешка, ако не се използва. Така че може би, когато вашият пакет бъде разтоварен, той финализира драйверите.

Опитайте тази:

  • заредете пакета си,
  • използвайте TQuery, съдържащ се в пакета,
  • разтоварете пакета си,
  • използвайте друг TQuery, създаден в основното приложение,

и вижте дали това работи без повдигане на изключения. Ако не работи, предполагам, че може да съм прав и ще се опитаме да разберем как да го направим.

Бог да благослови!

person Trinidad    schedule 03.11.2010
comment
Току-що се опитах да създам и използвам друга tquery след разтоварването на моя пакет, но заявката работи добре и AV все още се появява при затваряне на приложението. - person Steve; 03.11.2010
comment
Открих, че ако свържа моя TQuery към TDatabase в рамките на пакета, тогава грешката не възниква, освен ако нямам и TDatabase в приложението, което се отваря. - person Steve; 03.11.2010

Звучи като проблем с поръчката за инициализация/финализиране на модул. Обикновено това се определя от реда на единиците в списъците с употреби и какви пакети изисква вашият пакет.

Най-добрият начин да се опитате да го разрешите е да отстраните грешки в Delphi с Delphi или вашия пакет с .EXE.
Последното е важно, защото по-старите версии на Delphi не винаги намират символите за вашия пакет, ако започнете да отстранявате грешки с вашия EXE.

стъпки

  1. Стартирайте Delphi, който не съдържа вашия пакет
  2. Заредете вашия пакет в Delphi
  3. Задайте хоста на вашия пакет да бъде Delphi
  4. Компилирайте пакета си с пълна информация за отстраняване на грешки и активирайте опцията „debug DCU's“
  5. Стартирайте вашия пакет (той сега трябва да зареди Delphi, след това вашия пакет)
  6. Прекратете Delphi
  7. Гледайте стека на повикванията, когато се появи AV

Може да искате да зададете точки на прекъсване, за да наблюдавате реда си за инициализация/финализиране (вижте тази публикация, препратките и коментарите за дискусия за това).

След това се заемете със своите списъци с употреби и секции с изисквания за пакета.

--джероен

person Jeroen Wiert Pluimers    schedule 03.11.2010
comment
Докато забележката за инициализация/финализиране изглежда валидна, техниката за отстраняване на грешки в Delphi с Delphi работи, докато се опитва да намери грешки по време на проектиране, което се случва в IDE. Тук той говори за зареждане на пакети по време на изпълнение (като dlls), тоест, докато приложението работи. Няма нищо общо с отстраняването на грешки в компонентите на Delphi. - person Trinidad; 04.11.2010
comment
Останах с впечатлението, че пакетите са свързани с времето за проектиране. Техниката за отстраняване на грешки работи еднакво добре при отстраняване на грешки в пакети по време на изпълнение. - person Jeroen Wiert Pluimers; 04.11.2010