SV* MyConnectCbPerl = NULL; void* pMyConnectCbPerlCTX = NULL; extern void wrap_connect_cback_handler(BOOL bConnected); XS(_wrap_MyRegister) { { PFN_CONNECT_CALLBACK arg1 = (PFN_CONNECT_CALLBACK) 0 ; int argvi = 0; DWORD result; dXSARGS; if ((items < 1) || (items > 1)) { SWIG_croak("Usage: MyRegister(pfnConnectCallback);"); } { int status = IsValidCBRef(ST(0)); if (status == 0) { MyConnectCbPerl = (SV *)ST(0); //Save registered sub refrence pMyConnectCbPerlCTX = Perl_get_context(); //Save Perl Context arg1 = wrap_connect_cback_handler; //Register a wrapper function. When fired, the wrapper function invokes the perl subroutine. } } result = (DWORD)MyRegister(arg1); ST(argvi) = SWIG_From_unsigned_SS_long SWIG_PERL_CALL_ARGS_1((unsigned long)(result)); argvi++ ; XSRETURN(argvi); fail: SWIG_croak_null(); } }