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

Вниз

Значение property COM-сервера   Найти похожие ветки 

 
nippo   (2005-07-21 03:22) [0]

Есть некий абстрактный 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;


 
wal ©   (2005-07-21 09:32) [1]

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

С уважением


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


> Я так понял, что значения нужно выдернуть из 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;


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


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

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


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


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

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


 
isasa ©   (2005-07-21 17:38) [5]

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


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


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

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

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



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

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

Наверх




Память: 0.48 MB
Время: 0.03 c
15-1150446709
LingvoRu
2006-06-16 12:31
2006.07.16
Мощная фраза


15-1150463110
if then
2006-06-16 17:05
2006.07.16
Chto takoe iskustvennyj intelekt


1-1149229801
Layner
2006-06-02 10:30
2006.07.16
Balloon Hint не хочет показываться :( В чем может быть дело..


8-1138709076
RBi
2006-01-31 15:04
2006.07.16
Где найти платные/бесплатные библиотеки для работы с PSD?


2-1151217749
Марина
2006-06-25 10:42
2006.07.16
Как закрасить в какой то свет вертикальную полосу прокрутки?