Hi All,

This is my keeper on Native Call.

-T

<perl6.Native.Call.Notes.txt>

Raku: Native Call notes:

Really poor reference: https://docs.raku.org/language/nativecall


1) Kernel32.dll call variables with a "p" in them are "C" pointers.

   LSTATUS RegOpenKeyExW(
       HKEY    hKey,
       LPCWSTR lpSubKey,
       DWORD   ulOptions,
       REGSAM  samDesired,
       PHKEY   phkResult
   );

    LPCWSTR and PHKEY in the above would be "C" pointers.

      A) Native Call converts Raku variables into C Pointer for you

      B) NativeCall converts the pointers to their contents of a
         returned “C” variable for you

2) to pass a "C" NULL to Native Call, send it a numerical zero.
   Note: in “C”, a NULL is a pointer whose value is zero

3) a “C” string is an array of characters terminated with chr(0)

4) Kernel32.dll calls with a “W” in them use UTF16 `uint16` values
   in their strings.  The rest you can use UTF8 `uint8`.  Most of
   the time they are interchangeable if you are using standard
   characters.

   Use the following to convert a Raku strings, `abcdefg` below,
   into a “C” string

      UTF8:  my $L =  CArray[uint8].new("abcdefg".encode.list);
      UTF16: my $M = CArray[uint16].new("abcdefg".encode.list);

   Native Call is tack the chr(0) at the end for you.

5) create two line to pass a call to Native Call (see 1) above for
   the call definition):

   constant WCHAR   := uint16;
   constant DWORD   := int32;

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

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

   $RtnCode is the Windows return error code.  Note: 0 is success

   $lpData is the actual data converted from the “C” pointer

   $lpcbData is the converted number of bytes in $lpData’s
   converted data

</perl6.Native.Call.Notes.txt>

Reply via email to