in reply to Re: Re: Re: Re: Re: Win32 Shared Memory
in thread Win32 Shared Memory

It's a shame that Win32::API does this blindly, since perl strings do almost always have a null character already on the end. Certainly constant strings do. It would be easy enough for it to check before modifying...

Does it in fact add the null and increase the length of the string? Or just add the null and leave length unchanged?

  • Comment on Re: Re: Re: Re: Re: Re: Win32 Shared Memory

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: Re: Win32 Shared Memory
by BrowserUk (Patriarch) on May 16, 2004 at 05:31 UTC

    I agree. Funnily enough, I think that this maybe a new feature as I don't recall not being able to use constant strings previously.

    The line of code in question from Win32::API::Type.pm(195) is

    $_[1] = unpack("Z*", $_[1]);

    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
      Ah, I'd thought this was XS...from Perl there's no good way to inspect the string buffer beyond the actual end of the perl string. But it does look like it unintentionally modifies the caller's parameter; probably not a good thing. Is there a better way to unalias one parameter than:
      splice(@_, 1, 1, unpack("Z*", $_[1]))

        The code the goes on to return the modified $_[1],

        sub Pack { my $type = $_[0]; if(packing($type) eq 'c' and is_pointer($type)) { $_[1] = pack("Z*", $_[1]); return $_[1]; } $_[1] = pack( packing($type), $_[1]); return $_[1]; }

        so a simple  return unpack'Z*',''.$_[1]; would probably do the job in the case where the parameter is a constant string or other IN parameter.

        But that solution falls down when the parameter being passed is an OUT or INOUT buffer. In that case, the calling code need for its copy of the buffer to be modifiable by the OS, so copying the buffer to null terminate it, would be a problem.


        Examine what is said, not who speaks.
        "Efficiency is intelligent laziness." -David Dunham
        "Think for yourself!" - Abigail