Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1154865648
Sele
2006-08-06 16:00
2006.08.27
открытие файла на 1 копии программы


6-1144075064
Yegorchic
2006-04-03 18:37
2006.08.27
Кодировка и IdPOP3


15-1154581771
Elen
2006-08-03 09:09
2006.08.27
Как работать с Asm файлами больше 5Мб?


1-1152681599
Сергей_С
2006-07-12 09:19
2006.08.27
Обмен данными между процессами


2-1154513346
o_serg
2006-08-02 14:09
2006.08.27
Tframe с TactionList проблема





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский