Code: Select all
#NoEnv
NetworkListManager := ComObjCreate("{DCB00C01-570F-4A9B-8D69-199FDBA5723B}")
IEnumNetworkConnections := NetworkListManager.GetNetworkConnections()
for key, val in IEnumNetworkConnections
{
rgelt := ComObject(9, key, 1)
INetwork := rgelt.GetNetwork()
if (INetwork) {
MsgBox % INetwork.GetName()
ObjRelease(INetwork)
}
}
Code: Select all
NetworkListManager := ComObjCreate("{DCB00C01-570F-4A9B-8D69-199FDBA5723B}")
IEnumNetworkConnections := NetworkListManager.GetNetworkConnections()._NewEnum() ; Uses IEnumNetworkConnections->get__NewEnum() ?
if IsObject(IEnumNetworkConnections)
while IEnumNetworkConnections.Next(Key, Value)
{
INetwork := Value.GetNetwork()
if (INetwork) {
MsgBox % INetwork.GetName()
ObjRelease(INetwork)
}
}
If I try calling IEnumNetworkConnections::Next, I do not have much success there either:
Code: Select all
NetworkListManager := ComObjCreate("{DCB00C01-570F-4A9B-8D69-199FDBA5723B}")
IEnumNetworkConnections := NetworkListManager.GetNetworkConnections()
VarSetCapacity(var, 1024, 0) ; lazily making the size large enough for now just to rule out one source of error
vref := ComObject(9 | 0x4000, &var) ; VT_DISPATCH | VT_BYREF
Next := IEnumNetworkConnections.Next(1, vref, 0) ; Does the last argument suffice for a NULL pointer, or must ComObject be used again? AHK doesn't bring up any error messages so I assume so...
INetwork := Next.GetNetwork()
if (INetwork) {
MsgBox % INetwork.GetName() ; doesn't show
}
INetwork := vref.GetNetwork() ; no valid COM object!
if (INetwork) {
MsgBox % INetwork.GetName()
}
INetwork := var.GetNetwork()
if (INetwork) {
MsgBox % INetwork.GetName() ; doesn't show
}
If I give up and just go back to calling the method in the VTable directly, everything works (as seen below), but when everything here implements IDispatch or IEnumVariant, I feel like I'm missing out on something by not fully utilising the native AutoHotkey functionality that maps to those.
Code: Select all
#NoEnv
NetworkListManager := ComObjCreate("{DCB00C01-570F-4A9B-8D69-199FDBA5723B}")
IEnumNetworkConnections := NetworkListManager.GetNetworkConnections()
IEnumNetworkConnections_ptr := ComObjValue(IEnumNetworkConnections)
if (IEnumNetworkConnections_ptr)
{
while (DllCall(NumGet(NumGet(IEnumNetworkConnections_ptr+0)+8*A_PtrSize), "Ptr", IEnumNetworkConnections_ptr, "UInt", 1, "Ptr*", rgelt, "Ptr", 0) == 0) ; IEnumNetworkConnections::Next
{
rgelt := ComObject(9, rgelt, 1)
INetwork := rgelt.GetNetwork()
if (INetwork) {
MsgBox % INetwork.GetName() ; Actually shows the profile name of the network I'm connected to
ObjRelease(INetwork)
}
ObjRelease(rgelt)
}
}
ObjRelease(IEnumNetworkConnections)
ObjRelease(NetworkListManager)
Thanks.