For "A" problem, i don't think it's a else problem. You can call PeekMessage without a message parameter. In this case message == &PL_sv_undef, and no warming it's necessary.
If you specify a message parameter, then we need a reference (SvROK) and must be a Array reference. I think it's better to move SvROK(message) in inner if, like this : BOOL PeekMessage(handle, min=0, max=0, message=&PL_sv_undef) HWND handle UINT min UINT max SV* message PREINIT: MSG msg; CODE: ZeroMemory(&msg, sizeof(msg)); RETVAL = PeekMessage(&msg, handle, min, max, PM_NOREMOVE); if(message != &PL_sv_undef) { if(SvROK(message) && SvTYPE(SvRV(message)) == SVt_PVAV) { av_clear((AV*) SvRV(message)); av_push((AV*) SvRV(message), newSViv((long) msg.hwnd)); av_push((AV*) SvRV(message), newSViv(msg.message)); av_push((AV*) SvRV(message), newSViv(msg.wParam)); av_push((AV*) SvRV(message), newSViv(msg.lParam)); av_push((AV*) SvRV(message), newSViv(msg.time)); av_push((AV*) SvRV(message), newSViv(msg.pt.x)); av_push((AV*) SvRV(message), newSViv(msg.pt.y)); } else { if(PL_dowarn) warn("Win32::GUI: fourth parameter to PeekMessage is not an array reference"); } } OUTPUT: RETVAL Laurent. ----- Original Message ----- From: "Steve Pick" <[EMAIL PROTECTED]> To: "Win32 GUI Hackers" <perl-win32-gui-hackers@lists.sourceforge.net> Sent: Friday, November 21, 2003 2:50 AM Subject: [perl-win32-gui-hackers] Fix for PeekMessage > > You'll notice PeekMessage A) doesnt warn about non-references even though > the warning code is there and B) Yields a ton of "attempt to free > unreferenced scalar" errors. The problem was an else{} in the wrong place, > and making array values mortal so they got cleaned up before they ever hit > your perl program, so here's it fixed. > > ########################################################################### > # (@)METHOD:PeekMessage([MIN, MAX, MESSAGE]) > # Inspects the window's message queue and eventually returns data > # about the message it contains; it can optionally check only for > message > # identifiers in the range MIN..MAX; the last MESSAGE parameter, if > # specified, must be an array reference. > # If a message is found, the function puts in that array 7 elements > # containing: > # - the handle of the window to which the message is addressed > # - the message identifier > # - the wParam argument > # - the lParam argument > # - the time when message occurs > # - the x coordinate at which message occurs > # - the y coordinate at which message occurs > # > BOOL > PeekMessage(handle, min=0, max=0, message=&PL_sv_undef) > HWND handle > UINT min > UINT max > SV* message > PREINIT: > MSG msg; > CODE: > ZeroMemory(&msg, sizeof(msg)); > RETVAL = PeekMessage(&msg, handle, min, max, PM_NOREMOVE); > if(message != &PL_sv_undef && SvROK(message)) { > if(SvTYPE(SvRV(message)) == SVt_PVAV) { > av_clear((AV*) SvRV(message)); > av_push((AV*) SvRV(message), newSViv((long) msg.hwnd)); > av_push((AV*) SvRV(message), newSViv(msg.message)); > av_push((AV*) SvRV(message), newSViv(msg.wParam)); > av_push((AV*) SvRV(message), newSViv(msg.lParam)); > av_push((AV*) SvRV(message), newSViv(msg.time)); > av_push((AV*) SvRV(message), newSViv(msg.pt.x)); > av_push((AV*) SvRV(message), newSViv(msg.pt.y)); > } > } > else { > if(PL_dowarn) warn("Win32::GUI: fourth parameter to PeekMessage is > not an array reference"); > } > OUTPUT: > RETVAL