gpt4 book ai didi

delphi - 如何确定 IInterface 后代是否具有属性?

转载 作者:行者123 更新时间:2023-12-03 15:48:56 24 4
gpt4 key购买 nike

由于导入类型库,我有很多接口(interface)。所以,接口(interface)是这样的:

  ISomeCollection = dispinterface
['{6592E851-3D65-4D04-B5F3-B137667B816A}']
procedure Remove(Identifier: OleVariant); dispid 2;
function Add(Name: OleVariant; DatabaseType_ID: OleVariant): ERSModel; dispid 3;
property _NewEnum: IUnknown readonly dispid -4;
property Item[Identifier: OleVariant]: ERSModel readonly dispid 4;
property _Item[Identifier: OleVariant]: ERSModel readonly dispid 0; default;
property Count: Integer readonly dispid 1;
end;

_NewEnum 是 Visual Basic for-each 循环语句消耗 COM 集合的习惯用法(它与 Delphi 的 for-in 完全相同)对象 - 尽管声明为 IUnknown,但它实际上是一个 IEnumVARIANT 接口(interface)。由于这是枚举集合项目的唯一方法,我用以下方法解决了这个问题:

{This class have just this class function} 
class function TVariantUtils.GetAs<T>(pModeloOleVar: OleVariant): T;
begin
Result := (T(IUnknown(pModeloOleVar)));
end;

用途:

var 
EnumColecction: IEnumVariant;
// TEnumeratorObjects: This is a generic class to implement an enumerator over
// an IEnumVARIANT interface
ListOfSubObjects: TEnumaretorObjects;
begin
...
EnumCollection := TVariantUtils.GetAs<IEnumVariant>(Object.SomeCollection._NewEnum);
ListOfSubObects := TEnumeratorObjects<ItemofSomeCollection>.Create(EnumCollection);
...
End;

构造函数接收 IEnumVariant 参数。我想要的是创建一个构造函数接收 IInterface 并确定 ISomeCollection 是否具有 _NewEnum 属性IUnknown 类型 - 并执行一次上述代码。我不知道编译时接口(interface)的名称或 GUID。

Obs:delphi-xe标签是因为我想知道其机制,即使仅适用于Delphi XE(即使我需要为此购买入门版)。我用的是D2010。

编辑:我尝试使用 RTTI(它可以编译但不起作用):

constructor TEnumeratorVariant<T>.Create(pEnumeraVariante: IInterface);
var
EnumVar: IEnumVariant;
Contexto: TRttiContext;
InfoTipo: TRttiType ;
PropInfo: TRttiProperty;
pTipo: PTypeInfo;
begin
Contexto.Create;
pTipo := TypeInfo(pEnumeraVariante);
InfoTipo := Contexto.GetType(TypInfo(pEnumeraVariante));
PropInfo := InfoTipo.GetProperty('_NewEnum');
if Assigned(PropInfo) then
begin
Supports(PropInfo.GetValue(pEnumeraVariante), IEnumVariant, EnumVar);
Create(EnumVar);
end;
Contexto.Free;
PropInfo.Free;
InfoTipo.Free;
end;

最佳答案

尝试标准的IDispatch方法(未经测试,您可能需要调整它):

function GetEnumerator(const Disp: IDispatch): IEnumVariant;
var
DispParams: TDispParams;
ExcepInfo: TExcepInfo;
Status: Integer;
VarResult: OleVariant;
begin
Result := nil;
FillChar(DispParams, SizeOf(DispParams), 0);
FillChar(ExcepInfo, SizeOf(ExcepInfo), 0);
Status := Disp.Invoke(DISPID_NEWENUM, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, DispParams, @VarResult, @ExcepInfo, nil);
if Succeeded(Status) then
Result := IUnknown(VarResult) as IEnumVariant
else
DispatchInvokeError(Status, ExcepInfo);
end;

关于delphi - 如何确定 IInterface 后代是否具有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6299528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com