![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Значение 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.
С уважением