Выключите BDE из кода

У нас есть устаревшее приложение, использующее BDE. (BDE продолжает работать на удивление хорошо, учитывая его возраст).

Бывают случаи, когда нашему приложению необходимо манипулировать папками (переименовывать, перемещать и т. Д.), Но файл .NET или .LCK остается открытым в папке, предотвращая это. Нам не удалось найти какую-либо таблицу или запрос, все еще открытые в нашем коде.

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

Стандартные заявления об отказе от ответственности: Да, BDE мертв. Да, нам следует перейти на более современную базу данных. Да, когда-нибудь BDE просто перестанет работать. Имея почти 2 миллиона строк устаревшего кода, миграция (даже с платформой, которая в некоторой степени совместима с плагинами, например Sybase Advantage) - не дешевый проект, поэтому мы еще не сделали этого ...


person RobertFrank    schedule 19.04.2012    source источник


Ответы (2)


Обычно вам не нужно ничего делать для завершения работы BDE.
Все сеансы BDE освобождаются в разделе «Завершение» таблицы DBTables. Это закроет все, и когда сеанс по умолчанию также будет уничтожен, он при необходимости вызовет DbiDLLExit, а затем DbiExit, оба из модуля BDE.

Теперь, если вы хотите выключить BDE раньше, я предлагаю вам имитировать финализацию, а затем инициализацию частей DBTables (отказ от ответственности: ограниченное тестирование, используйте осторожно ...), например:

procedure BDEKill;
begin
// from finalization
  Sessions.Free;
  Sessions := nil;
end;

procedure BDEReStart;
begin
// from initialization
  Sessions := TSessionList.Create;
  Session := TSession.Create(nil);
  Session.SessionName := 'Default'; { Do not localize }
end;

и используйте это как:

BDEKill;
try
  // move my folders
finally
  BDEReStart;
end;
person Francesca    schedule 19.04.2012
comment
Хотя не все элементы в вашем примере кода (и код завершения) были видны в интерфейсе DBTables, переменная Sessions была. Используя только эту переменную, я смог разблокировать указанные файлы. Спасибо, Франсуа! - person RobertFrank; 20.04.2012
comment
+1: @ François Теперь, когда код был протестирован, не думаете ли вы, что пост нужно подправить? - person menjaraz; 20.04.2012
comment
@menjaraz, код убран! (Даже уволил BDEAdmin, чтобы проверить это; первый раз за много лет!) - person Francesca; 20.04.2012

Разблокировка файла - еще одно возможное (крайнее) решение вашей проблемы:

Я предлагаю вам изучить исходный код File Unlock от opc0de.


Цитата:

Слишком часто файл невозможно удалить, потому что он используется другим приложением. Этот инструмент позволяет разблокировать этот файл для удаления.


Внешний вид:

Разблокировка файла с помощью opc0de


Возможности:

  • Разблокировать файл
  • Разблокировать и удалить файл
  • Посмотреть, какие процессы используют файл
  • Завершить процессы, использующие файл

Ссылка для скачивания:

person menjaraz    schedule 19.04.2012
comment
Извините, я уже удалил свои комментарии ... Это обсуждение привело к не связанной теме. Я считаю, что я бы предпочел использовать это, если естественная форма BDE (опубликованная Франсуа) не будет работать ;-) - person TLama; 20.04.2012
comment
@TLama: Вы правы. Самый чистый и элегантный способ решить проблему BDE - использовать все возможности, предоставляемые самим BDE. Разблокировка файла - это крайнее средство, хотя оно работает и даже рекомендуется в некоторых крайних случаях. Спасибо за понимание. - person menjaraz; 20.04.2012