Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

Кто разбираеться в DLL   Найти похожие ветки 

 
Snip ©   (2004-09-08 15:32) [0]

Привет всем! Такая проблема, пишу модульное приложение (с использованием DLL), в основном работа связана с базой данных Interbase. Что мне нужно передать в DLL чтобы в ней (DLL) происходила работа с уже открытой базой данных в приложении... Подскажите пожалуйся!!! Заранее спасибо!


 
Digitman ©   (2004-09-08 15:37) [1]


> Что мне нужно передать


ссылку на существующий объект класса TIBDatabase, св-во Active которого = True


 
Snip ©   (2004-09-08 15:46) [2]

я так и делал,

procedure AddEmployee(App: TApplication; AIBD: TIBDatabase; AIBT: TIBTransaction; AID: PChar); stdcall;

только при вызове выдает ошибочку...
Access violation at address XXXXX in module YYYYY. Read of address ZZZZZ


 
Digitman ©   (2004-09-08 15:56) [3]

собери оба проекта с опцией линкера BwRTP и не парься


 
Snip ©   (2004-09-08 16:01) [4]


> опцией линкера BwRTP

а можно отсюда по подробнее, что это за опция? и где найти ее описание?


 
Digitman ©   (2004-09-08 16:14) [5]

в станд.справке Делфи

Build with Run-Time Packages


 
Snip ©   (2004-09-08 16:25) [6]

ок, сенькс, теперь понял!!!


 
Mim1 ©   (2004-09-08 17:30) [7]


> собери оба проекта с опцией линкера BwRTP и не парься

:)


 
Snip ©   (2004-09-09 12:39) [8]

Млин, у меня все равно вылетает ошибка при вызове процедуры, вот пример:

procedure AddEmployee(App: TApplication; AIBD: TIBDatabase; AIBT: TIBTransaction; AID: PChar); stdcall;

implementation

{$R *.dfm}

procedure AddEmployee(App: TApplication; AIBD: TIBDatabase; AIBT: TIBTransaction; AID: PChar);
var
 TempApp: TApplication;
 fEditUsers: TfEditUsers;
begin
 TempApp:=Application;
 Application:=App;
 fEditUsers.IBD.Assign(AIBD);
 fEditUsers.IBT.Assign(AIBT);
 fEditUsers.ID:=AID;
 fEditUsers:=TfEditUsers.Create(Application, True);
 fEditUsers.ShowModal;
 FreeAndNil(fEditUsers);
 Application:=TempApp;
end;


в вызывающем модуле:

procedure AddEmployee(App: TApplication; AIBD: TIBDatabase; AIBT: TIBTransaction; AID: PChar); stdcall; external "dll\employee.dll";

...

procedure TfObjects.actAddEmployeeExecute(Sender: TObject);
begin
 AddEmployee(Application, DM.IBDatabase, DM.IBTransaction, PChar(lvObjects.Selected.Caption));
end;


вроде все правильно, но вылетает ошибка, подскажите плз.!!!


 
Digitman ©   (2004-09-09 12:53) [9]

на какой конкретно строчке ?


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


> на какой конкретно строчке ?

как я увижу в dll на какой строчке вылетает ошибка????


 
Digitman ©   (2004-09-09 13:37) [11]

ну как ? обычным образом - оттрассируй пошагово ф-цию средствами встроенного отладчика


 
Snip ©   (2004-09-10 11:39) [12]

не получаеться отрассиорать, везде наставил брекпоинты, но все равно пролетает, хотя одну из ошибок (причем очень тупю нашел)... переписал фунцкию получилось так но все равно вылетает та же самая ошибка:

procedure AddEmployee(App: TApplication; HIBD: Pointer; AID: PChar); stdcall;
var
 TempApp: TApplication;
 fEditUsers: TfEditUsers;
begin
 TempApp:=Application;
 Application:=App;
 fEditUsers:=TfEditUsers.Create(Application);
 fEditUsers.IBD.SetHandle(HIBD);
 fEditUsers.ID:=AID;
 fEditUsers.IsAdd:=True;
 fEditUsers.ShowModal;
 FreeAndNil(fEditUsers);
 Application:=TempApp;
end;


 
Snip ©   (2004-09-10 11:52) [13]

еще, нашлась ошибка методом тыка..... убрал AID: PChar в вызываемой функции она начала работать.... хотя тоже вылетала ошибка... Помогите пожалуйста!!!!! Что тут не так???


 
Digitman ©   (2004-09-10 11:58) [14]


> везде наставил брекпоинты, но все равно пролетает


как это так ? быть того не может !

ну-ка расскажи подробно, как и что делаешь в плане отладки ..


 
Snip ©   (2004-09-10 12:02) [15]

Объясняю, dll и главный проект находиться в одной группе проектов, для dll b главной формы в опция проекта выбираю Build with run-time package, перестраиваю dll, добавляю в нее брекпоинты на первую строчку для входа в процедуру, так же ставлю брекпоинт в основном проекте на месте вызова импортируемой функции..... вот и все.... нажимаю F9, останавливаеться в главном проекте... нажимаю F7 или F8 вылетает ошибка....


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

Нашел!!!!!!!!! Получилось оттрассировать!!! у меня тогда вылетатла ошибка из-за PChar, точнее функция не вызывалась, а теперь как я убрал PChar из описани функции троассировка получилась, но теперь вылетела ошибка при создании формы... мать ее.... Объясните почему вылетате ошибка из-за PChar???


 
Digitman ©   (2004-09-10 12:20) [17]


