Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1213368785
TForumHelp
2008-06-13 18:53
2008.07.13
Отлавливание сообщения


15-1212399903
DevilDevil
2008-06-02 13:45
2008.07.13
"Алгоритм прямоугольников"?


2-1213366793
Sten
2008-06-13 18:19
2008.07.13
Иконка в заголовке формы


2-1213341653
Dmitry
2008-06-13 11:20
2008.07.13
Canvas


15-1211877821
Хохол
2008-05-27 12:43
2008.07.13
Как получить размер памяти занимаемый объектом?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский