Форум: "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.043 c