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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~