Sign in to follow this  
Followers 0
stormbreaker

Help with DllStruct and Pointers

7 posts in this topic

;) Hello everyone! Finally exam-time is over and the fun restarts...

I am working on using bluetooth in AutoIt. I wrote the following script to implement BluetoothFindFirstRadio function. (http://msdn.microsoft.com/en-us/library/windows/desktop/aa362786(v=vs.85).aspx)

#include <WinAPI.au3>
Global $phRadio
$BLUETOOTH_FIND_RADIO_PARAMS = DllStructCreate('DWORD')
DllStructSetData($BLUETOOTH_FIND_RADIO_PARAMS, 1 , DllStructGetSize($BLUETOOTH_FIND_RADIO_PARAMS))
$RESULT = DllCall("bthprops.cpl", "handle", "BluetoothFindFirstRadio", "struct", DllStructGetPtr($BLUETOOTH_FIND_RADIO_PARAMS, 1), "Handle", $phRadio)
msgbox(64, "", _WinAPI_GetLastErrorMessage())
msgbox(16, "", $RESULT[0])

The problem is, it throws up an error: 'subscript used with non-array variable'. GetLastErrorMessage returns fine and @error = 0, which indicates that DllCall should be successful. :) Could anyone please point me in the right direction.

Thanx a lot.

Regards,

MKISH


----------------------------------------

:bye: Hey there, was I helpful?

----------------------------------------

My Current OS: Win8 PRO (64-bit); Current AutoIt Version: v3.3.8.1

Share this post


Link to post
Share on other sites



Both parameters data types should be ptr instead of struct and handle; and you should pass pointers from a handle struct and dword struct. Anyway I'm not sure if DllCall it work with cpl but none died trying. ;)


When the words fail... music speaks

Share this post


Link to post
Share on other sites

Thanks for your attempt friend, but it doesn't work (AutoIt crashes). ;) As for DllCall(), it definitely works with CPL, OCX and even DRV files. I wrote a weeks back which used DllCall() on bthprops.cpl. Check http://support.microsoft.com/kb/815065 for more info.

Regards


----------------------------------------

:bye: Hey there, was I helpful?

----------------------------------------

My Current OS: Win8 PRO (64-bit); Current AutoIt Version: v3.3.8.1

Share this post


Link to post
Share on other sites

GetLastErrorMessage returns fine and @error = 0, which indicates that DllCall should be successful. ;)

How are you checking that when there is no @error anywhere in your code? I checked, and it returns 5 here.

You're both doing "struct" "wrong", but I can't get into that now, I'm on my way out. See you later.

Share this post


Link to post
Share on other sites

Hi,

You want to specify a reference/pointer to a struct as a parameter. So the type is struct*. Then just use the structure, autoit uses the pointer automatically for this type.

#include <WinAPI.au3>
Global Const $hDllBthProps = DllOpen("bthprops.cpl")

Local $phRadio
$hFind = _BluetoothFindFirstRadio($phRadio)
MsgBox(0, "", "error: " & @error & @CRLF & "hFind: " & $hFind & @CRLF & "hRadio: " & $phRadio)
_WinAPI_CloseHandle($phRadio)
_BluetoothFindRadioClose($hFind)

Func _BluetoothFindFirstRadio(ByRef $phRadio)
    $tBLUETOOTH_FIND_RADIO_PARAMS = DllStructCreate('DWORD')
    DllStructSetData($tBLUETOOTH_FIND_RADIO_PARAMS, 1 , DllStructGetSize($tBLUETOOTH_FIND_RADIO_PARAMS))
    $aResult = DllCall($hDllBthProps, "handle", "BluetoothFindFirstRadio", "struct*", $tBLUETOOTH_FIND_RADIO_PARAMS, "handle*", 0)
    If @error Then Return SetError(2, @error, 0)
    $phRadio = $aResult[2]
    Return SetError($aResult[0] = 0, 0, $aResult[0])
EndFunc

Func _BluetoothFindRadioClose($hBtFind)
    Local $aResult = DllCall($hDllBthProps, "bool", "BluetoothFindRadioClose", "handle", $hBtFind)
    If @error Then Return SetError(2, @error, 0)
    Return SetError($aResult[0] = 0, 0, $aResult[0])
EndFunc

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

;) Hats off to ProgAndy!!

As far as for error-checking, replace $RESULT[0] in last line with @error. It returns 0.

Regards.

Edited by MKISH

----------------------------------------

:bye: Hey there, was I helpful?

----------------------------------------

My Current OS: Win8 PRO (64-bit); Current AutoIt Version: v3.3.8.1

Share this post


Link to post
Share on other sites

As far as for error-checking, replace $RESULT[0] in last line with @error. It returns 0.

MSDN says, FALSE is returned on failure. FALSE is 0.

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

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