Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Значение property COM-сервера [Delphi, Windows]


nippo ©   (2005-07-21 03:22:00) 

Есть некий абстрактный COM-сервер. У меня есть список интерфейсов, которые он поддерживает, у каждого из которых есть свой набор properties. Как получить значение property любого из поддерживаемых интерфейсов по его (property) имени?

Привожу код

 TMyClass = class
 private
   FDisp: IDispatch;
   FIntList: TStrings;
   procedure SetIntList(const Value: TStrings);
 public
   // AIntList - список интерфейсов, поддерживаемых COM-сервером ADisp
   constructor Create(ADisp: IDispatch; AIntList: TStrings);
   destructor Destroy; override;
   function GetProperty(APropName: String): Olevariant;
   property IntList: TStrings read FIntList write SetIntList;
 end;

constructor TMyClass.Create(ADisp: IDispatch; AIntList: TStrings);
begin
 FDisp := ADisp;
 IntList := AIntList;
end;

destructor TMyClass.Destroy;
begin
 FIntList.Free;
 inherited;
end;

function TMyClass.GetProperty(APropName: String): Olevariant;
begin
 ИНТЕРЕСУЕТ РЕАЛИЗАЦИЯ ДАННОЙ ФУНКЦИИ
end;

procedure TMyClass.SetIntList(const Value: TStrings);
begin
 FIntList.Assign(Value);
end;


Набережных С   (2005-07-21 19:32:00) [1]


> Здесь не идет речь о позднем связывании,

Неужели? А чем-же тогда вот это?:

> я заранее не знаю какой COM-сервер будет передан в TMyClass.Create(ADisp:
> IDispatch), соответственно и не знаю его properties.


isasa   (2005-07-21 17:38:00) [2]

Кстати о Create!
А вызывается ли она при получении ссылки на интерфейс(не создании класса), функцией CreateComObject.
У меня в связи с этим были проблемы инициализации внутренних переменных класса.


nippo   (2005-07-21 17:22:00) [3]


> Или поменять тип FDisp на OleVariant, остальное дельфи сделает.

Здесь не идет речь о позднем связывании, так как я заранее не знаю какой COM-сервер будет передан в TMyClass.Create(ADisp: IDispatch), соответственно и не знаю его properties.


Набережных С   (2005-07-21 16:23:00) [4]

Или поменять тип FDisp на OleVariant, остальное дельфи сделает.


nippo   (2005-07-21 13:51:00) [5]


> Я так понял, что значения нужно выдернуть из IDispatch?

Именно значение.

> Тогда сначала нужно получить значение DISPID нужного property
> c помощью метода IDispatch.GetIDsOfNames.


Спасибо за помощь.

function GetDispatchFromName(const Disp: IDispatch; const PropertyName: WideString): OleVariant;
var
 PName: PWideChar;
 DispID: Integer;
 ExcepInfo: TExcepInfo;
 DispParams: TDispParams;
 Status: HResult;
begin
 if Disp = nil then
   Exit;
 PName := PWideChar(PropertyName);
 if PropertyName = '' then
   Result := DISPID_UNKNOWN
 else
   Disp.GetIDsOfNames(GUID_NULL, @PName, 1, GetThreadLocale, @DispID);
 FillChar(DispParams, SizeOf(DispParams), 0);

 Status := Disp.Invoke(DispID, GUID_NULL, 0, DISPATCH_PROPERTYGET, DispParams,
   @Result, @ExcepInfo, nil);

 if Status <> S_OK then
   DispatchInvokeError(Status, ExcepInfo);
end;


Вроде все правильно?


wal   (2005-07-21 09:32:00) [6]

Я так понял, что значения нужно выдернуть из IDispatch?
Тогда сначала нужно получить значение DISPID нужного property c помощью метода IDispatch.GetIDsOfNames. Затем, используя полученный DISPID узнать значение свойства с помощью IDispatch.Invoke.

С уважением


Наверх

Титульная страница Поиск, карта сайта Написать письмо