I don't have Windows, but after googling a bit, it looks like IO::Uncompress::Unzip and IO::Compress::Zip does what you want from a high level interface. That will save you the trouble of dealing with IO::Scalar manually unzipping and tracking position. There are examples in the docs.
use IO::Scalar;
my $memory_file = ''; #scalar as a file ,
my $memfile_fh = IO::Scalar->new(\$memory_file); #filehandle to the sc
+alar
# write to the scalar $memory_file
my $status = $zip->writeToFileHandle($memfile_fh);
$memfile_fh->close;