Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

COM+, различие между методами чтения и записи своиства   Найти похожие ветки 

 
mechael ©   (2005-09-30 06:51) [0]

Ролевая безопасность в СОМ+ позволяет назначать права вплоть до уровня методов.
Проблема возникла с методами интерфейса предназначенными для доступа к свойству,
такие методы носят одно и тоже имя и в каталоге отличаются только ID(Key), хотелось бы
узнать как другим разработчика удается различить эти методы в каталоге СОМ+?
В нашем коллективе мы пришли к гипотезе, что возможно ID этих методов всегда
находятся в одном и том же отношении к друг к другу, а именно ID метода для чтения
всегда меньше ID метода для записи, так ли это?
Заранее благодарю за ответы.
Извиняюсь если мой вопрос кому-то покажется не корректным.


 
isasa ©   (2005-10-02 10:47) [1]

IDispatch.Invoke(DispID, ....) - раннее/позднее связывание (binding).


 
mechael ©   (2005-10-04 10:41) [2]

У меня задача не вызвать метод используя ID(при условии что это именно DispID), а именно понять какой из метод с одинаковыми именами(Name), в COM+ каталоге, является методом для чтения а какой для записи, желательно это сделать без создания собственно COM объекта.
Если предыдущий ответ именно на этот вопрос то просьба раскрыть его подробнее.


 
isasa ©   (2005-10-04 12:10) [3]

такие методы носят одно и тоже имя и в каталоге отличаются только ID(Key)...
в каталоге СОМ+


Какой каталог СОМ+ (dcomcnfg)? Не совсем понятно о чем речь.

методами интерфейса предназначенными для доступа к свойству
Методы Get_P, Set_P, Get_T, Set_T - методы реализации, и к Disp-интерфейсу отношения не имеют.
Имеют отношение к объекту, реализующему Disp-интерфейс. Кстати у них имена разные.

Имеем, например

IWater = interface(IDispatch)
...
   function Get_P: Double; safecall;
   procedure Set_P(Value: Double); safecall;
   function Get_T: Double; safecall;
   procedure Set_T(Value: Double); safecall;
   function Get_R: Double; safecall;
...
   property P: Double read Get_P write Set_P;
   property T: Double read Get_T write Set_T;
   property R: Double read Get_R;
 end;

 IWaterDisp = dispinterface
...
   property P: Double dispid 202;
   property T: Double dispid 203;
   property R: Double readonly dispid 208;
 end;

Для этого интерфейса idl-файл будет выглядеть:

interface IWater : IDispatch {
...
[propget,id(1),helpstring("property T")] HRESULT  T([out,retval] DOUBLE *pVal);
[propput,id(1),helpstring("property T")] HRESULT  T([in] DOUBLE newVal);
[propget,id(2),helpstring("property P")] HRESULT  P([out,retval] DOUBLE *pVal);
[propput,id(2),helpstring("property P")] HRESULT  P([in] DOUBLE newVal);
[propget,id(3),helpstring("property r")] HRESULT  r([out,retval] DOUBLE *pVal);
};

ID одинаковые, для property - propget/propput.


 
isasa ©   (2005-10-04 12:15) [4]

Сорри, ошибка компиляции VS ?
надо
idl-файл будет выглядеть:

interface IWater : IDispatch {
...
[propget,id(203),helpstring("property T")] HRESULT  T([out,retval] DOUBLE *pVal);
[propput,id(203),helpstring("property T")] HRESULT  T([in] DOUBLE newVal);
[propget,id(202),helpstring("property P")] HRESULT  P([out,retval] DOUBLE *pVal);
[propput,id(202),helpstring("property P")] HRESULT  P([in] DOUBLE newVal);
[propget,id(208),helpstring("property r")] HRESULT  r([out,retval] DOUBLE *pVal);
};


 
isasa ©   (2005-10-04 12:41) [5]

Добавлю. :)
Насколько я понимаю, методы Get_... и Put_... интерфейса(используемым Delphi в данном случае), работают
только при раннем связывании (early binding), т.е. на этапе компиляции. На этапе выполнения метод, все равно,
вызывается по его DispID  парой функций IDispatch.GetIDsOfNames() и IDispatch.Invoke().
Кстати на форуме есть
http://delphimaster.net/view/15-1128243705/
Дейл Роджерсон "Inside COM", Русское издание
Кроме этого очень неплохо описано в Тейксейра, Пачеко. Borland Delphi 6. Руководство разработчика.
можно взять на сайте app
http://www.podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/D6/D6DGru.pdf&file_id=D6 DGru


 
mechael ©   (2005-10-05 10:58) [6]


> Какой каталог СОМ+ (dcomcnfg)? Не совсем понятно о чем речь.

Каталог СОМ+ - это типа системного реестра, где регистрируется информация о COM+ приложениях, их компонентах, интерфейсах, методах и т.п. В общем, кто знает, тот поймет.
Для работы с СОМ+ каталогом в Windows (2000 и старше - XP, 2003 и т.п.) служит утилита Component Services (описание ниже для ОС с русскоязычным интерфейсом):
 1. "Панель Управления"\"Администрирование"\"Службы компонентов"
 2. Внутри службы следует искать приложение а в нем компоненты:
     "Component Services"\"Компьютеры"\"Мой компьютер"\"Приложения COM+"
     далее в дереве идут собственно зарегистрированный приложения COM+
     которые в свою очередь состоят из COM+ компонентов а в них уже
     есть интерфейсы и их методы. Причем для свойств отображаются два
     метода с одним именем, как их отличить - не ясно.
Программно мы можем получить доступ к этим данным, для этого можно использовать интерфейс "ICOMAdminCatalog" и получая соответствующие коллекции (каталоги элементов) используя уже интерфейсы "ICatalogCollection" и "ICatalogObject".

И соответственно хотелось бы отличить подобные методы в этом "каталоге
COM+", естественно сделать это программно, при этом не погружаясь собственно в COM природу этих объектов, тем более что мне не удалось в свойствах методов в "каталоге COM+" найти не DispID не указаний на природу вызова метода или его параметры.


 
isasa ©   (2005-10-05 11:15) [7]

"Панель Управления"\"Администрирование"\"Службы компонентов"
==dcomcnfg (Набери в ваполнить dcomcnfg) - кто знает тот поймет :)
Ну и где там ID методов. Безопосность есть, но и только.


 
isasa ©   (2005-10-05 11:22) [8]

Методов, реализующие свойства (property), там не будет. Будет то что есть в Disp-интерфейсе, а просто интерфейс - это для компилятора(ранее связывание), в данном случае Дельфи.


 
mechael ©   (2005-10-06 06:49) [9]


> Ну и где там ID методов. Безопосность есть, но и только.

ID в "Компонент Сервисе" и правда не показывается, но оно есть и
находится в свойстве Key к которому можно получить доступ программно.


> Методов, реализующие свойства (property), там не будет.

Эти методы есть, в моем проекте для каждого свойства реализуемого в интерфейсе есть все необходимые методы(чтения и/или записи), если они есть оба имена их совпадают и отличить их визуально в "Компонент Сервисе" нет возможности. Возможно сточки зрения Disp-интерфейса это и не методы но для COM+ каталога они вполне нормальные методы так как находятся в коллекции методов.


 
isasa ©   (2005-10-06 10:40) [10]

для каждого свойства реализуемого в интерфейсе есть все необходимые методы(чтения и/или записи), если они есть оба имена их совпадают и отличить их визуально в "Компонент Сервисе" нет возможности.

Ты хочешь сказать, что(да в том же Дельфи) компилятор пропустит такое

 IFlowProperty = interface(IDispatch)
...
   function Check(LID: Integer): Integer; safecall;
   function Check(val: Integer): Integer; safecall;
...
 end;
...
 IFlowPropertyDisp = dispinterface
...
   function Check(LID: Integer): Integer; dispid 28;
   function Check(val: Integer): Integer; dispid 31;
...
 end;


 
isasa ©   (2005-10-06 10:46) [11]

Вообще, о чем мы говорим. Приведи код интерфейса(одного) где, два метода имеют одинаковое имя и разный  dispid.
Написал и подумал, бред какой-то.


 
mechael ©   (2005-10-06 15:34) [12]

Мы говорим не об интерфейсах в Дельфи, а о том как информацию об этих интерфейсах получить в "Каталоге COM+"
А то как ты написал, мне кажется так же как и тебе ерунда.



Страницы: 1 вся ветка

Форум: "Corba";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.052 c
2-1168427926
Mishenka
2007-01-10 14:18
2007.01.28
Чем отличаются события формы OnClose и OnCloseQuery ?


11-1144628785
Snipet
2006-04-10 04:26
2007.01.28
TreeView/ListView


2-1167477111
inkvizitor
2006-12-30 14:11
2007.01.28
анимэ


15-1167733191
Slider007
2007-01-02 13:19
2007.01.28
С днем рождения ! 1 января


1-1164984707
w666w
2006-12-01 17:51
2007.01.28
Как распаковать Zip из строки в строку.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский