Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 427

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Мой вопрос заключается в следующем. Есть программа, есть dll-ка к этой программе, нужно данные из программы передать dll-ке для обработки. Как это реализуется?

Казаков Николай Константинович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Казаков Николай Константинович (статус: 1-ый класс)
Вопрос отправлен: 14 июля 2010, 18:28
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Казаков Николай Константинович!
Если закрыть глаза на технические детали, то код длл проецируется в адресное пространство exe файла и как бы является частью его. И можно считать, что функция/процедура в длл это та же функция/процедура в основной программе. Поэтому, никто не мешает передавать через параметры любые данные в длл и возвращать оттудова. Единственное препятствие - это строковые переменные и классы. Но если добавить ShareMem, то и оно пропадает.

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

Есть ещё один метод. Если длл может понадобиться очень много данных и разных, то тут уже лучше использовать ссылки на функции. То есть, в функцию инициализации длл передается массив функций, которые реализованы в exe, и длл вызывает их по мере надобности.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 14 июля 2010, 20:52


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 15 июля 2010, 14:48; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 14 июля 2010, 19:06 [#1]:

А DLLка чья? Чужая, небось?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 14 июля 2010, 19:07 [#2]:

Это можно реализовать, например, с помощью отображаемых в память файлов (CreateFileMapping, MapViewOfFile).
Казаков Николай Константинович

Казаков Николай Константинович (статус: 1-ый класс), 14 июля 2010, 20:37 [#3]:

Уважаемые эксперты, DLLка моя собственная. Нужно, чтобы она вытянула из программы нужные данные. Или проще можно ли из DLL обратиться к переменным объявленным в основной программе, если да, то как? Если нет, то каким образом осуществить передачу данных.
min@y™

min@y™ (статус: Доктор наук), 14 июля 2010, 20:48 [#4]:

Давай тогда подробнее: что за данные такие и т.д. и т.п. DLL экспортируют функции, с помощью которых можно передавать данные в обе стороны.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Казаков Николай Константинович

Казаков Николай Константинович (статус: 1-ый класс), 14 июля 2010, 21:01 [#5]:

Если в 2-х словах - в основной программе создается строка с математической формулой (тип shortstring), dllка должна вытащить эту строку проанализировать и в программу вернуть результат, желательно тоже типа shortstring
Вадим К

Вадим К (статус: Академик), 14 июля 2010, 21:04 [#6]:

если бы это было без длл, осилили бы написать?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 14 июля 2010, 21:09 [#7]:

Цитата (Казаков Николай Константинович):

Если в 2-х словах - в основной программе создается строка с математической формулой (тип shortstring), dllка должна вытащить эту строку проанализировать и в программу вернуть результат, желательно тоже типа shortstring

Абсолютно никаких проблем не вижу. Только зачем нужна DLL, почему в этом есть необходимость?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Казаков Николай Константинович

Казаков Николай Константинович (статус: 1-ый класс), 14 июля 2010, 21:36 [#8]:

основная программа слишком большая + я тренируюсь делать плагины, что посоветуете???
min@y™

min@y™ (статус: Доктор наук), 14 июля 2010, 21:56 [#9]:

Советую не заниматься ерундой, если пишешь реальную (не учебную) программу. DLL нужны только если они используются в качестве плагинов (и это правильно) и в случае, если их используют несколько приложений одновременно. Если программа использует плагины, значит это популярная программа, т.е. эти плагины пишет не только автор программы, но и сторонние разработчики (firefox, к примеру).

Теперь по делу: передать в DLL (и обратно) ShortString или PChar - не проблема. По этому поводу написана туева хуча статей и глав в больших солидных книжках. Некоторые из них годами валяются даже на этом сайте, но судя по частоте вопросов, ответы на которые есть в этих книжках и статьях, их никто не качает. И это меня не радует. :(
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

15 июля 2010, 12:15: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

Казаков Николай Константинович

Казаков Николай Константинович (статус: 1-ый класс), 15 июля 2010, 14:33 [#10]:

Уважаемый min@y™, спасибо, конечно за то, что назвали работу "ерундой", но пусть это останется на Вашей совести. За большим количеством текста я не увидел полезной информации. Пожалуйста если вы знаете где конкретно прочитать о способах решения проблемы дайте ссылку.
min@y™

min@y™ (статус: Доктор наук), 15 июля 2010, 14:48 [#11]:

Цитата (Казаков Николай Константинович):

Пожалуйста если вы знаете где конкретно прочитать о способах решения проблемы дайте ссылку.

Да хоть вот это.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.02 сек.