Форум: "Прочее";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
ВнизОблегчить реализацию IDispach Найти похожие ветки
← →
Дмитрий С (2008-05-25 21:02) [0]Конструктивно:
Есть интерфейс:IMyObj = interface ["{A85AB9C8-B986-4E37-A2D7-4F87D4C5C727}"]
procedure Method1; safecall;
function Get_Property1: Integer; safecall;
procedure Set_Property1(Value: Integer); safecall;
property Property1: Integer read Get_Property1 write Set_Property1;
end;
Реализация:TMyObj = class(TInterfacedObject, IMyObj, IDispatch)
procedure Method1; safecall;
function Get_Property1: Integer; safecall;
procedure Set_Property1(Value: Integer); safecall;
public
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount: Integer; LocaleID: Integer; DispIDs: Pointer): HRESULT;
stdcall;
function GetTypeInfo(Index: Integer; LocaleID: Integer;
out TypeInfo): HRESULT; stdcall;
function GetTypeInfoCount(out Count: Integer): HRESULT; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult: Pointer; ExcepInfo: Pointer;
ArgErr: Pointer): HRESULT; stdcall;
end;
Есть еще то, что я не особо понял:IMyObjDisp = dispinterface ["{A85AB9C8-B986-4E37-A2D7-4F87D4C5C727}"]
procedure Method1; dispid 201;
property Property1: Integer dispid 202;
end;
Вопрос вот в чем.
Можно ли как нибудь облегчить реализацию GetTypeInfoCount и Invoke на основе dispinterface - а?
← →
Дмитрий С (2008-05-25 21:02) [1]Облегчить без TypeLibrary.
← →
tesseract © (2008-05-25 21:10) [2]Куда уж проще ? Проще только ничего не делать.
← →
Дмитрий С (2008-05-25 21:12) [3]По идее я должен сам описать в
GetIDsOfNames все методы и свойства, а в Invoke их реализовать. Это ведь не просто для большого класса.
Или я чегото недопонял?
← →
tesseract © (2008-05-25 21:14) [4]
> Или я чегото недопонял?
RTTI, можно реализовать передачу параметров и типов методов. Я например при инициализации класса такое проворачиваю.
← →
Дмитрий С (2008-05-25 21:16) [5]бррр... можно маленький примерчик?
← →
tesseract © (2008-05-25 22:10) [6]
> бррр... можно маленький примерчик?
Он не маленький. Но логичнный.
← →
Дмитрий С (2008-05-25 22:10) [7]можно?
← →
guav © (2008-05-25 22:18) [8]TObjectDispatch. Не реализует GetTypeInfoCount. Диспиды выделяются динамически. Зато самый простой способ - ничего вообще делать не надо.
← →
Дмитрий С (2008-05-25 22:30) [9]TObjectDispatch
А у меня такого нет, даже в справке (d 7)
> Не реализует GetTypeInfoCount.
Он и не нужен собственно
← →
Дмитрий С (2008-05-25 22:49) [10]Нашел!
Спасибо, почти то, что надо! :)
← →
guav © (2008-05-25 22:52) [11]uses ComObjAuto
var I: IDispatch;
I := TObjectDispatch.Create(TMyClass.Create); // publshed методы и свойства класса TMyClass теперь доступны через I.GetIDsOfNames, I.Invoke .
← →
Дмитрий С (2008-05-25 23:02) [12]
> guav ©
По опыту скажите, какие минусы?
← →
guav © (2008-05-26 01:34) [13]Серьёзно не использовал, т.к. никогда не было ограничения "без Type Library"
← →
Polevi (2008-05-26 09:19) [14]вот пример реализации IDispatch
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=737
← →
Дмитрий С (2008-05-26 10:13) [15]
> Polevi (26.05.08 09:19) [14]
Спасибо, но это пример - в лоб...
> guav © (26.05.08 01:34) [13]
>
> Серьёзно не использовал, т.к. никогда не было ограничения
> "без Type Library"
Для Type Library еще пока знаний маловато :)
← →
Григорьев Антон © (2008-05-26 11:05) [16]Вообще-то дуальные интерфейсы без библиотеки типов не маршалируются. Реализованный без библиотеки дуальный интерфейс годится только для внутреннего сервера, да и то если вызывающий его код находится в том же апартаменте, что и сам сервер.
Неправильную последовательность для изучения выбрали. Реализация IDispatch - это на самом деле сложнее, чем библиотека типов.
← →
ага0 (2008-05-26 11:52) [17]IDispatch маршализуется системой, а для диспинтерфейса больше нифига и не нать.
> TObjectDispatch
Фигня полная. Исправить можно но того не стоит.
← →
Дмитрий С (2008-05-26 19:50) [18]
> Фигня полная. Исправить можно но того не стоит.
что именно?
> Григорьев Антон © (26.05.08 11:05) [16]
Пока в поиске хорошей статьи
← →
tesseract © (2008-05-26 20:48) [19]
> годится только для внутреннего сервера, да и то если вызывающий
> его код находится в том же апартаменте, что и сам сервер.
>
У 1с реализован свой интерфейс вроде IDispatch - работает. С маршалингом есть закавыки - но работает. Дуальные интерфейсы подразумевают вроде как библиотеку типов, на то они и дуальные. Если чисто IDispatch - то там используеться сильно позднее связывание и реально библиотека типов там не требуеться, хотя много предстоит писать руками конечно.
← →
Дмитрий С (2008-05-27 00:56) [20]Нашел
хорошую статью
http://www.delphikingdom.com/lyceum/seminar.asp?ID=5
но конец, как обычно на самом интересном месте...
← →
Григорьев Антон © (2008-05-27 10:39) [21]
> Дмитрий С (27.05.08 00:56) [20]
> но конец, как обычно на самом интересном месте...
Продолжение будет, надеюсь, в течение месяца - сейчас интенсивно над этим работаю. Как раз про серверы с библиотекой типов, правда, пока без IDispatch. Часть новых уроков уже полностью готова, но я их пока не выкладываю, так как там только теория. Опыт развития этого цикла показывает, что люди очень плохо воспринимают чисто теоретический материал, оставляют в комментариях такие сообщения, что вообще хочется всё бросить и ничего больше не писать. Поэтому я решил выкладывать уроки блоками, чтобы в конце каждого блока был практический пример. Тот блок, который на подходе, включает в себя пять уроков (3 готовы полностью, 2 - процентов на 70), следующий, про IDL и стандартный маршалинг, - три (два уже готовы, третий на 80%), а потом как раз займусь IDispatch.
← →
Dmitry S © (2008-05-27 11:17) [22]
> Григорьев Антон ©
Очень жду.
Спасибо тебе, автор, хорошо пишешь, понятно и легко.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c