Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1095937517
Nikolay M.
2004-09-23 15:05
2004.10.10
Авторам вопросов "Что лучше делать: ролбэк или комит" посвящается


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


3-1095238349
Донской
2004-09-15 12:52
2004.10.10
BOF или EOF имеет значение true в adodataset.


1-1096024129
DimonNew
2004-09-24 15:08
2004.10.10
Clipboard+Word


3-1094732636
bers
2004-09-09 16:23
2004.10.10
Добавить поля не потеряв данных





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