Dewey Allen wrote:
>
> The following example script runs (and sometimes crashes) but for
> filenames with only ANSI characters, $FileInfo->{cFileName}, seems to
> contain only the first character. And for filenames that start with
> unicode, wide characthers, $FileInfo->{cFileName}, seems to contain
> only the leading unicode/wide characters. In the data dump output, the
> buffer seems to show the full 16bit unicode file name (e.g.,
> "t^!ki<ŠeQ›R_ H o s t I D _ 2 0 0 6 - 0 1 - 1 9 _ 2 1 4 3 5 8 . x l
> s"). I suspect that the spaces between the ANSI characters are null
> (\0) characters. And I suspect that the Perl Win32 interface layer
> treats these as null terminated C strings -- as opposed to 16 bit
> unicode characters -- and therefore terminates the string at the first
> null byte it encounters.
That's right - every other character is a null.
> Various Perl unicode documents indicate that the Win32 API unicode
> format is UTF-16LE. But decoding "$FileInfo->{cFileName}" using
> UTF-16LE doesn't seem to work any way that I've tried it.
>
> I'm also not sure of the proper array dimension for cFileName (and
> cAlternateFilename) in the WIN32_FIND_DATAW struct. In the ANSI version
> of this structure, cFileName is a TCHAR of dimension 260 (MAX_PATH)
> where TCHAR is a single byte (according to Win32:API::Type->sizeof). In
> the WIDE version (WIN32_FIND_DATAW, it's a WHCAR of the same dimension
> -- but WCHAR is 2 bytes. When I make cFileName and cAltnerateFile
> TCHARs of dimension 260 and 14 respectively, Perl crashes. And it also
> crashes when I make them WCHARs of the same dimension. Only when I
> double the dimensions to 520 and 28 does the script run without crashing
> - using either TCHAR or WCHAR.
>
> Any ideas on how to make these functions work correctly would be greatly
> appreciated. And if I'm missing something obvious or doing something
> dumb, please don't hesitate to point that out :-).
I would drop the use of the 'struct' and pack a pointer to your own block of
packed data. Win32::API::Struct is buggy and isn't handling the unpack of the
array properly - do the packing and unpacking yourself.