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

Вниз

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 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.061 c
15-1168192918
Tirael
2007-01-07 21:01
2007.01.28
как включить HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows Curren


2-1168329857
-John-Doe-
2007-01-09 11:04
2007.01.28
Вопрос по указателям.


15-1167509299
vasIZmax
2006-12-30 23:08
2007.01.28
Распечатать текст программы...


2-1168279002
Первокласник Вася
2007-01-08 20:56
2007.01.28
реестр не сно как работать


2-1168332172
SerJaNT
2007-01-09 11:42
2007.01.28
Заменить переносы