Jump to content

Recommended Posts

Posted (edited)

 

Hello everyone,

I'm excited to share a new AutoIt UDF library: SafeArray UDF. This library simplifies working with COM SafeArrays and VARIANT structures, making it easier to interact with COM objects (like Excel, ADO, or other applications) in AutoIt scripts.

Key Features

  • Bidirectional Conversion: Convert AutoIt arrays to COM SafeArrays and vice versa (up to 5 dimensions).
  • SafeArray Management: Create, modify, access, and destroy SafeArrays using functions like _SafeArrayCreate, _SafeArrayGetElement, _SafeArrayPutElement, and _SafeArrayDestroy.
  • VARIANT Support: Convert AutoIt data (integers, strings, arrays, COM objects) to VARIANTs and back with _VariantSet and _VariantRead.
  • BSTR Handling: Allocate, read, and free COM strings with _SysAllocString, _SysReadString, and _SysFreeString.
  • 32/64-bit Compatibility: Works with AutoIt 3.3+ without external dependencies, except Date.au3 for $VT_DATE types.
  • Error Handling: Uses @error to report issues (e.g., invalid pointers, incorrect dimensions).

Why Use This UDF?

SafeArrays are a standard for passing multi-dimensional arrays in COM interfaces. This UDF streamlines their use in AutoIt, eliminating the complexity of direct DLL calls. It’s perfect for working with COM applications like Excel or databases via ADO that rely on SafeArrays.

Simple Example

 

#include "SafeArray.au3"

Func Example_VT_FILETIME()
    Local $tVar = DllStructCreate($tagVARIANT)
    Local $tSystemTime = _Date_Time_GetSystemTime()
    Local $tFileTime = _Date_Time_SystemTimeToFileTime($tSystemTime)

    ; Set the FILETIME into the VARIANT
    _VariantSet(DllStructGetPtr($tVar), $tFileTime, $VT_FILETIME)

    ; Read the FILETIME from the VARIANT
    Local $sDateTime = _VariantRead(DllStructGetPtr($tVar))

    ConsoleWrite("VT_FILETIME: " & $sDateTime & @CRLF) ; Should display current date/time

    ; Clean up
    _VariantClear(DllStructGetPtr($tVar))
EndFunc   ;==>Example_VT_FILETIME


; Run the example
Example_VT_FILETIME()

 

#include "SafeArray.au3"

Func Example_VariantTypes1()
    Local $tVar = DllStructCreate($tagVARIANT)

    ; Test VT_DATE
    _VariantSet(DllStructGetPtr($tVar), "2025/08/03 12:34:56", $VT_DATE)
    ConsoleWrite("VT_DATE: " & _VariantRead(DllStructGetPtr($tVar)) & @CRLF) ; Devrait afficher 2025/08/03 12:34:56

    ; Test VT_IDISPATCH
    Local $oObj = ObjCreate("Scripting.Dictionary")
    _VariantSet(DllStructGetPtr($tVar), $oObj, $VT_DISPATCH)

    Local $oRead = _VariantRead(DllStructGetPtr($tVar))
    ConsoleWrite("VT_IDISPATCH IsObj: " & IsObj($oRead) & @CRLF)
    _VariantClear(DllStructGetPtr($tVar))
EndFunc   ;==>Example_VariantTypes1

Example_VariantTypes1()

 

#include "SafeArray.au3"
#include<WinAPICom.au3>

Func _VariantTypes()
    Local $tVar = DllStructCreate($tagVARIANT)
    ; Test VT_DATE
    _VariantSet(DllStructGetPtr($tVar), "2025/08/03 12:34:56", $VT_DATE)
    ConsoleWrite("VT_DATE: " & _VariantRead(DllStructGetPtr($tVar)) & @CRLF) ; Devrait afficher 2025/08/03 12:34:56

    ;VT_CLSID
    Local $oGUID = _WinAPI_CreateGUID()
    _VariantSet(DllStructGetPtr($tVar), $oGUID, $VT_CLSID)
    Local $oGUIDRead = _VariantRead(DllStructGetPtr($tVar))
    ConsoleWrite("VT_CLSID : " & $oGUIDRead & @CRLF)

    _VariantClear(DllStructGetPtr($tVar))
EndFunc   ;==>Example_VariantTypes

_VariantTypes()

 

SafeArray.zip

SafeArray.au3

Edited by Numeric1

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...