![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про DLL [D6, Win2k, WinXP]
bob5 © (2002-08-05 07:49:00)Есть DLL с ADO компонентами на datamodul
как инициализировать datamodul и потом корректно закрыть
bob5 (2002-09-02 07:17:00) [1]Спасибо большое!
mirolex (2002-08-31 19:35:00) [2]"end." в конце пропал
mirolex (2002-08-31 19:33:00) [3]Вот код модуля. Это все что надо для правильной работы dll
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TDataModule1 = class(TDataModule)
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule1: TDataModule1;
implementation
{$R *.DFM}
initialization
begin
DataModule1 := TDataModule1.Create(nil);
end;
finalization
begin
DataModule1.free;
end;
bob5 (2002-08-31 11:14:00) [4]К сожалению я не застал тяжелого наследия :)(не в силу юного возраста) и к стати не считаю себя знатаком, а посему не зазорно спросить: как прописать эти секции initialization и finalization в библиотеке в нелпе ничего не понять
Shaman_Naydak (2002-08-30 13:42:00) [5]
> bob5 (29.08.02 18:19)
И что там написано противоречащего
> Просто Ламер (23.08.02 18:57)
?
ExitProc - это тяжелое наследие паскаля :)
И, между прочим, в 5 дельфях был глюк, который, по-моему, лечился установкой 2-го апдейта, из-за которого DLLEntryPoint не отрабатывал на завершение, а вот финализация - как часы!
bob5 (2002-08-29 18:19:00) [6]Насчет извратов: в Helpe от Delphi 6 наберите строчку initialization (library) и посмотрите что есть изврат, а что нет ;-) (отмечу что отдельной, специальной строчкой)
Просто Ламер (2002-08-23 18:57:00) [7]RTFM
Секции
initializationиfinalization
главного модуля DLL - вот это точно не противоречит объектно-ориентированному программированию
и никаких извратов не надо, хотя экспорт функций типа UnloadMyDLL - тоже очень даже правильно
PSERG (2002-08-23 06:35:00) [8]Вы о чем народ......................
Пиши процедуру типа...
procedure DllEntryPoint(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: DM := TDataBuhg.Create(nil);
DLL_PROCESS_DETACH: DM.Free;
end;
end;
Между begin и en d пишешь...
DllProc := @DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
И все!
bob5 (2002-08-23 06:15:00) [9]to still
Спасибо, за информацию. Учту.
to doomin
Пример: В ДЛЛ функция редактирующая адрес клиента. Т.е. пихаешь ей параметр класс адреса заполненного кодами стран, республик, городов и т.д. , а эта функция заполняет твой класс строковыми значениями соответственно кодам. При загрузке ДЛЛ загружаешь списки названием стран, республик, городов... ,а при выгрузке очищаешь эти списки и всего-то. ПРИЯТНО! (Реально задача более сложная и обращения к загруженным спискам очень частое и не только для преобразования), но вот замечание от still немного сужает область применения этой штуки, но для того что я написал отлично идет. Кстати это не противоречит объектно-ориентированному программированию!
doomin (2002-08-20 11:58:00) [10]Лучше всего все-таки использовать интерфейс или на худой конец 2 экспортные функции инициализации и завершения. А для ADO не забыть перед коннектом к базе написать
OleCheck(CoInitialize(nil));
иначе будет ругаться. Я предпочитаю интерфейс, все-таки мы живем во время объектно-ориентированного программирования и экспортная функция получается одна и менять потом легче
still (2002-08-06 13:19:00) [11]2 bob5
Нужно отметить, что это не всегда будет работать.
Видимо, это ошибка компилятора.
Т.е., например я пытался на выгрузке DLL записывать что-то файл. Иногда работает, иногда лезет exception. С чем это связано - не знаю.
Поэтому рекомендую, если писать на Delphi, то из DLL экспортировать ф-цию типа UnloadMyDLL и в ней производить все финальные манипуляции.
Под VC++ таких проблем замечено не было.
bob5 (2002-08-06 13:03:00) [12]Сам вспомнил. В проекте ДЛЛ пишем код
Var
SaveExit: Pointer;
procedure LibExit;
begin
//Здесь код для овобождения ресурсов
ExitProc := SaveExit;
end;
begin
//Здесь код для инициализации
SaveExit := ExitProc;
ExitProc := @LibExit;
end;
Желаю удачи всем!
bob5 (2002-08-06 12:45:00) [13]Этот вариант я сейчас и использую. Ситуация в следующем:
Когда грузиться ДЛЛ то сначала выполняется секция БЕГИН и ЕНД
а при выгрузке выполняется процедурка записанная в переменную "выхода" вот ее то название я и не помню. в секции БЕГИН и ЕНД нужно сохранить точку входа в процедуру завершения
и переопределить свою процедуру выхода а при выходе в своей процедуре завершения вызвать стандартную. Это нужно для того чтобы не вызывать функции инициализации и освобождения явно, а определять их в контексте загрузки и выгрузки. Через два месяца я буду помнить что и как вызвать но скорее всего сломаю башку не понимая почему ДЛЛ не работает не вызвав инициализацию и освобождение :)
PavelB (2002-08-06 11:08:00) [14]bob5 при таком способе должно быть 2 функции
1 для создания и инициализации
2 для освобеждения ресурсов
bob5 (2002-08-06 09:48:00) [15]Инициализацию я напишу между begin и end а free где?
IlyaA (2002-08-06 07:57:00) [16]А что тебе мешает это сделать?
IlyaA (2002-08-06 07:57:00) [17]А что тебе мешает это сделать
bob5 (2002-08-06 05:06:00) [18]Это так но хотелось бы при загрузке DLL инициализировать Datamodul c ADO компонентами, а из проги вызывать функции DLL использующие эти ADO компоненты, а при выгрузке DLL корректно все закончить.
IlyaA (2002-08-05 15:23:00) [19]В dll ты должен сделать ф-ю, которая создаёт новый объект (товой DataModule) и возвращает его.
Создаёшь юнит в котором описываешь интерфейс /только интерфейс!!!/ твоего DataUnit"а и ф-ю из dll.
После чего в нужном месте твоей программы ты получаешь указатель на объект при помощи ф-ии из dll и преобразовываешь его к нужному типу. Для его удаления просто пользуйся Free или Destroy