Win32::API->Import(
'mydll',
'BOOL SomeFunction(
LPDWORD lpCount
)',
);
####
my $nCount = 5;
SomeFunction($nCount);
####
SomeFunction(undef);
####
use strict;
use warnings;
use Win32::API qw( );
use Win32API::File qw( GetOsFHandle INVALID_HANDLE_VALUE );
use Time::HiRes qw( sleep );
use constant ERROR_BROKEN_PIPE => 109;
sub get_pv { unpack 'L!', pack 'P', $_[0] }
BEGIN {
# BOOL WINAPI PeekNamedPipe(
# __in HANDLE hNamedPipe,
# __out_opt LPVOID lpBuffer,
# __in DWORD nBufferSize,
# __out_opt LPDWORD lpBytesRead,
# __out_opt LPDWORD lpTotalBytesAvail,
# __out_opt LPDWORD lpBytesLeftThisMessage
# )
my $f = Win32::API->new('kernel32', 'PeekNamedPipe', 'LLLLLL', 'L')
or die $^E;
sub PeekNamedPipe {
my $nBytesRead;
my $nTotalBytesAvail;
my $nBytesLeftThisMessage;
$nBytesRead = pack('L!', $_[3]) if defined $_[3];
$nTotalBytesAvail = pack('L!', $_[4]) if defined $_[4];
$nBytesLeftThisMessage = pack('L!', $_[5]) if defined $_[5];
my $rv = $f->Call(
$_[0],
get_pv($_[1]),
$_[2],
get_pv($nBytesRead),
get_pv($nTotalBytesAvail),
get_pv($nBytesLeftThisMessage),
);
$_[3] = unpack('L!', $nBytesRead ) if defined $_[3];
$_[4] = unpack('L!', $nTotalBytesAvail ) if defined $_[4];
$_[5] = unpack('L!', $nBytesLeftThisMessage) if defined $_[5];
return $rv;
}
}
my $cmd = 'perl -le"$|++;print localtime().q[: some text] and sleep 1 for 1..10" |';
my $pid = open my $pipe, $cmd
or die $!;
( my $pHandle = GetOsFHandle( $pipe ) ) != INVALID_HANDLE_VALUE
or die $^E;
print("Handle: $pHandle\n");
my $buf = '';
for (;;) {
my $avail = 0;
if ( !PeekNamedPipe( $pHandle, undef, 0, undef, $avail, undef ) ) {
last if $^E == ERROR_BROKEN_PIPE;
die $^E;
}
print("Avail: $avail");
print(" (+" . length($buf) . ")") if length($buf);
print("\n");
if ( $avail ) {
sysread($pipe, $buf, $avail, length($buf) )
or die $!;
while ( $buf =~ s/^(.*)\n// ) {
my $line = $1;
## Do stuff with $line
print( "Got: $line\n" );
}
}
else {
print( "Zzzz\n" );
sleep(0.500);
}
}
####
Handle: 1980
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:32 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:33 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:34 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:35 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:36 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:37 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:38 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:39 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:40 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz
Avail: 37
Got: Tue Sep 30 19:23:41 2008: some text
Avail: 0
Zzzz
Avail: 0
Zzzz