Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
6-11368
Eldar
2002-09-02 14:47
2002.11.04
Вход в сеть


3-11128
ACR
2002-10-16 14:44
2002.11.04
ADO -> Access


8-11345
loon
2002-07-12 14:54
2002.11.04
AVI в ЕХЕ файле


14-11465
Neox
2002-10-11 09:11
2002.11.04
Email клиент: какой?


6-11373
JohnBurg
2002-09-04 11:50
2002.11.04
Не пойму почему вылетает ошибка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский