|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка при выгрузке DLL
Доброго времени суток ...
Из главного модуля программы происходит динамическая загрузка DLL. В DLL вносятся данные, в том числе и с помощью OpenDialog, которые потом сохраняются в базу Interbase. После сохранения данных в базе предусмотрена выгрузка DLL. Код программы: Код:
unit Unit2; interface uses Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, DBGrids, StdCtrls, Grids, DBCtrls, DB, Mask; type TShowFormins=procedure(handle: Thandle); stdcall; .... procedure TForm2.N4Click(Sender: TObject); var dllins:thandle; ShowFormins:TShowFormins; begin dllins:=LoadLibrary('ins.dll'); @ShowFormins:=GetProcAddress(dllins, 'ShowFormins'); ShowFormins(handle); freelibrary(dllins); end; Код DLL Код:
unit insUnit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DBCtrls, Mask, DB, IBCustomDataSet, IBDatabase, IBTable, Grids, DBGrids; type TForm1 = class(TForm) ...... private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure ShowFormins(handle: Thandle); export; stdcall; implementation {$R *.dfm} procedure ShowFormins(handle: Thandle); begin application.handle:=handle; form1:=tform1.create(application); form1.ShowModal; form1.Free; end; procedure TForm1.FormShow(Sender: TObject); begin form1.IBTable1.Insert; form1.Button1.SetFocus; form1.dbmemo1.Clear; form1.DBEdit1.Clear; form1.DBEdit2.Clear; form1.DBEdit3.Clear; form1.DBEdit4.Clear; form1.DBEdit5.Clear; end; procedure TForm1.Button1Click(Sender: TObject); begin with OpenDialog1, dbMemo1 do if Execute then Lines.LoadFromFile(FileName); end; procedure TForm1.Button2Click(Sender: TObject); begin if IBTable1.Modified then DataSource1.DataSet.FieldByName('t_data').AsString:=formatdatetime('dd.mm.yyyy',now()); IBTable1.Post; form1.dbmemo1.Clear; form1.DBEdit1.Clear; form1.DBEdit2.Clear; form1.DBEdit3.Clear; form1.DBEdit4.Clear; form1.DBEdit5.Clear; Form1.Close; end; procedure TForm1.Button3Click(Sender: TObject); begin form1.IBTable1.Cancel; form1.Close; end; end. При использовании OpenDialog DLL не выгружается и при повторной загрузке (без выхода из программы) выдает ошибку "I/O error for file 'имя базы'". Выручайте, не могу найти где ошибка.... Спасибо. |
#2
|
||||
|
||||
Код:
application.handle:=handle; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
Цитата:
Не, это правильно. Неправильно другое. Должно быть: Код:
form1 := tform1.create(Nil); |
#4
|
|||
|
|||
Цитата:
Вместо form1:=tform1.create(application); ???? Так вроде в библии Фленова написано. |
#5
|
||||
|
||||
Нужно еще учитывать, что вызов OpenDialog порождает дополнительные потоки (так устроен "Проводник"), и они тоже могут вмешиваться.
Не стоит путать форумы с богадельнями. © Bargest |
#6
|
||||
|
||||
Нету здесь кода библиотеки вообще, ключевое слово library отсутствует
Проверок возможно не хватает, надо похоже так делать динамическую загрузку Код:
procedure TForm2.N4Click(Sender: TObject); var dllins:thandle; ShowFormins:TShowFormins; begin try dllins:= LoadLibrary('ins.dll'); if dllins <> 0 then begin @ShowFormins:=GetProcAddress(dllins, 'ShowFormins'); if addr(ShowFormins) <> nil then ShowFormins(handle); finally freelibrary(dllins); end; end else showMessage ('DLL not found...'); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Цитата:
Этого я и боялся... Потоки.... Мот кто-нибудь поможет с кодом. Как процедуру с opendialog "привязать" к "потокам". В программе для OpenDialog предусмотрена процедура выбора файла (имя файла не известно, но он текстовый) из одной конкретной директории и загрузки его в dbmemo. Т.е. OpenDialog не будет шариться по всему диску. Может предложите простую альтернативу OpenDialog. А может проще из DLL exe-шник сделать, или это неразумное решение? Спасибо. Последний раз редактировалось govorun, 31.10.2013 в 22:16. |
#8
|
||||
|
||||
Не там собака порылась, диалог здесь не влияет. Собрал подобную библитеку - загружается, грузит текст в DBMemo и без ошибок нормально выгружается. Попробуйте на время отключить все обращения к IBTable1 и убедитесь в этом.
З.Ы. Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
|||
|
|||
Цитата:
Чуть подробнее про это, если можно.... Спасибо |
#10
|
||||
|
||||
Цитата:
DefaultExt - расширение отображаемых файлов при показе диалога по умолчанию. Если оно *.txt, то только текстовые файлы и отобразятся. FileName - можно принудительно задать файл для выбора при первом запуске диалога в сборке, прям с путями. Filter - Здесь мастером задаются наборы расширений и потом можно выбирать из списка нужные. InitialDir - стартовая директория при показе диалога т.е. он откроется сразу в указанной папке. Options - дополнительные варианты открытия окошка, если флажок ofNoChangeDir выставить в true, то изменить случайно директорию будет проблематично. Там много чего ещё есть всякого. Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#11
|
|||
|
|||
Цитата:
Попробовал, на форме в DLL остались dbeditы - ни с чем не связанные, DBMEMO связан с opendialog и кноки закрывающие форму. Запуская прогу. В диспетчере задач Память указана 1292 КБ (сам екзешник 868 КБ). Прдгружаю DLL. В диспетчере задач Память указана 1924 КБ (сам DLL весит 628 КБ) Запускаю opendialog. В диспетчере задач Память указана 3756 КБ) Закрываю DLL. В диспетчере задач Память указана 3100 КБ) Получается что DLL не выгружается У меня в этой программе есть еще одна аналогичная библиотека. Так вот после "якобы выгрузке первой" вторая не загружается с той же ошибкой В общем пока ни один совет не помог.... Вот чего пмшет: Proect XXX.exe raised excepyion class EIBInterbaseError with message "I/O error for file "имя базы"" Error while trying to open file. Операция успешно завершена. Process stopped. Use step or run to continue. И после закрытия сообщения об ошибке выделяет в коде программы вот эту строку freelibrary(dllins); Где-то читал что можно сделать подобный opendialog только применением Listview или Richedit. Может подскажите код? Цитата:
Там код формы, которая находится в DLL Код:
library ins; uses SysUtils, forms, Classes, insUnit1 in 'insUnit1.pas' {Form1}; {$R *.res} exports ShowFormins; begin end. Последний раз редактировалось M.A.D.M.A.N., 01.11.2013 в 23:32. |
#12
|
||||
|
||||
код dll, что приведен в первом посте и есть весь код библиотеки?
Цитата:
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#13
|
||||
|
||||
Повторюсь, OpenDialog здесь ни причём
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject); begin // грузим в дибимемо файл напрямую dbMemo1.Lines.LoadFromFile('SomeText.txt'); end; Оффтоп: Понимаю, после бейсика наверное тяжело в другую среду вживаться но пжлст, сами пока выводы не делайте что работает, что нет, что выгружается, пусть это делают другие... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#14
|
|||
|
|||
Цитата:
Попробовал... Все работает. В менеджере задач наблюдал за памятью занятой программой... Библиотека выгружается!!! Похоже что проблема в opendislog (извините за выводы). P.S. про нормальную работу без opendislog я писал в самом начале |
#15
|
||||
|
||||
Вы думаете что я издеваюсь над неофитом? Вот смотрите сами, у меня это работает без ошибок
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |