Sign in to follow this  
Followers 0
vince100

VarSetCapacity equivalent and pointer in DllCall

3 posts in this topic

I am trying to convert the following piece of code from AHK to autoit.

I've read relevant parts of documentation of both AHK and autoit, but as a newbie I am still very confused.

I am thinking to use Binary() or DllCreateStruct, but couldn't figure out the exact syntax.

Would someone please give a hint?

VarSetCapacity( AndMask, 32*4, 0xFF )
        VarSetCapacity( XorMask, 32*4, 0 )

         b%A_Index% = DllCall("CreateCursor","uint",0, "int",0, "int",0
                , "int",32, "int",32, "uint",&AndMask, "uint",&XorMask )

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Hi, yep DLLStructs is what you use to put the Byte data array for AND/XOR mask, then when you make the DLLCall to CreateCursor you pass a pointer to each struct.

Here's where I found a MSDN example I translated to AutoIt.

Hopefully you can get a beter understanding from my crude translation.

#include <WinAPI.au3>

Global $hInstance, $xHotSpot, $yHotSpot, $nWidth, $nHeight, $tANDPlane, $tXORPlane, $hOldCursor, $hCursor_Example
Global $hGui

$hInstance = _WinAPI_GetModuleHandle(0) ; handle to current instance
$xHotSpot = 19 ; horizontal position of hot spot
$yHotSpot = 2 ; vertical position of hot spot
$nWidth = 32 ; cursor width
$nHeight = 32 ; cursor height
$tANDPlane = DllStructCreate("byte AND[128]"); Struct for AND mask (32*4 = 128)
$tXORPlane = DllStructCreate("byte XOR[128]") ; Struct for XOR mask (32*4 = 128)

_Example_ANDMaskToStruct($tANDPlane)
_Example_XORMaskToStruct($tXORPlane)

$hCursor_Example = _WinAPI_CreateCursor($hInstance, $xHotSpot, $yHotSpot, $nWidth, $nHeight, $tANDPlane, $tXORPlane)

$hGui = GUICreate("Example Create Cursor")
GUISetCursor(16, 1, $hGui)
GUISetState(@SW_SHOW, $hGui)

$hOldCursor = _WinAPI_SetCursor($hCursor_Example)

While GUIGetMsg() <> -3
    Sleep(10)
    _WinAPI_SetCursor($hCursor_Example)
WEnd

_WinAPI_SetCursor($hOldCursor)
_WINAPI_DestroyCursor($hCursor_Example)

Func _WinAPI_CreateCursor($hInstance, $xHotSpot, $yHotSpot, $nWidth, $nHeight, $tANDPlane, $tXORPlane)
    Local $aResult
    $aResult = DllCall("User32.dll", "handle", "CreateCursor", "handle", $hInstance, "int", $xHotSpot, "int", $yHotSpot, "int", $nWidth, "int", $nHeight, "ptr", DllStructGetPtr($tANDPlane), "ptr", DllStructGetPtr($tXORPlane))
    If @error Or Not $aResult[0] Then Return SetError(1, 0, 0)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_CreateCursor

Func _WINAPI_DestroyCursor($hCursor)
    Local $aResult
    $aResult = DllCall("User32.dll", "int", "DestroyCursor", "handle", $hCursor)
    If @error Or Not $aResult[0] Then Return SetError(1, 0, 0)
    Return $aResult[0]
EndFunc

Func _Example_ANDMaskToStruct(ByRef $tANDPlane)
    Local $sANDMask, $aANDMask
    $sANDMask &= "0xFF,0xFC,0x3F,0xFF," ; line 1
    $sANDMask &= "0xFF,0xC0,0x1F,0xFF," ; line 2
    $sANDMask &= "0xFF,0x00,0x3F,0xFF," ; line 3
    $sANDMask &= "0xFE,0x00,0xFF,0xFF," ; line 4
    $sANDMask &= "0xF7,0x01,0xFF,0xFF," ; line 5
    $sANDMask &= "0xF0,0x03,0xFF,0xFF," ; line 6
    $sANDMask &= "0xF0,0x03,0xFF,0xFF," ; line 7
    $sANDMask &= "0xE0,0x07,0xFF,0xFF," ; line 8
    $sANDMask &= "0xC0,0x07,0xFF,0xFF," ; line 9
    $sANDMask &= "0xC0,0x0F,0xFF,0xFF," ; line 10
    $sANDMask &= "0x80,0x0F,0xFF,0xFF," ; line 11
    $sANDMask &= "0x80,0x0F,0xFF,0xFF," ; line 12
    $sANDMask &= "0x80,0x07,0xFF,0xFF," ; line 13
    $sANDMask &= "0x00,0x07,0xFF,0xFF," ; line 14
    $sANDMask &= "0x00,0x03,0xFF,0xFF," ; line 15
    $sANDMask &= "0x00,0x00,0xFF,0xFF," ; line 16
    $sANDMask &= "0x00,0x00,0x7F,0xFF," ; line 17
    $sANDMask &= "0x00,0x00,0x1F,0xFF," ; line 18
    $sANDMask &= "0x00,0x00,0x0F,0xFF," ; line 19
    $sANDMask &= "0x80,0x00,0x0F,0xFF," ; line 20
    $sANDMask &= "0x80,0x00,0x07,0xFF," ; line 21
    $sANDMask &= "0x80,0x00,0x07,0xFF," ; line 22
    $sANDMask &= "0xC0,0x00,0x07,0xFF," ; line 23
    $sANDMask &= "0xC0,0x00,0x0F,0xFF," ; line 24
    $sANDMask &= "0xE0,0x00,0x0F,0xFF," ; line 25
    $sANDMask &= "0xF0,0x00,0x1F,0xFF," ; line 26
    $sANDMask &= "0xF0,0x00,0x1F,0xFF," ; line 27
    $sANDMask &= "0xF8,0x00,0x3F,0xFF," ; line 28
    $sANDMask &= "0xFE,0x00,0x7F,0xFF," ; line 29
    $sANDMask &= "0xFF,0x00,0xFF,0xFF," ; line 30
    $sANDMask &= "0xFF,0xC3,0xFF,0xFF," ; line 31
    $sANDMask &= "0xFF,0xFF,0xFF,0xFF " ; line 32
    $aANDMask = StringSplit($sANDMask, ",")
    For $i = 1 To $aANDMask[0]
        DllStructSetData($tANDPlane, "AND", $aANDMask[$i], $i)
    Next
EndFunc   ;==>_Example_ANDMaskToStruct

Func _Example_XORMaskToStruct(ByRef $tXORPlane)
    Local $sXORMask, $aXORMask
    $sXORMask &= "0x00,0x00,0x00,0x00," ; line 1
    $sXORMask &= "0x00,0x03,0xC0,0x00," ; line 2
    $sXORMask &= "0x00,0x3F,0x00,0x00," ; line 3
    $sXORMask &= "0x00,0xFE,0x00,0x00," ; line 4
    $sXORMask &= "0x0E,0xFC,0x00,0x00," ; line 5
    $sXORMask &= "0x07,0xF8,0x00,0x00," ; line 6
    $sXORMask &= "0x07,0xF8,0x00,0x00," ; line 7
    $sXORMask &= "0x0F,0xF0,0x00,0x00," ; line 8
    $sXORMask &= "0x1F,0xF0,0x00,0x00," ; line 9
    $sXORMask &= "0x1F,0xE0,0x00,0x00," ; line 10
    $sXORMask &= "0x3F,0xE0,0x00,0x00," ; line 11
    $sXORMask &= "0x3F,0xE0,0x00,0x00," ; line 12
    $sXORMask &= "0x3F,0xF0,0x00,0x00," ; line 13
    $sXORMask &= "0x7F,0xF0,0x00,0x00," ; line 14
    $sXORMask &= "0x7F,0xF8,0x00,0x00," ; line 15
    $sXORMask &= "0x7F,0xFC,0x00,0x00," ; line 16
    $sXORMask &= "0x7F,0xFF,0x00,0x00," ; line 17
    $sXORMask &= "0x7F,0xFF,0x80,0x00," ; line 18
    $sXORMask &= "0x7F,0xFF,0xE0,0x00," ; line 19
    $sXORMask &= "0x3F,0xFF,0xE0,0x00," ; line 20
    $sXORMask &= "0x3F,0xC7,0xF0,0x00," ; line 21
    $sXORMask &= "0x3F,0x83,0xF0,0x00," ; line 22
    $sXORMask &= "0x1F,0x83,0xF0,0x00," ; line 23
    $sXORMask &= "0x1F,0x83,0xE0,0x00," ; line 24
    $sXORMask &= "0x0F,0xC7,0xE0,0x00," ; line 25
    $sXORMask &= "0x07,0xFF,0xC0,0x00," ; line 26
    $sXORMask &= "0x07,0xFF,0xC0,0x00," ; line 27
    $sXORMask &= "0x01,0xFF,0x80,0x00," ; line 28
    $sXORMask &= "0x00,0xFF,0x00,0x00," ; line 29
    $sXORMask &= "0x00,0x3C,0x00,0x00," ; line 30
    $sXORMask &= "0x00,0x00,0x00,0x00," ; line 31
    $sXORMask &= "0x00,0x00,0x00,0x00" ; line 32
    $aXORMask = StringSplit($sXORMask, ",")
    For $i = 1 To $aXORMask[0]
        DllStructSetData($tXORPlane, "XOR", $aXORMask[$i], $i)
    Next
EndFunc   ;==>_Example_XORMaskToStruct

Cheers

Edited by smashly

Share this post


Link to post
Share on other sites

smashly, thank you very much for your help.

Your code looks great. It is exactly what I needed. ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0