Форум: "Базы";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизПлагины в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c