diff --git a/PInvoke/Shared/Collections/IEnumGenerics.cs b/PInvoke/Shared/Collections/IEnumGenerics.cs index 172c9401..a0bc1a9c 100644 --- a/PInvoke/Shared/Collections/IEnumGenerics.cs +++ b/PInvoke/Shared/Collections/IEnumGenerics.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Reflection; using Vanara.PInvoke; namespace Vanara.Collections @@ -134,6 +135,7 @@ namespace Vanara.Collections public class IEnumFromCom : IEnumFromNext { private readonly ComTryGetNext cnext; + private readonly object comObj; /// Initializes a new instance of the class. /// The method used to try to get the next item in the enumeration. @@ -150,9 +152,10 @@ namespace Vanara.Collections /// The COM enumeration interface instance. public IEnumFromCom(ICOMEnum enumObj) : base() { - cnext = (ComTryGetNext)Delegate.CreateDelegate(typeof(ComTryGetNext), enumObj, "Next"); - base.next = TryGet; - base.reset = (Action)Delegate.CreateDelegate(typeof(Action), enumObj, "Reset"); + comObj = enumObj; + cnext = ComObjTryGetNext; + next = TryGet; + reset = ComObjReset; } /// @@ -177,6 +180,19 @@ namespace Vanara.Collections item = res[0]; return true; } + + private HRESULT ComObjTryGetNext(uint celt, TItem[] rgelt, out uint celtFetched) + { + var para = new object[] { celt, rgelt, 0U }; + var hr = (HRESULT)comObj.GetType().InvokeMember("Next", BindingFlags.InvokeMethod, null, comObj, para); + celtFetched = (uint)para[2]; + return hr; + } + + private void ComObjReset() + { + comObj.GetType().InvokeMember("Reset", BindingFlags.InvokeMethod, null, comObj, null); + } } ///