The MS API GetClipboardData provides no way to get the length of the data returned. Quite an unfortunate design.

The patch for GetAs to handle CF_UNICODETEXT is rather small. Add a CF_UNICODETEXT case that determines the length of the data by searching for two adjacent zero bytes (or, better, using an MS API that does this). You could even tell Perl that the string is Unicode since the support for such in Perl is starting to mature.

I'll let you track down the details. It shouldn't be terribly difficult, just a bit time-consuming. If you run into road blocks, let us know.

You could also provide an alternate interface similar to GetAs that returns the actual pointer instead of trying to copy the pointed-at string into a Perl variable. This would allow you to grab as much data as you want from that pointer using Perl code:

SV * GetAsPointer( format ) int format CODE: RETVAL= &PV_sv_undef; if( OpenClipboard(NULL) ) { char *data= (char *)GetClipboardData((UINT)format); RETVAL= newSVpvn( data, (char *)&data, sizeof(data) ); CloseClipboard(); } OUTPUT: RETVAL
but note that it is slow and painful to use Perl to pull the data out of such a pointer until you find the end of the string:
my $ptr= GetAsPointer(13); my $len= 0; my $head; do { $len += 2; # (update) $head= unpack "P$len", $ptr; } until( "\0\0" eq substr($head,-2) );
(updated)

                - tye

In reply to Re: Win32::Clipboard and Unicode by tye
in thread Win32::Clipboard and Unicode by John M. Dlugosz

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.