![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
COM+, различие между методами чтения и записи своиства [Delphi, Windows]
mechael © (2005-09-30 06:51:00)Ролевая безопасность в СОМ+ позволяет назначать права вплоть до уровня методов.
Проблема возникла с методами интерфейса предназначенными для доступа к свойству,
такие методы носят одно и тоже имя и в каталоге отличаются только ID(Key), хотелось бы
узнать как другим разработчика удается различить эти методы в каталоге СОМ+?
В нашем коллективе мы пришли к гипотезе, что возможно ID этих методов всегда
находятся в одном и том же отношении к друг к другу, а именно ID метода для чтения
всегда меньше ID метода для записи, так ли это?
Заранее благодарю за ответы.
Извиняюсь если мой вопрос кому-то покажется не корректным.
mechael (2005-10-06 15:34:00) [1]Мы говорим не об интерфейсах в Дельфи, а о том как информацию об этих интерфейсах получить в "Каталоге COM+"
А то как ты написал, мне кажется так же как и тебе ерунда.
isasa (2005-10-06 10:46:00) [2]Вообще, о чем мы говорим. Приведи код интерфейса(одного) где, два метода имеют одинаковое имяи разный dispid.
Написал и подумал, бред какой-то.
isasa (2005-10-06 10:40:00) [3]для каждого свойства реализуемого в интерфейсе есть все необходимые методы(чтения и/или записи), если они есть оба имена их совпадают и отличить их визуально в "Компонент Сервисе" нет возможности.
Ты хочешь сказать, что(да в том же Дельфи) компилятор пропустит такое
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;
mechael (2005-10-06 06:49:00) [4]
> Ну и где там ID методов. Безопосность есть, но и только.
ID в "Компонент Сервисе" и правда не показывается, но оно есть и
находится в свойстве Key к которому можно получить доступ программно.
> Методов, реализующие свойства (property), там не будет.
Эти методы есть, в моем проекте для каждого свойства реализуемого в интерфейсе есть все необходимые методы(чтения и/или записи), если они есть оба имена их совпадают и отличить их визуально в "Компонент Сервисе" нет возможности. Возможно сточки зрения Disp-интерфейса это и не методы но для COM+ каталога они вполне нормальные методы так как находятся в коллекции методов.
isasa (2005-10-05 11:22:00) [5]Методов, реализующие свойства (property), там не будет. Будет то что есть в Disp-интерфейсе, а просто интерфейс - это для компилятора(ранее связывание), в данном случае Дельфи.
isasa (2005-10-05 11:15:00) [6]"Панель Управления"\"Администрирование"\"Службы компонентов"
==dcomcnfg (Набери в ваполнить dcomcnfg) - кто знает тот поймет :)
Ну и где там ID методов. Безопосность есть, но и только.
mechael (2005-10-05 10:58:00) [7]
> Какой каталог СОМ+ (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-04 12:41:00) [8]Добавлю. :)
Насколько я понимаю, методы Get_... и Put_... интерфейса(используемым Delphi в данном случае), работают
только при раннем связывании (early binding), т.е. на этапе компиляции. На этапе выполнения метод, все равно,
вызывается по его DispID парой функций IDispatch.GetIDsOfNames() и IDispatch.Invoke().
Кстати на форуме есть
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1128243705&n=3
Дейл Роджерсон "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=D6DGru
isasa (2005-10-04 12:15:00) [9]Сорри, ошибка компиляции 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:10:00) [10]такие методы носят одно и тоже имя и в каталоге отличаются только 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.
mechael (2005-10-04 10:41:00) [11]У меня задача не вызвать метод используя ID(при условии что это именно DispID), а именно понять какой из метод с одинаковыми именами(Name), в COM+ каталоге, является методом для чтения а какой для записи, желательно это сделать без создания собственно COM объекта.
Если предыдущий ответ именно на этот вопрос то просьба раскрыть его подробнее.
isasa (2005-10-02 10:47:00) [12]IDispatch.Invoke(DispID, ....) - раннее/позднее связывание (binding).