Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL и IB [D7, IB4.x, IB5.x, IB6.x]


Snip ©   (2004-09-10 11:57:00) 

Приветик!!!! ВСЕМ!!! Млин может зхдесь есть народ кто уже сталикивалься с такой проблемой как разработка плагинов DLL для работы с IB, причем подключение к IB идет в главной форме приложения, а дополнительные формы для работы с IB подключаються динамически через DLL и вот как мне передать в DLL ссылку уже открытой базы данных, делал так:

procedure AddEmployee(App: TApplication; AID: ShortString; HIBD: Pointer); stdcall;

implementation

{$R *.dfm}

procedure AddEmployee(App: TApplication; AID: ShortString; HIBD: Pointer);
var
 TempApp: TApplication;
 fEditUsers: TfEditUsers;
begin
 ShowMessage('Ошибка при подключении DLL');
 TempApp:=Application;
 Application:=App;
 fEditUsers:=TfEditUsers.Create(Application);
 fEditUsers.IBD.SetHandle(HIBD);
 fEditUsers.ID:='0'{AID};
 fEditUsers.IsAdd:=True;
 fEditUsers.ShowModal;
 FreeAndNil(fEditUsers);
 Application:=TempApp;
end;


сначала я парилься с хендлом TIBDatabase, потому что свойства Handle было типа PVoid, думал я думал и до меня вроде доперло что это всего лишь паскалевский Pointer, или я опять заблуждаюсь??? ПОМОГИТЕ ПЛЗ! Заранее спасибо!!!!


yaric   (2004-09-13 19:15:00) [1]

>Snip

Пакеты использовать также как и библиотеки
только вместо LoadLibrary LoadPackage вызывать надо.
Опыт показывает что с пакетами намного удобнее,
ну хотя бы из=за того что Application передавать не надо


Snip   (2004-09-12 14:36:00) [2]


> Zacho ©   (10.09.04 19:24) [8]

А вот это уже интереснее... ты случаем не знаешь ссылку на статейку по этому поводу??? Я слышал на тему по поводу использования пакетов, но как ее реализовать....


DrPass   (2004-09-11 11:01:00) [3]


> Это я уже давно знаю... давно с ShareMem разобрался, но
> понимешь, я же String не использую....

Если ты передаешь указатель на экземпляр класса, тоже нужно использовать sharemem


Zacho   (2004-09-10 19:24:00) [4]

Проще всего использовать BPL а не DLL


Vlad   (2004-09-10 14:07:00) [5]

Что касается PChar - тут использовать ShareMem не нужно, но тогда ты сам должен выделять память под указатель, до того как передать его в библиотеку, а так же самостоятельно освобождать память из под этого указателя в конце.
По поводу ShortString - сам лично не проверял, но сдается мне, что ты ошибаешься.
Тем более что ясно же написано:
This applies to all strings passed to and from your DLL--even those that are nested in records and classes


Snip   (2004-09-10 13:14:00) [6]


> Vlad ©   (10.09.04 13:04) [5]

Это я уже давно знаю... давно с ShareMem разобрался, но понимешь, я же String не использую.... я использую ShortString или PChar, а при использовании этих типов ShareMem не обязателен....


Vlad   (2004-09-10 13:04:00) [7]


> Snip ©   (10.09.04 13:01) [4]

Ну а ты разобрался с той аннотацией, которая написана в .DPR твоей библиотеки, по поводу использования типа string и модуля sharemem ?


Snip   (2004-09-10 13:01:00) [8]


> Vlad ©   (10.09.04 12:54) [3]


> Вобще неплохо бы посмотреть как ты это делаешь (саму реализацию
> и вызов).

Реализация написана в вопросе этой ветки, а вызов:
procedure AddEmployee(App: TApplication; AID: ShortString; AIBD: TIBDatabase); stdcall; external 'dll\employee.dll';
...
procedure TfObjects.actAddEmployeeExecute(Sender: TObject);
begin
 AddEmployee(Application, lvObjects.Selected.Caption, DM.IBDatabase);
end;


Vlad   (2004-09-10 12:54:00) [9]


> Snip ©   (10.09.04 12:17) [2]


> это я вычитал где то в какой то умной статье

Если у тебя и библиотека и хост-аппликация написаны на Delphi, то можешь смело передавать указатель на TIBDataBase, проблем не будет.


> Функция вообще не вызываеться

Что значит не вызывается?
Вобще неплохо бы посмотреть как ты это делаешь (саму реализацию и вызов).
Если передаешь тип string, то нужно в uses добавлять модуль ShareMem (читай аннотацию в dpr-е библиотеки). Если же PChar, то нужно самому выделять память под переменную.
И еще, надеюсь, не забыл указать stdcall ?


Snip   (2004-09-10 12:17:00) [10]


> Vlad ©

как я знаю вроде правильнее передавать Handle, это я вычитал где то в какой то умной статье (причем на английском языке...)... щас попробуем так как ты посоветовал!! но вопрос еще: при передачи параметры AID типа PChar или sHORTsTRING Функция вообще не вызываеться


Vlad   (2004-09-10 12:12:00) [11]


> Snip ©   (10.09.04 11:57)  

Почему бы просто не передать указатель на экземпляр TIBDataBase?
напр.:

procedure AddEmployee(App: TApplication; AID: ShortString; IBD: TIBDataBase);

только компилировать проект нужно будет с Runtime Packages


Наверх

Титульная страница Поиск, карта сайта Написать письмо