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:
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: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
(updated) - tyemy $ptr= GetAsPointer(13); my $len= 0; my $head; do { $len += 2; # (update) $head= unpack "P$len", $ptr; } until( "\0\0" eq substr($head,-2) );
In reply to Re: Win32::Clipboard and Unicode
by tye
in thread Win32::Clipboard and Unicode
by John M. Dlugosz
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |