I am writing a simple test application that calls out to a custom dll to
interface with Windows WMI. I am currently trying to get callbacks
working for WMI Events. I have the following defines for creating an alert:
(define create-alert (c-lambda ((function (wbem-object) int)) void
"WMICreateAlert"))
(c-define (wmi-alert-callback alert) ("WBEMOBJ") int "wmi_alert_callback" ""
(+ 1 2))
For testing I have the callback return an integer that I printf() in the
dll. I then call:
(create-alert wmi-alert-callback)
(read-char)
to create the alert, and wait around for something to happen. When the
alert is triggered, everything works, and I get back 3 as expected from
the scheme callback. However, if I put anything more complex in the body
of wmi-alert-callback (for example (write 3), or (length alert)) The
application crashes. The debugger is showing that I am not crashing in
the callback thread, but rather the main thread at line 3965 in
_kernel.c (I have not yet figured out what the actual function name is):
#undef ___ARG1
___SET_R0(___LBL(12))
___JUMPGENNOTSAFE(___SET_NARGS(0),___FIX(0L))
___DEF_SLBL(12,___L12__23__23_kernel_2d_handlers)
#define ___ARG1 ___R1
{ ___SCMOBJ ___RESULT;
...
ra1 = ___FP_STK(fp,-___FRAME_STACK_RA); // **** here ****
...
fp is reading as 0x00000000 in the debugger. I seems that I am having a
problem getting the callback thread to play nicely with the main thread
in Gambit. I am out of my element here, so any advice would be
appreciated. Is there something I need to do special to get the main
Gambit thread to work with callbacks from the Windows subsystem?
Cheers,
Tim