Текущий архив: 2009.11.22;
Скачать: CL | DM;
Вниз
Плагины на основе Интерфейсов Найти похожие ветки
← →
Sashka (2008-11-06 17:57) [0]Загрузчик плагинов - Visual C++
Я пишу плагин на Delphi
И вот столкнулся с непонятным мне вопросом
Хм..
Реализовывал плагин на основе плагина на Visual C++
Пример кода ниже ....
IP1 = interface
function A1: HResult; stdcall;
end;
IP2 = interface (IP1)
function A2 : Hresult; stdcall;
end;
TMyClass = class (TintrefacedObject, IP2)
function A1: HResult; stdcall;
function A2: HResult; stdcall;
end;
Написал реализацию класса и вот трабл после запуска.
У меня идет наследование интерфейсов от IInterface
Чего нет в коде Visual C++
И соответственно VMT которую получает Загрузчик сдвинута на методы QueryInterface... _AddRed _Release
Не пойму как бороться с данным косяком ???
точнее пришлось сделать IP1 и IP2 как абстрактные классы.
← →
@!!ex © (2008-11-06 19:02) [1]Вообще то реализация классов в С++ и Дельфи отличаются.
← →
Сергей М. © (2008-11-06 20:05) [2]
> пришлось сделать IP1 и IP2 как абстрактные классы
Это как ?
← →
tesseract © (2008-11-06 20:56) [3]
> Не пойму как бороться с данным косяком ???
Это не косяк. Это реализация tObject. А Com плагино-держатель не держит ?
← →
Sashka (2008-11-06 21:36) [4]Вот так
IP1 = class
function A1: HResult; virtual; stdcall; absract;
end;
IP2 = class (IP1)
function A2 : Hresult; virtual; stdcall; absract;
end;
TMyClass = class IP2)
function A1: HResult; override; stdcall;
function A2: HResult; override stdcall;
end;
← →
Сергей М. © (2008-11-06 21:42) [5]
> Sashka (06.11.08 21:36) [4]
Это не абстрактный класс, это просто некий класс, содержащий кроме прочих абстрактные методы.
см. [3]
← →
Sashka (2008-11-06 21:49) [6]Хорошо...
Но исходя из идеологии менеджера плагинов
Я должен реализовать следующую экспортируемую функцию в своем плагине
function LoadPlugin (var A : IP2) : HRESULT;
begin
A := TMyCLass.Create;
Result := S_Ok;
end;
при этом я так понимаю что обработчик не правильно анализирует VMT потому что вызываются в моем плагине методы со сдвигом
и выход из этого:
function LoadPlugin (var A : Pointer) : HRESULT;
begin
A := Pointer(TMyCLass.Create); // где TMyClass=class (IP2)
Result := S_Ok;
end;
Пож-ста, поясните что необходимо понять из [3] ?
← →
Сергей М. © (2008-11-07 00:01) [7]
> исходя из идеологии менеджера плагинов
Что за идеология такая ?
Мне таковая не известна.
Сколько разработчиков - столько и "идеологий".
Изложи ее абсолютные постулаты, если ты уверен в ином ..
Далее:
> A := TMyCLass.Create;
и
> A := Pointer(TMyCLass.Create)
- оба варианта ничем не отличаются
> что необходимо понять из [3] ?
Для начала приведи ключевые фрагменты С-кода заведомо работоспособного С-плагина.. И укажи что за программный продукт "требует" интересующую тебя плагин-технологию
← →
Германн © (2008-11-07 01:10) [8]
> Сергей М. © (07.11.08 00:01) [7]
>
>
> > исходя из идеологии менеджера плагинов
>
>
> Что за идеология такая ?
+1
<offtop>
"Идеология плагинов" уже меня достала!
Не очень давно меня уже спрашивали как реализовать сию идеологию, чтобы программа работающая с БД могла с помощью плагинов работать с любым движком БД.
ЖЗЧ - Must Die!
← →
KSergey © (2008-11-07 10:00) [9]Автор, приведите как интерфейс плагина выглядит на стороне С++
← →
Sashka (2008-11-07 17:59) [10]Приблизительно вот так
// PS_CALLTYPE __stdcall;
// PS_CALL - Hresult; __stdcall;
interface NOVTABLE IP1
{
virtual ULONG PS_CALLTYPE AddRef() PURE;
virtual ULONG PS_CALLTYPE Release() PURE;
};
interface NOVTABLE IP2 : public IP1
{
virtual PS_CALL Serialize() PURE;
};
interface NOVTABLE IP3 : public IP2
{
virtual PS_CALL QueryInfo() PURE;
};
Далее одна экспортируемая функция
LoadPlugin (OUT IP3** ppvPlugin);
← →
Eraser © (2008-11-07 18:15) [11]> [10] Sashka (07.11.08 17:59)
это ни о чем не говорит, покажите код объявления интерфейса.
← →
Johnmen © (2008-11-09 02:23) [12]
> Sashka (07.11.08 17:59) [10]
> Приблизительно вот так
Тебя интересуют приблизительные ответы?
Страницы: 1 вся ветка
Текущий архив: 2009.11.22;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.018 c