Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Значение 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 вся ветка

Форум: "Corba";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
2-1151673955
koha
2006-06-30 17:25
2006.07.16
Как отследить запущенную программу через winexec


2-1151153327
K_Lock
2006-06-24 16:48
2006.07.16
QuickReport


2-1151152802
b.o.n.d.007
2006-06-24 16:40
2006.07.16
Я не могу понять, почему Делфи не считает куски формулы?


2-1151680563
Loginov Dmitry
2006-06-30 19:16
2006.07.16
Выравнивание компонентов


3-1147781026
p_evghenii
2006-05-16 16:03
2006.07.16
Помогите составить запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский