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

Вниз

Плагины в bpl и заморочки с TTable   Найти похожие ветки 

 
Olegas   (2006-06-19 18:04) [0]

Есть основная программа и в ней форма. На ней Database1 с именем MyDB и компонент Table1: TTable.
И есть bpl, в которой экспортируются процедура и функция:

procedure Proc_Show_Table(Database1: Tdatabase; Tablea: TTable);
begin
try
   Form2:=TForm2.Create(nil);
   Form2.Label1.Caption:=tablea.DatabaseName;
   Form2.ShowModal;
 finally
   Form2.Free;
end;
end;

function Get_Table_PTR(Tablea: TTable):TTable;
begin
result:=tablea;
end;

Из основного приложения
Подключаюсь к Database1, Table1.active:=true.
На форме есть две кнопки.
По нажатию Кнопки2 вызывается Get_Table_PTR
....
@MyFun:=GetProcAddress(MyModule, "Get_Table_PTR");
tbl:=MyFun(form1.table1);
label1.Caption:=tbl.DatabaseName;
....
В результате после клика на кнопке в Label1 Вижу надпись "MyDB".

По нажатию Кнопки1 вызывается Proc_Show_Table
....
  @ShowTable:=GetProcAddress(MyModule, "Proc_Show_Table");
   showtable(database1, table1);
....

В результате открывается форма а на ней в Label1 вижу абракадабру.
Очевидно, я в чем-то не прав, хотя результат должен быть совершенно одинаков на обоих формах.
В чем проблема?


 
Olegas   (2006-06-20 07:45) [1]

Я так подозреваю, что в подгружаемые процедуры и функции передается ближний указатель на объект, а должен передаваться дальний. Можно ли как-то на это влиять?
Может я и ошибаюсь. Кто знает-подскажите.


 
ANB ©   (2006-06-20 09:37) [2]

Я так подозреваю, что ты собрал приложение без флажка "использовать рантайм пакеты". А вот ближние указатели, имхо, давно уже не передаются, ибо смысла не имеют - смещение то 32 разряда.


 
kaif ©   (2006-06-20 10:44) [3]

Проверь Font.Charset на своих формах. Установи RUSSIAN_CHARSET.
Может поможет.


 
Olegas   (2006-06-20 11:20) [4]

Замечательно!
Теперь у меня при вызове процедуры Access violation at address ..... in module rtl70.bpl. Read address 00000022.
Почему?


 
evvcom ©   (2006-06-20 11:29) [5]

Из машины выходил? По колесу пинал? Ну тогда не знаю... Попробуй еще раз выйти и войти, из дельфей естественно. Если не поможет, то из винды. Такое часто бывает с 7-ой пиратской дельфой.


 
kaif ©   (2006-06-20 14:14) [6]

Какой размер у EXE-файла?
Какие пакеты загружены?
Ты загружаешь пакеты работы с базами данных (например, пакеты для BDE или IBX) динамически или указал их в списке build with runtime packages?


 
kaif ©   (2006-06-20 14:21) [7]

Например у меня была ситуация, когда пакет dclib скомпилировался так, что размер EXE-файла стал 300K вместо 44K. Добавление dclib в список build with runtime packages уменьшило размер EXE-файла до 44K и исчезли некоторые очень странные Access Violations.


 
Olegas   (2006-06-20 16:48) [8]

1. Вообще-то у меня именно Delphi 7.
2. Размер ехе 33280
3. Я использую компоненты BDE. Я указал их в списке build with runtime packages.


 
Olegas   (2006-06-21 10:07) [9]

В общем, пересоздал я проекты с нуля (для ехе и bpl), поместил их в разные папки (раньше были в одной). И все работает.
Неприятно только одно, то что теперь за ехешником нужно таскать кучу стандартных bpl кроме своей. Неужели нельзя сделать так, чтобы часть библитек ликовались с приложением, а остальные оставались внешними?
И еще: где можно почитать, какие типы данных можно передавать в качестве параметров в процедуры и функции, вызываемые из dll, а какие нельзя? И зачем потребовался механизм обратных вызовов?


 
ANB ©   (2006-06-21 12:14) [10]


> Неужели нельзя сделать так, чтобы часть библитек ликовались
> с приложением, а остальные оставались внешними?

Не а. Точнее - можно, но тогда лучше забыть про передачу объектов по ссылке.


 
kaif ©   (2006-06-21 18:00) [11]

Если хочешь понять какие типы можно передавать в dll посмотри такие файлы как Windows.pas.

Механизм обратных очень полезен.
Допустим ты имеешь форму, на которой сделал ProgressBar.
При нажатии кнопки грузишь динамически dll, которая начинает что-то делать, что должно модифицировать ProgressBar. Как ты это сделаешь без обратного вызова?
ИМХО, самое простое решение здесь - именно юзать обратный вызов. Функции, которую ты отыскал в динамически загруженной dll с помощью GetProcAddress, при вызове передай указатель на процедуру в основном приложении, которая может модифицировать ProgressBar. А затем вызывай эту процедуру из dll, передавая в качестве параметра позицию для ProgressBar-а.
В результате ProgressBar будет модифицироваться процедурой основного приложения.
Не знаю, понятно ли описал.


 
kaif ©   (2006-06-21 19:57) [12]

Кстати, я сейчас собрал пробно инсталлятор (InnoSetup) для своей системы и весь инсталлятор занял менее 2 Мбайт.

Вошли (кроме моих файлов) еще и такие системные пакеты Delphi:

adortl60.bpl (я использую еще ADO для связи с FoxPro)
cds60.bpl
dbrtl60.bpl
dsnap60.bpl
ibxpress60.bpl (я использую еще IBX)
rtl60.bpl
vcl60.bpl
vcldb60.bpl
vclx60.bpl

Меня лично вдохновляет.


 
ANB ©   (2006-06-22 10:42) [13]


> занял менее 2 Мбайт.

Не, такие маленькие инсталляторы по нынешним временам - некузяво. А чем будешь забивать остальное место на CD ?


 
evvcom ©   (2006-06-22 12:37) [14]

> А чем будешь забивать остальное место на CD ?

Наверное, туториалом. :)



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

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

Наверх




Память: 0.5 MB
Время: 0.04 c
1-1152772200
Альф
2006-07-13 10:30
2006.08.27
Как передать класс между приложениями ?


2-1154342098
zamtmn
2006-07-31 14:34
2006.08.27
Как "динамический" вызать конструктор?


2-1155048317
Ega23
2006-08-08 18:45
2006.08.27
TBitmap to TIcon


1-1152888285
Andrey Molchanov
2006-07-14 18:44
2006.08.27
Загрузить иконку определенной цветности


1-1152825347
DevilDevil
2006-07-14 01:15
2006.08.27
Условная Компиляция