From ece5bbbd0e4962f480df1e48118e775bf92a8e30 Mon Sep 17 00:00:00 2001 From: "sokoloff (Alexander)" Date: Thu, 16 Jun 2016 19:59:50 +0300 Subject: [PATCH] Use _NewEnum because SWbemObjectSet does not have ItemIndex on some systems (Win2003, WinXP). Closes issues #2, #10 and #12. --- wmi.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/wmi.go b/wmi.go index b931ca5..3214224 100644 --- a/wmi.go +++ b/wmi.go @@ -171,19 +171,33 @@ func (c *Client) Query(query string, dst interface{}, connectServerArgs ...inter return err } + enumProperty, err := result.GetProperty("_NewEnum") + if err != nil { + return err + } + defer enumProperty.Clear() + + enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) + if err != nil { + return err + } + if enum == nil { + return fmt.Errorf("can't get IEnumVARIANT, enum is nil") + } + // Initialize a slice with Count capacity dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count))) var errFieldMismatch error - for i := int64(0); i < count; i++ { + for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) { + if err != nil { + return err + } + err := func() error { // item is a SWbemObject, but really a Win32_Process - itemRaw, err := oleutil.CallMethod(result, "ItemIndex", i) - if err != nil { - return err - } item := itemRaw.ToIDispatch() - defer itemRaw.Clear() + defer item.Release() ev := reflect.New(elemType) if err = c.loadEntity(ev.Interface(), item); err != nil {