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

Вниз

DLL и IB   Найти похожие ветки 

 
Snip ©   (2004-09-10 11:57) [0]

Приветик!!!! ВСЕМ!!! Млин может зхдесь есть народ кто уже сталикивалься с такой проблемой как разработка плагинов 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, или я опять заблуждаюсь??? ПОМОГИТЕ ПЛЗ! Заранее спасибо!!!!


 
Vlad ©   (2004-09-10 12:12) [1]


> Snip ©   (10.09.04 11:57)  

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

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

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


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


> Vlad ©

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


 
Vlad ©   (2004-09-10 12:54) [3]


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


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

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


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

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


 
Snip ©   (2004-09-10 13:01) [4]


> 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 13:04) [5]


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

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


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


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

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


 
Vlad ©   (2004-09-10 14:07) [7]

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


 
Zacho ©   (2004-09-10 19:24) [8]

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


 
DrPass ©   (2004-09-11 11:01) [9]


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

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


 
Snip ©   (2004-09-12 14:36) [10]


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

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


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

>Snip

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



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

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

Наверх




Память: 0.49 MB
Время: 0.092 c
1-1096013983
webpauk
2004-09-24 12:19
2004.10.10
как Упаковать несколько Bitmap в один файл


11-1081096004
Delphi5.01
2004-04-04 20:26
2004.10.10
To: Владимиром Кладовым


8-1090167181
Wistful
2004-07-18 20:13
2004.10.10
WaveOutWrite???


4-1093986950
S@shka
2004-09-01 01:15
2004.10.10
нет работает SetWaitableTimer


1-1095843296
[BAD]Angel
2004-09-22 12:54
2004.10.10
Как убрать картинку с TImage?