Текущий архив: 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.46 MB
Время: 0.01 c