github.com/remoteit/go-ole@v1.2.7/ienumvariant_test.go (about)

     1  // +build windows
     2  
     3  package ole
     4  
     5  import "testing"
     6  
     7  func TestIEnumVariant_wmi(t *testing.T) {
     8  	var err error
     9  	var classID *GUID
    10  
    11  	IID_ISWbemLocator := &GUID{0x76a6415b, 0xcb41, 0x11d1, [8]byte{0x8b, 0x02, 0x00, 0x60, 0x08, 0x06, 0xd9, 0xb6}}
    12  
    13  	err = CoInitialize(0)
    14  	if err != nil {
    15  		t.Errorf("Initialize error: %v", err)
    16  	}
    17  	defer CoUninitialize()
    18  
    19  	classID, err = ClassIDFrom("WbemScripting.SWbemLocator")
    20  	if err != nil {
    21  		t.Errorf("CreateObject WbemScripting.SWbemLocator returned with %v", err)
    22  	}
    23  
    24  	comserver, err := CreateInstance(classID, IID_IUnknown)
    25  	if err != nil {
    26  		t.Errorf("CreateInstance WbemScripting.SWbemLocator returned with %v", err)
    27  	}
    28  	if comserver == nil {
    29  		t.Error("CreateObject WbemScripting.SWbemLocator not an object")
    30  	}
    31  	defer comserver.Release()
    32  
    33  	dispatch, err := comserver.QueryInterface(IID_ISWbemLocator)
    34  	if err != nil {
    35  		t.Errorf("context.iunknown.QueryInterface returned with %v", err)
    36  	}
    37  	defer dispatch.Release()
    38  
    39  	wbemServices, err := dispatch.CallMethod("ConnectServer")
    40  	if err != nil {
    41  		t.Errorf("ConnectServer failed with %v", err)
    42  	}
    43  	defer wbemServices.Clear()
    44  
    45  	objectset, err := wbemServices.ToIDispatch().CallMethod("ExecQuery", "SELECT * FROM WIN32_Process")
    46  	if err != nil {
    47  		t.Errorf("ExecQuery failed with %v", err)
    48  	}
    49  	defer objectset.Clear()
    50  
    51  	enum_property, err := objectset.ToIDispatch().GetProperty("_NewEnum")
    52  	if err != nil {
    53  		t.Errorf("Get _NewEnum property failed with %v", err)
    54  	}
    55  	defer enum_property.Clear()
    56  
    57  	enum, err := enum_property.ToIUnknown().IEnumVARIANT(IID_IEnumVariant)
    58  	if err != nil {
    59  		t.Errorf("IEnumVARIANT() returned with %v", err)
    60  	}
    61  	if enum == nil {
    62  		t.Error("Enum is nil")
    63  		t.FailNow()
    64  	}
    65  	defer enum.Release()
    66  
    67  	for tmp, length, err := enum.Next(1); length > 0; tmp, length, err = enum.Next(1) {
    68  		if err != nil {
    69  			t.Errorf("Next() returned with %v", err)
    70  		}
    71  		tmp_dispatch := tmp.ToIDispatch()
    72  		defer tmp_dispatch.Release()
    73  
    74  		props, err := tmp_dispatch.GetProperty("Properties_")
    75  		if err != nil {
    76  			t.Errorf("Get Properties_ property failed with %v", err)
    77  		}
    78  		defer props.Clear()
    79  
    80  		props_enum_property, err := props.ToIDispatch().GetProperty("_NewEnum")
    81  		if err != nil {
    82  			t.Errorf("Get _NewEnum property failed with %v", err)
    83  		}
    84  		defer props_enum_property.Clear()
    85  
    86  		props_enum, err := props_enum_property.ToIUnknown().IEnumVARIANT(IID_IEnumVariant)
    87  		if err != nil {
    88  			t.Errorf("IEnumVARIANT failed with %v", err)
    89  		}
    90  		defer props_enum.Release()
    91  
    92  		class_variant, err := tmp_dispatch.GetProperty("Name")
    93  		if err != nil {
    94  			t.Errorf("Get Name property failed with %v", err)
    95  		}
    96  		defer class_variant.Clear()
    97  
    98  		class_name := class_variant.ToString()
    99  		t.Logf("Got %v", class_name)
   100  	}
   101  }