Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 23:58   #21
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Кстати я не понял что делает данная строкав программе:
Это имя функции, которую экспортирует плагин. И, соответственно, имопртирует программа.

Это легко можно увидеть из:
Код:
exports
  CreateHLRPlugin name HLRPluginFuncName;
Код:
  InitFunc := GetProcAddress(FDLLHandle, HLRPluginFuncName);
Имя - это строковое представление GUID с обрезанным оформлением. Сделано так, чтобы обеспечить уникальность имени. Тогда мы случайно не примем за наш плагин какую-то совершенно стороннюю DLL.

Цитата:
При запуске программы сыпется вот с таким текстом:
Ну, я как бы не вижу, что ты менял. К примеру, модуль ComObj из uses плагина ты удалил, что-ли? Если нет, то похоже на AV в плагине.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.05.2011, 00:08   #22
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Нет модуль не удалял. Может что не так сделано мною?

Вот сырец.
Вложения
Тип файла: zip source.zip (463.3 Кб, 20 просмотров)

Последний раз редактировалось Человек_Борща; 12.05.2011 в 00:14.
Человек_Борща вне форума Ответить с цитированием
Старый 12.05.2011, 01:35   #23
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вот: http://dl.dropbox.com/u/201788/Proje...uginsDemo2.rar

Немного поправил.

Проблема №1: в QueryInterface не возвращаешь S_OK (проигнорировал предупреждение компилятора?).

Проблема №2: несовпадение прототипов. CreateHLRPlugin в HelloWorldPlugin.dpr должна иметь тот же прототип, что и THLRPluginFunc в HLRPluginInterf.pas. Ты же удалил safecall.

Ещё раз правило: WideString, Bool, safecall мы используем в любых вещах, которые стоят на границе двух модулей (.exe и .DLL).

Они не нужны (используем String, Boolean и опускаем модель вызова), если интерфейс используется исключительно внутри программы - как, например, IHLRPlugins.

Кроме того, в implementation модуля нет нужды дублировать слово safecall из interface модуля.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.05.2011, 01:47   #24
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Что ещё поменял:

1. Добавил плагину методы Init и Done. Я не буду углубляться в подробности, зачем нужны отдельные процедуры инициализации/очистки (почему нельзя просто использовать конструктор/деструктор) - но можешь поверить на слово, что с ними лучше.

2. Добавил интерфейс для элемента меню (IHLRMenuItem). Теперь плагин может управлять своим пунктом меню. Всю работу с этим интерфейсом берёт на себя TPluginMenuItem в модуле главной формы.

3. Добавил callback-интерфейс для пункта меню (IHLRMenuItemHandler). Это позволяет элементу меню дёргать плагин (к примеру, чтобы тыркнуть его при выборе пункта меню пользователем).

4. Добавил ядру общее полезное свойство: MainWnd - описатель главного окна приложения.

5. В TTestPlugin: новый пример на перенаправление одного метода интерфейса:
Код:
    function IHLRMenuHandler.GetCaption = GetPluginName;
Это полезно, если тебе в одном объекте надо реализовать два интерфейса, у которых есть два метода с одинаковым именем.

Что всё ещё надо изменить в примере: поскольку сейчас пункт меню только один, то IHLRMenuItemHandler у меня реализует TTestPlugin. Это сделано для простоты примера. Понятно, что если плагин у тебя собирается активно использовать главное меню программы, удалять, добавлять элементы - то ты не можешь (и не должен) запихать всё в один объект. Надо ввести дополнительный класс, который реализует IHLRMenuItemHandler, и которым ты будешь из плагина управлять своими элементами меню. Списко этих классов нужно будет хранить в TTestPlugin.

Что можно было сделать иначе: вместо callback-интерфейса IHLRMenuItemHandler можно было использовать callback-функции с Custom-параметром (т.н. User Data).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение интерфейсов к DLL DENISLED Помощь студентам 2 02.04.2011 21:22
Подключение интерфейсов к DLL(написаном на WinAPI) DENISLED Win Api 1 02.04.2011 19:34
Плагины через dll Lime Общие вопросы Delphi 7 17.06.2010 20:50
Переделать ввиде меню! raspberry Общие вопросы C/C++ 0 05.04.2010 23:33
микшер на два потока в проигрывателе музыки. проигрыватель сделан на основе библиотеки Bass.dll D-fens Мультимедиа в Delphi 4 08.06.2007 20:36