mIRC Home    About    Download    Register    News    Help

Print Thread
Joined: Apr 2010
Posts: 969
F
Hoopy frood
OP Offline
Hoopy frood
F
Joined: Apr 2010
Posts: 969
I've spent the last few hours digging and can't seem to find a way to reference non-primitive members in a returned enumerate. It'd be super helpful if $comval() allowed dispatching/creating references to Individual items in the enumerate:

Code:
$comval(com, 1, dispatch* dispatchedEnumItem)


For a use case of where this is needed:
Code:
alias myips {
  var %err

  .comopen loc WbemScripting.SWbemLocator
  if ($comerr) {
    %err = Failed to create SWbemLocator
  }
  elseif (!$com(loc, ConnectServer, 3, dispatch* ser)) && ($comerr) {
    %err = Failed to retrieve connected server
  }

  ;; Results in an Enumerate being dispatched
  ;; Enumerate contains: https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx
  elseif (!$com(ser, ExecQuery, 3, bstr, Select * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = "True", dispatch* res)) && ($comerr) {
    %err = Failed to retrieve network adapters
  }
  else {

    
    ;; mIRC returns nothing when referencing the IPAddress property because its a non-primitive(array)
    echo -a $comval(res, 1, IPAddress)


  }
  :error
  if ($error || %err) {
    echo -a /myips: $v1
    reseterror
  }
  .comclose %lst
  .comclose %ser
  .comclose %loc
}

Last edited by FroggieDaFrog; 14/12/17 05:40 PM.

I am SReject
My Stuff
Joined: Aug 2016
Posts: 57
R
Babel fish
Offline
Babel fish
R
Joined: Aug 2016
Posts: 57
I support this suggestion!


rockcavera
#Scripts @ irc.VirtuaLife.com.br
Joined: Apr 2010
Posts: 969
F
Hoopy frood
OP Offline
Hoopy frood
F
Joined: Apr 2010
Posts: 969
My example has some typos in it, so here's a corrected version:

Code:
alias myips {
  var %q = SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = "True"
  var %err

  .comopen loc WbemScripting.SWbemLocator

  if ($comerr) {
    %err = Failed to create SWbemLocator
  }
  elseif (!$com(loc, ConnectServer, 3, dispatch* ser) || $comerr) {
    %err = Failed to connect to server
  }
  elseif (!$com(ser, ExecQuery, 3, bstr, %q, dispatch* res) || $comerr) {
    %err = Failed to retrieve network adapters
  }
  else {

    ;; res is a reference to an Enumerator containing:
    ;; https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx

    ;; mIRC returns nothing when referencing the IPAddress property
    ;; because its a non-supported type(array of strings)
    echo -a $comval(res, 1, IPAddress)
  }
  :error
  if ($error || %err) {
    echo -a /myips: $v1
    reseterror
  }
  .comclose lst
  .comclose ser
  .comclose loc
}


Also of note is that I tried various Enumerate properties/methods to get a reference to returned enumerated items without success(DISP_E_UNKNOWNNAME) so if there's something I missed, please let me know:
Code:
$com(res, Current, 2, dispatch* ips)
$com(res, GetValue, 1, i4, 0, dispatch* ips)

Last edited by FroggieDaFrog; 15/12/17 02:21 PM.

I am SReject
My Stuff

Link Copied to Clipboard