Форум: "Система";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
ВнизПро 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c