Guest User

Untitled

a guest
Feb 26th, 2024
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.59 KB | None | 0 0
  1. import os
  2. import winim/clr
  3. import sugar, strutils
  4.  
  5. const code = """
  6.  using System;
  7.  using System.Reflection;
  8.  using System.Runtime.InteropServices;
  9.  using System.Management;
  10.  
  11.  public class EventHelper {
  12.    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
  13.    public delegate void CallbackType([MarshalAs(UnmanagedType.IUnknown)] Object arg);
  14.  
  15.    public EventArrivedEventHandler MakeHandler(IntPtr cb) {
  16.      return new EventArrivedEventHandler(delegate(Object sender, EventArrivedEventArgs e) {
  17.        Marshal.GetDelegateForFunctionPointer(cb, typeof(CallbackType)).DynamicInvoke(sender);
  18.      });
  19.    }
  20.  
  21.    public void SetEventArrived(ManagementEventWatcher watcher, EventArrivedEventHandler handler) {
  22.      watcher.EventArrived += handler;
  23.    }
  24.  }
  25. """
  26.  
  27. proc eventHandler(sender: ptr IUnknown) {.stdcall.} =
  28.   echo toCLRVariant(sender)
  29.   echo "I'm in the event handler, neat!"
  30.  
  31. proc test1() =
  32.   var res: CLRVariant = compile(code, ["System.dll", "System.Management.dll"])
  33.   if res.Errors.Count != 0:
  34.     for error in res.Errors:
  35.       echo error
  36.     quit()
  37.  
  38.  
  39.   var sysmgmt = load("System.Management")
  40.   var query = sysmgmt.new("System.Management.WqlEventQuery", "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'")
  41.   var watcher = sysmgmt.new("System.Management.ManagementEventWatcher", query)
  42.  
  43.   var eventHelper = res.CompiledAssembly.new("EventHelper")
  44.   var handler = eventHelper.MakeHandler(eventHandler[])
  45.  
  46.   eventHelper.SetEventArrived(watcher, handler)
  47.  
  48.   watcher.Start()
  49.  
  50.   while true:
  51.     sleep(1000)
  52.  
  53. test1()
  54.  
Advertisement
Add Comment
Please, Sign In to add comment