Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

Облегчить реализацию 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.012 c
3-1201785404
Валентин Иванов
2008-01-31 16:16
2008.07.13
Ошибка при записи в таблицу БД


15-1212066266
Dmitry S
2008-05-29 17:04
2008.07.13
OleLoadPictureFile "не видит" png


15-1211783198
БарЛог
2008-05-26 10:26
2008.07.13
FTP в новом эксплорере отображается списком (буквами)


2-1213338165
mefodiy
2008-06-13 10:22
2008.07.13
ComboBox в DBGridEh


2-1213623272
DFT
2008-06-16 17:34
2008.07.13
WMPaint