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


Reply via email to