Skip to content

INVALID_HANDLE_VALUE has the 32-bit value even in 64-bit builds #13

Description

@nmisch

Program:

use Win32API::File ();
close STDIN;
printf("INVALID_HANDLE_VALUE = 0x%x\nFdGetOsFHandle = 0x%x\n",
       Win32API::File::INVALID_HANDLE_VALUE,
       Win32API::File::FdGetOsFHandle(0));

I expected the two handle values to be equal, since the FdGetOsFHandle pod
documentation says, on failure, "C<$hNativeHandle> is set to
C<INVALID_HANDLE_VALUE>". In strawberry-perl-5.32.1.1-64bit, the handles
are unequal. Program output:

INVALID_HANDLE_VALUE = 0xffffffff
FdGetOsFHandle = 0xffffffffffffffff

Equivalently, one can see this in a TAP test by adding t/closed.t with the
following content:

use Test::More;
use Win32API::File ();
plan tests => 1;
close STDIN;
is(Win32API::File::INVALID_HANDLE_VALUE, Win32API::File::FdGetOsFHandle(0));

I get this behavior with the preinstalled module and also when building
https://github.com/chorny/Win32API-File in the
strawberry-perl-5.32.1.1-64bit environment.
Win32API::File::INVALID_HANDLE_VALUE is the value that C-level
INVALID_HANDLE_VALUE would have in a 32-bit binary, despite this being a
64-bit Perl.

The distribution has code, disabled by default, for regenerating the constants
(search for Myconst2perl and NO_REBUILD). Enabling that code yields one
error and a flurry of warnings:

...
const2perl.h:119:19: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]
  newconst( sName, "%"IVdf, iValue, newSViv(iValue) );
                   ^
const2perl.h:122:19: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]
  newconst( sName, "%"IVdf, iValue, newSViv(iValue) );
                   ^
const2perl.h:133:19: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]
  newconst( sName, "0x%"UVxf, (UV)(pValue), mpSvNew );
                   ^
const2perl.h:99:5: error: extra qualification '_const2perl::' on member '_const2perl' [-fpermissive]
     _const2perl::_const2perl( char *sModName ) {
     ^~~~~~~~~~~
File.xs: In function 'int main(int, char**, char**)':
const2perl.h:143:63: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
 #define START_CONSTS( sModName ) _const2perl const2( sModName );
                                                               ^
File.xs:28:5: note: in expansion of macro 'START_CONSTS'
 #if (PERL_REVISION <= 5 && PERL_VERSION < 5) || defined(__CYGWIN__)
     ^~~~~~~~~~~~
const2perl.h:144:60: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
 #define const2perl( const )  const2.mkconst( #const, const )
                                                            ^
File.xs:40:5: note: in expansion of macro 'const2perl'
 #  undef _open_osfhandle /* stolen_open_osfhandle() isn't available here */
     ^~~~~~~~~~
const2perl.h:144:60: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
 #define const2perl( const )  const2.mkconst( #const, const )
                                                            ^
...

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions