Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.04;
Скачать: CL | DM;

Вниз

Про DLL   Найти похожие ветки 

 
bob5   (2002-08-05 07:49) [0]

Есть DLL с ADO компонентами на datamodul
как инициализировать datamodul и потом корректно закрыть


 
IlyaA ©   (2002-08-05 15:23) [1]

В dll ты должен сделать ф-ю, которая создаёт новый объект (товой DataModule) и возвращает его.
Создаёшь юнит в котором описываешь интерфейс /только интерфейс!!!/ твоего DataUnit"а и ф-ю из dll.
После чего в нужном месте твоей программы ты получаешь указатель на объект при помощи ф-ии из dll и преобразовываешь его к нужному типу. Для его удаления просто пользуйся Free или Destroy


 
bob5   (2002-08-06 05:06) [2]

Это так но хотелось бы при загрузке DLL инициализировать Datamodul c ADO компонентами, а из проги вызывать функции DLL использующие эти ADO компоненты, а при выгрузке DLL корректно все закончить.


 
IlyaA ©   (2002-08-06 07:57) [3]

А что тебе мешает это сделать


 
IlyaA ©   (2002-08-06 07:57) [4]

А что тебе мешает это сделать?


 
bob5   (2002-08-06 09:48) [5]

Инициализацию я напишу между begin и end а free где?




 
PavelB   (2002-08-06 11:08) [6]

bob5 при таком способе должно быть 2 функции
1 для создания и инициализации
2 для освобеждения ресурсов


 
bob5   (2002-08-06 12:45) [7]

Этот вариант я сейчас и использую. Ситуация в следующем:
Когда грузиться ДЛЛ то сначала выполняется секция БЕГИН и ЕНД
а при выгрузке выполняется процедурка записанная в переменную "выхода" вот ее то название я и не помню. в секции БЕГИН и ЕНД нужно сохранить точку входа в процедуру завершения
и переопределить свою процедуру выхода а при выходе в своей процедуре завершения вызвать стандартную. Это нужно для того чтобы не вызывать функции инициализации и освобождения явно, а определять их в контексте загрузки и выгрузки. Через два месяца я буду помнить что и как вызвать но скорее всего сломаю башку не понимая почему ДЛЛ не работает не вызвав инициализацию и освобождение :)


 
bob5   (2002-08-06 13:03) [8]

Сам вспомнил. В проекте ДЛЛ пишем код
Var
SaveExit: Pointer;
procedure LibExit;
begin
//Здесь код для овобождения ресурсов
ExitProc := SaveExit;
end;

begin
//Здесь код для инициализации
SaveExit := ExitProc;
ExitProc := @LibExit;
end;
Желаю удачи всем!


 
still ©   (2002-08-06 13:19) [9]

2 bob5
Нужно отметить, что это не всегда будет работать.
Видимо, это ошибка компилятора.
Т.е., например я пытался на выгрузке DLL записывать что-то файл. Иногда работает, иногда лезет exception. С чем это связано - не знаю.
Поэтому рекомендую, если писать на Delphi, то из DLL экспортировать ф-цию типа UnloadMyDLL и в ней производить все финальные манипуляции.
Под VC++ таких проблем замечено не было.


 
doomin   (2002-08-20 11:58) [10]

Лучше всего все-таки использовать интерфейс или на худой конец 2 экспортные функции инициализации и завершения. А для ADO не забыть перед коннектом к базе написать
OleCheck(CoInitialize(nil));
иначе будет ругаться. Я предпочитаю интерфейс, все-таки мы живем во время объектно-ориентированного программирования и экспортная функция получается одна и менять потом легче


 
bob5   (2002-08-23 06:15) [11]

to still
Спасибо, за информацию. Учту.
to doomin
Пример: В ДЛЛ функция редактирующая адрес клиента. Т.е. пихаешь ей параметр класс адреса заполненного кодами стран, республик, городов и т.д. , а эта функция заполняет твой класс строковыми значениями соответственно кодам. При загрузке ДЛЛ загружаешь списки названием стран, республик, городов... ,а при выгрузке очищаешь эти списки и всего-то. ПРИЯТНО! (Реально задача более сложная и обращения к загруженным спискам очень частое и не только для преобразования), но вот замечание от still немного сужает область применения этой штуки, но для того что я написал отлично идет. Кстати это не противоречит объектно-ориентированному программированию!


 
PSERG   (2002-08-23 06:35) [12]

Вы о чем народ......................
Пиши процедуру типа...
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);

И все!


 
Просто Ламер   (2002-08-23 18:57) [13]

RTFM
Секции
initialization и finalization
главного модуля DLL - вот это точно не противоречит объектно-ориентированному программированию

и никаких извратов не надо, хотя экспорт функций типа UnloadMyDLL - тоже очень даже правильно






 
bob5   (2002-08-29 18:19) [14]

Насчет извратов: в Helpe от Delphi 6 наберите строчку initialization (library) и посмотрите что есть изврат, а что нет ;-) (отмечу что отдельной, специальной строчкой)


 
Shaman_Naydak ©   (2002-08-30 13:42) [15]


> bob5 (29.08.02 18:19)

И что там написано противоречащего
> Просто Ламер (23.08.02 18:57)
?
ExitProc - это тяжелое наследие паскаля :)
И, между прочим, в 5 дельфях был глюк, который, по-моему, лечился установкой 2-го апдейта, из-за которого DLLEntryPoint не отрабатывал на завершение, а вот финализация - как часы!


 
bob5   (2002-08-31 11:14) [16]

К сожалению я не застал тяжелого наследия :)(не в силу юного возраста) и к стати не считаю себя знатаком, а посему не зазорно спросить: как прописать эти секции initialization и finalization в библиотеке в нелпе ничего не понять


 
mirolex   (2002-08-31 19:33) [17]

Вот код модуля. Это все что надо для правильной работы 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;


 
mirolex   (2002-08-31 19:35) [18]

"end." в конце пропал


 
bob5   (2002-09-02 07:17) [19]

Спасибо большое!



Страницы: 1 вся ветка

Текущий архив: 2002.11.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
6-11360
Yuri Btr
2002-08-30 12:51
2002.11.04
Проблема с NMFTP


4-11539
kex86
2002-09-22 03:43
2002.11.04
---|Ветка была без названия|---


1-11250
sova
2002-10-25 16:21
2002.11.04
Как вернуть из DLL динамический массив


4-11560
Igor_i
2002-09-23 13:37
2002.11.04
Как скопировать в буфер имена всех файлов и папок корня CD


3-11090
KIR
2002-10-11 01:04
2002.11.04
Как скрыть бэнд в FastReport e?