Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import winim/clr
- import sugar, strutils
- const code = """
- using System;
- using System.Reflection;
- using System.Runtime.InteropServices;
- using System.Management;
- public class EventHelper {
- [UnmanagedFunctionPointer(CallingConvention.StdCall)]
- public delegate void CallbackType([MarshalAs(UnmanagedType.IUnknown)] Object arg);
- public EventArrivedEventHandler MakeHandler(IntPtr cb) {
- return new EventArrivedEventHandler(delegate(Object sender, EventArrivedEventArgs e) {
- Marshal.GetDelegateForFunctionPointer(cb, typeof(CallbackType)).DynamicInvoke(sender);
- });
- }
- public void SetEventArrived(ManagementEventWatcher watcher, EventArrivedEventHandler handler) {
- watcher.EventArrived += handler;
- }
- }
- """
- proc eventHandler(sender: ptr IUnknown) {.stdcall.} =
- echo toCLRVariant(sender)
- echo "I'm in the event handler, neat!"
- proc test1() =
- var res: CLRVariant = compile(code, ["System.dll", "System.Management.dll"])
- if res.Errors.Count != 0:
- for error in res.Errors:
- echo error
- quit()
- var sysmgmt = load("System.Management")
- var query = sysmgmt.new("System.Management.WqlEventQuery", "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'")
- var watcher = sysmgmt.new("System.Management.ManagementEventWatcher", query)
- var eventHelper = res.CompiledAssembly.new("EventHelper")
- var handler = eventHelper.MakeHandler(eventHandler[])
- eventHelper.SetEventArrived(watcher, handler)
- watcher.Start()
- while true:
- sleep(1000)
- test1()
Advertisement
Add Comment
Please, Sign In to add comment