Экспорт функций внутрь dll

prefer

Доброго времени суток!Есть MDI приложение, все формы добавляются в приложение посредством загрузки dll.Хотелось бы экспортировать некоторые функции (часто используемые) внутрь dll, чтобы их не дублировать. Каким образом можно сделать такую операцию?
14 ответов

prefer

Доброго времени суток!Есть MDI приложение, все формы добавляются в приложение посредством загрузки dll.Хотелось бы экспортировать некоторые функции (часто используемые) внутрь dll, чтобы их не дублировать. Каким образом можно сделать такую операцию?
Первым делом - почитать литературу, посвященную вопросам dll...


prefer

обясни конкретно что нужно? откуда куда експортировать? длл-ки написаны в делфи?----www.hramin.jino-net.ru


prefer

откуда куда експортировать?
Есть ядро, главный экзешник, запуская его, подгружаются dll, они же - весь функционал приложения..Посредством выбора соответствующего меню - открывается форма, которая подключилась из tmp.dll.Чтобы не дублировать функциональсноть в dll, например логгирование, обновление прав и т.д., хотел эти функции вынести в экзешник и вызывать их в длл.Но похоже будет отдельная дллка для этого функционала, и буду ее загружать в остальных dll.
длл-ки написаны в делфи?
Написано все на делфях... Собственно какая разница?


prefer

Написано все на делфях... Собственно какая разница?
есть разница
Посредством выбора соответствующего меню - открывается форма, которая подключилась из tmp.dll.Чтобы не дублировать функциональсноть в dll, например логгирование, обновление прав и т.д., хотел эти функции вынести в экзешник и вызывать их в длл.
лучше их собрать не в ехе а в отделную длл-ку и вызывать ихвот рабочий пример----www.hramin.jino-net.ru


prefer

Чтобы не дублировать функциональсноть в dll, например логгирование,обновление прав и т.д., хотел эти функции вынести в экзешник и вызыватьих в длл.
Никаких проблем. Экзешник может экспортировать функции точно так же как любая DLL, а любая DLL может получить ссылки на них, используя GetProcAddress().


prefer

Никаких проблем. Экзешник может экспортировать функции точно так же каклюбая DLL, а любая DLL может получить ссылки на них, используяGetProcAddress().
Пробую так:
<b>type</b>
 TWriteLog = <b>procedure</b>(OperationId: Integer; LogString: <b>string</b>);
<b>var</b>
 GWriteLog: TWriteLog;

....

<b>constructor</b> TFSampleForm.Create(Aowner: TComponent; DbHandle: Pointer; I: IMainForm; idx: Integer);
<b>begin</b>
...
@GWriteLog := GetProcAddress(DLLApp.Handle,'WriteLog');
<i>// test</i>
<b>try</b>
 GWriteLog(<b>107</b>,'test');
<b>except</b>
 on e: Exception <b>do</b> <b>begin</b>
 MessageDlg(e.Message, mtError, [mbOk], <b>0</b>);
 <b>raise</b>;
 <b>end</b>;
<b>end</b>;
<i>// end^</i>

<b>end</b>;

DLLApp -- Это Application основного приложения
Ну и экспортирую из экзешника:
<b>exports</b>
 WriteLog;
GetProcAddress(DLLApp.Handle,'WriteLog'); -- возвращает адрес, а не nil. Но при вызове GWriteLog(107,'test') выскакивает Access violation.
есть разница
Поясните пожалуйста.


prefer

GetProcAddress(DLLApp.Handle,'WriteLog'); -- возвращает адрес, а не nil.Но при вызове GWriteLog(107,'test') выскакивает Access violation.
Это может быть1) Мешается @;2) Неправильное объявление;3) Кошмар разных RTL Вас таки догнал.


prefer

если компиляторы длл и ехе разные там очен много моментов который нужно пояснить... гугл в помощ...----www.hramin.jino-net.ru


prefer

Это может быть1) Мешается @;2) Неправильное объявление;3) Кошмар разных RTL Вас таки догнал.
Все получилось, спс. Экспортируемая из экзешника функция располагалась в другом юните.Сделал в главном модуле:
<b>procedure</b> RefreshTags(frmForm: TForm);
<b>begin</b>
 config.RefreshTags(frmForm);
<b>end</b>;
иначе Access violation.
если компиляторы длл и ехе разные там очен много моментов который нужно пояснить... гугл в помощ...
Прошу прощения за настойчивость, но хотелось бы услышать 3-4 отличия :) или вся разница в компиляторах?


prefer

Но похоже будет отдельная дллка для этого функционала, и буду ее загружать в остальных dll.
да, это лучше.Ещё лучше БЛ на сервер.Ещё-ещё лучше пакеты (если функционал большой)


prefer

(Dimitry Sibiryakov) Экзешник может экспортировать...Нет возможности проверить... И для общего развития...Навскидку, если я - dll и это "мой" (меня загрузил?) exe, значит я должен ехешнику LoadLibraryEx с каким-то флагом, что бы оно не запустилось, а просто отдало адреса?А если "чужой" (просто файл exe на диске)?


prefer

Нет возможности проверить...А если "чужой" (просто файл exe на диске)?
Нет возможности открыть стравку и прочитать про MainInstance?..


prefer

Dimitry Sibiryakov> Нет возможности...Именно так. За отсутствием...


prefer

Железка маленькая... Потом в MSDN проичитаю...