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