> нажимаю F9, останавливаеться в главном проекте... нажимаю
> F7 или F8 вылетает ошибка....


ты чего трассировать-то пытаешься ? вызывающее приложение ? тебе ДЛЛ нужно трассировать, а не EXE !

для трассировки ДЛЛ у тебя активным в этот момент д.б. именно ДЛЛ-проект , а не ЕХЕ

меню Run -> Parameters ..
закладка Local, в Host Application введи полный путь и имя файла вызывающего приложения, после этого жми F9 ... при этом стартует указанное тобой вызывающее приложение, и как только оно загрузит твою отлаживаемую ДЛЛ и вызовет в ней ф-цию, в теле которой ты установил брейкпойнт, произойдет останов на этом брейкпойнте


 
Snip ©   (2004-09-10 12:26) [18]

дык у меня и так все нормально получилось!!!! ОБъясните мне проблему с PChar?


 
Digitman ©   (2004-09-10 12:42) [19]


> ОБъясните мне проблему с PChar?


ты ж мне строчку-то, вызывающую исключение, так и не показал ..


 
Snip ©   (2004-09-10 12:56) [20]

Проблема с PChar такова:

procedure AddEmployee(App: TApplication; HIBD: Pointer; AID: PChar); stdcall;
Вот эта фунцкия не вызываеться вообще, выкидывпает ошибку, а эта:
procedure AddEmployee(App: TApplication; HIBD: Pointer); stdcall;
работает все нормально!!!!


 
Digitman ©   (2004-09-10 12:59) [21]


> Snip ©   (10.09.04 12:56) [20]


ты русский понимаешь ?
я спрашиваю - какая строчка в теле вызываемой из ДЛЛ процедуры возбуждает исключение ?


 
Snip ©   (2004-09-10 13:16) [22]


> Digitman ©   (10.09.04 12:59) [21]

Сама процедура DLL не вызываеться!!!! ОНА САМА НЕ ВЫЗЫВАЕТЬСЯ, ТО ЧТО Я ЭКСПОРТИРУЮ!!! ВООБЩЕ!!! ДО ТЕЛА ПРОЦЕДУРЫ ВЫПОЛНЕНИЯ НЕ ДОХОДИТ!!!!


 
simpson ©   (2004-09-10 13:34) [23]

А это условие соблюдено?


{ Important note about DLL memory management: ShareMem must be the
 first unit in your library"s USES clause AND your project"s (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters. }


 
Digitman ©   (2004-09-10 13:34) [24]


> Snip ©   (10.09.04 13:16) [22]


> Сама процедура DLL не вызываеться


ты мне дурочку-то не гони !


> дык у меня и так все нормально получилось


это твоя фраза ? твоя)

это означает, что убрав PChar-параметр из объявления ф-ции и убрав соответственно PChar(lvObjects.Selected.Caption) из вызова этой ф-ции ты получил ожидаемый результат, т.е. ф-ция AddEmployee() не могла быть не вызвана !

а теперь смотри сюда ..

PChar(строковый_тип) не может вызвать искл-е НИ при каких обст-вах

значит, если ты утверждаешь, что ф-ция не вызывается, исключение вызывает конструкция lvObjects.Selected.Caption

и это сразу же наводит на мысль, что ЛИБО не существует объект lvObjects ЛИБО св-во lvObjects.Selected = nil

чего ж  тебе еще надобно, старче ?)


 
Snip ©   (2004-09-10 13:54) [25]


> Digitman ©   (10.09.04 13:34) [24]

Сорри, я дико извеняюсь.... Идиот... прально ты сказал до меня доперла... я перепутал процедуру добавления сотрудника с процедурой перевода сотрдудника!!! В добавлении мне это AID вообще не нужна!!! Спасибо большое, а так бы я тупил бы еще долго!!!


 
Snip ©   (2004-09-10 13:55) [26]


> simpson ©   (10.09.04 13:34) [23]

Это условие надо соблюдать если исползуешь тип String, а во всех остальных случаях это не обязательно.....


 
Digitman ©   (2004-09-10 13:59) [27]


> Snip ©   (10.09.04 13:55) [26]
> Это условие надо соблюдать если исползуешь тип String, а
> во всех остальных случаях это не обязательно.....


неверно


 
simpson ©   (2004-09-10 14:14) [28]


This applies to all strings passed to and from your DLL--even those that are nested in records and classes.


И попробуй сказать, что, например, в составе TApplication нет полей типа String.


 
Digitman ©   (2004-09-10 14:22) [29]


> Snip


важно понимать, что динамическое выделение и освобождение памяти должно происходить в рез-те явных или неявных вызовов ф-ций одного и того же менеджера памяти ... и неважно, под данные каких типов память распределяется - под строки или под что-то еще ...

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

если хост-аппликация и ДЛЛ собраны в одной и той же Делфи-среде и к ДЛЛ не планируются обращения иначе как со стороны этой хост-аппликации, то достаточно собрать оба проекта с опцией BwRTP - проблем с передачей в кач-ве параметров данных дин.типов не будет, ибо менеджер памяти в этом случае един для обоих модулей



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

Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
4-1092664097
d_oleg
2004-08-16 17:48
2004.09.26
Размер физического диска


14-1094130809
Дитё
2004-09-02 17:13
2004.09.26
Где достать анимацию для программы ..


14-1094642393
WondeRu
2004-09-08 15:19
2004.09.26
О срывах проектов


9-1086212573
MrAngel
2004-06-03 01:42
2004.09.26
Мультимониторинг на DirectX


14-1094303782
Marser
2004-09-04 17:16
2004.09.26
О вчерашнем...





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