On Fri, Dec 27, 2019 at 6:06 AM ToddAndMargo via perl6-users <perl6-users@perl.org <mailto:perl6-users@perl.org>> wrote:

    Hi All,

    https://docs.perl6.org/language/nativecall

           "As you may have predicted by now, a NULL pointer
           is represented by the type object of the struct type."

    
https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexw

           C++
           LSTATUS RegQueryValueExW(
             HKEY    hKey,
             LPCWSTR lpValueName,
             LPDWORD lpReserved,
             LPDWORD lpType,
             LPBYTE  lpData,
             LPDWORD lpcbData
           );

           lpReserved
           This parameter is reserved and must be NULL.

    With "native", how do I satisfy the "NULL" requirement?

    constant WCHAR   := uint16;

    constant DWORD   := int32;


    sub RegQueryValueExW( DWORD, WCHARS, DWORD, DWORD, DWORD is rw,
    DWORD is
    rw ) is native("Kernel32.dll") returns DWORD { * };

    $RtnCode = RegQueryValueExW( $Handle, $lpValueName, int32, REG_DWORD,
    $lpData, $lpcbData );

    "int32" returns:

          Cannot unbox a type object (int32) to int in method
          CALL-ME at C:\rakudo\share\perl6\sources
    \947BDAB9F96E0E5FCCB383124F9
          23A6BF6F8D76B (NativeCall) line 587


    Many thanks,
    -T


On 2019-12-27 06:10, Brad Gilbert wrote:
A Null pointer is just a pointer that points to the address 0.

So if you are dealing with it as an integer it will be 0.


Hi Brad,

Sending a zero to it causes the program to exit with no
error code.

The offending line is:
$RtnCode = RegQueryValueExW( $Handle, $lpValueName, 0, REG_DWORD, $lpData, $lpcbData );


Sending it a zero:
<code>
say "RegQueryValueExW";

sub RegQueryValueExW( DWORD, WCHARS, DWORD, DWORD, DWORD is rw, DWORD is rw ) is native("Kernel32.dll") returns DWORD { * };


say "1";


$RtnCode = RegQueryValueExW( $Handle, $lpValueName, 0, REG_DWORD, $lpData, $lpcbData );


say "2";


say "RegQueryValueExW RtnCode $RtnCode (6 = The handle is invalid; 87 = ERROR_INVALID_PARAMETER)\nlpData pointer $lpData\nlpcbData data length $lpcbData\n";

</code>

<result>
RegQueryValueExW
1
</result>
Note that it dies without an error code.


Sending it a one:
<code>
say "RegQueryValueExW";

sub RegQueryValueExW( DWORD, WCHARS, DWORD, DWORD, DWORD is rw, DWORD is rw ) is native("Kernel32.dll") returns DWORD { * };

say "1";

$RtnCode = RegQueryValueExW( $Handle, $lpValueName, 1, REG_DWORD, $lpData, $lpcbData );

say "2";

say "RegQueryValueExW RtnCode $RtnCode (6 = The handle is invalid; 87 = ERROR_INVALID_PARAMETER)\nlpData pointer $lpData\nlpcbData data length $lpcbData\n";
</code>

<result>
RegQueryValueExW
1
2
RegQueryValueExW RtnCode 87 (6 = The handle is invalid; 87 = ERROR_INVALID_PARAMETER)
lpData pointer 0
lpcbData data length 0
</result>


I can't win.

:'(

Thank you for the help.

-T

--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Computers are like air conditioners.
They malfunction when you open windows
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to