Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Общие вопросы по программированию, компьютерным наукам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 20.12.2011, 12:22   #1
Человек_Борща
Модератор
Заслуженный модератор
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Адрес: Республика Беларусь, г. Минск
Сообщений: 11,447
Репутация: 2769
По умолчанию Плагины на C++ для программы на delphi. Это возможно?

Доброго времени суток!

Допустим программа предостовляет некий модуль с интерфейсами для создания плагина.

На delphi, просто воткнул pas файл и программируй сколько влезет.

Что делать, когда плагин хочет реализовать человек, который не знает Delphi, но знает C++?
Человек_Борща вне форума   Ответить с цитированием
Старый 20.12.2011, 12:31   #2
Utkin
Профессионал
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Адрес: DuckBurg
Сообщений: 18,303
Репутация: 3917
По умолчанию

Писать длл.
__________________
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума   Ответить с цитированием
Старый 20.12.2011, 14:16   #3
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
Репутация: 181
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Что делать, когда плагин хочет реализовать человек, который не знает Delphi, но знает C++?
делать через DLL, плюс правильная огранизация программы
__________________
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума   Ответить с цитированием
Старый 20.12.2011, 14:30   #4
xwicked
Профессионал
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Адрес: Россия, г. Старый Оскол
Сообщений: 1,270
Репутация: 283

icq: 624801702
skype: labfreetech.org
По умолчанию

Исходя из своего опыта экспериментирования с dll(C++) и вызова в Lazarus и Delphi, то могу предположить, что это не только возможно, но и ничего сложного при реализации быть не должно
__________________
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума   Ответить с цитированием
Старый 20.12.2011, 18:44   #5
Человек_Борща
Модератор
Заслуженный модератор
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Адрес: Республика Беларусь, г. Минск
Сообщений: 11,447
Репутация: 2769
По умолчанию

Цитата:
Сообщение от haruhi Посмотреть сообщение
делать через DLL, плюс правильная огранизация программы
Был такой вариант...

Но тут тонна вопросов.

DLL(пускай PluginAPI.dll) всего в одном экземпляре.
Плагинов неопределённое количество. Dll не может быть перезагружена для каждого плугина отдельно. НО можно из программы передавать указатель на АП этой dll -> КАК?

Далее DLL реализует некий IMainInterface, если писать только делфи плагин(соответсвенно интерфейс ввиде pas есть), то плагин наследует интерфейс, создавая его копию:
Код:

Type
  IPluginSmthDo=Interface(IMainInterface,IInterface,IInterfacedObject)

и в последствии, dll как плагин, передает в программу 1 экспортируюмую функцию, которая передаёт осн. программе указатель на созданный плагином интерфейс.

Разме можно так зделать из DLL?
Создать несколько наследуемых интерфейсов и как-то чтоли перадать их самим DLL плагинам.
Человек_Борща вне форума   Ответить с цитированием
Старый 20.12.2011, 18:57   #6
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

что такое АП?
Цитата:
Dll не может быть перезагружена для каждого плугина отдельно.
причем тут ДЛЛ и плагин?
плагин в ДЛЛ, а не приложение.
Цитата:
Разме можно так зделать из DLL?
интерфейс можно.

можете посмотреть в сторону COM, чем не плагины.
либо свою структуру функций, как например в Миранде(раньше точно, сейчас не знаю), она передает указатель на функцию, через которую плагин взаимодействует с приложением.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 20.12.2011, 19:09   #7
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
Репутация: 181
По умолчанию

самый простой вариант: программа это EXE, плагины это DLL.
программа загружает плагин после чего вызывает какие-то там функции из DLL, одна из этих функций в DLL будет называться SetProgramAPI, программа вызывает эту функцию и передаёт ей указатели на свои функции, через которые DLL будет взаимодействовать с программой.
__________________
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума   Ответить с цитированием
Старый 20.12.2011, 21:17   #8
GunSmoker
Профессионал
 
Регистрация: 13.08.2009
Адрес: Россия, Тверь
Сообщений: 2,581
Репутация: 1066

icq: 436815515
skype: RandomClear
По умолчанию

Цитата:
Что делать, когда плагин хочет реализовать человек, который не знает Delphi, но знает C++?
То же самое, что и на Delphi - человек пишет DLL, которая удовлетворяет контракту плагина. Соответственно, чтобы он мог это сделать, контракт плагина должен оперировать межязыковыми сущностями, избегая использования привязанных к Delphi типов (String, TObject, register и т.п.). Вот и всё.

Ну и конечно, ты должен документировать способ общения (контракт). В частности, если для Delpi ты предоставляешь заголовочные .pas файлы, то для C++ ты также должен предоставлять заголовочники (.h). Которые получаются просто переводом .pas -> .h (и м.б. .cpp).

Цитата:
DLL(пускай PluginAPI.dll) всего в одном экземпляре.
Плагинов неопределённое количество. Dll не может быть перезагружена для каждого плугина отдельно.
Зачем каждому плагину нужно "отдельно"? Ведь тогда они не будут связаны. Как раз смысл в том, что PluginAPI.dll - одна. Каждый плагин просто намертво завязан на неё (не суть важно - через статический импорт или LoadLibrary).

Цитата:
НО можно из программы передавать указатель на АП этой dll -> КАК?
Не уловил, зачем это надо, но проблем не вижу. Плагин выставляет наружу функцию инициализации? Выставляет. Вот в неё ядро может передать что угодно.

Цитата:
Разме можно так зделать из DLL?
В чём проблема-то? Всё, что может делать .exe, может делать и DLL, и наоборот.

Цитата:
Далее DLL реализует некий IMainInterface, если писать только делфи плагин(соответсвенно интерфейс ввиде pas есть), то плагин наследует интерфейс, создавая его копию:
Код:

Type
  IPluginSmthDo=Interface(IMainInterface,IInterface,IInterfacedObject)

На C++ будет точно так же. Только на C++

Цитата:
в последствии, dll как плагин, передает в программу 1 экспортируюмую функцию, которая передаёт осн. программе указатель на созданный плагином интерфейс.
Не увидел, в чём тут проблема с DLL.

"передаёт экспортируемую функцию" надо понимать как "ничего никому не передаёт, а экспортирует, кому надо - сам возьмёт".

Иными словами, если .exe делает:
Код:

PlugDLL := LoadLibrary('plugin1.dll');
InitFunc := GetProcAddress(PlugDLL, 'Init');

то нет никаких причин, почему этот же код не может выполнить DLL.

Цитата:
плагин в ДЛЛ, а не приложение
Ты не понял. Он хотел API ядра в DLL выделить.

Цитата:
Создать несколько наследуемых интерфейсов и как-то чтоли перадать их самим DLL плагинам.
А это я уже не понял.
__________________
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума   Ответить с цитированием
Старый 20.12.2011, 21:25   #9
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,997
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

Цитата:
Ты не понял. Он хотел API ядра в DLL выделить.
бывает, бывает.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 20.12.2011, 21:37   #10
Utkin
Профессионал
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Адрес: DuckBurg
Сообщений: 18,303
Репутация: 3917
По умолчанию

Цитата:
избегая использования привязанных к Delphi типов (String,
Стандартный юнит ДЛЛ в Дельфи 7 насчет String так и пишет (в комментах) и предлагает для этого использовать костыли.
__________________
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание программы на Delphi (возможно за вознаграждение) pr9n9 Фриланс 10 14.03.2011 14:17
Плагины для gta-vc? VintProg Gamedev - cоздание игр: Unity, OpenGL, DirectX 16 27.06.2010 10:18
подключение к Excel из delphi через ODBC.возможно ли это без глюков? betirsolt БД в Delphi 0 13.06.2010 01:05
Автосохранение исходников в Delphi. Это возможно? Kottik Софт 16 20.09.2009 17:36


00:45.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru