Jump to content

Recommended Posts

Posted

As @Jon decided not to provide Array pointer, here's a small UDF to convert an array to a SafeArray and vice versa.
You can get the SafeArray.au3 from https://www.autoitscript.com/forum/topic/200660-variants-and-safearrays/

 

#include <Array.au3>
#include "SafeArray.au3"
#include "ArrayPointer UDF.au3"

__Example_0A()
Func __Example_0A()
    Local $Ary_0 = [[123456, 12.34, 'how are you?', -0.1234], [-100.001, 0.00009, "", 'Is it working?']]
    _ArrayDisplay( $Ary_0 )

    Local $t_SAobj
    Local $o_SAobj = __SafeArray_Dummy_Obj($t_SAobj)

    ;~~ Convert Array to SafeArray Pointer
    ;~~ Now you can pass the SafeArray pointer($psa) to any language, such as C, Python..........
    Local $psa
    $o_SAobj.Array_to_SafeArray($Ary_0, $psa)
    SafeArrayUnaccessData( $psa )

    ;~~ convert SafeArray Pointer to Array
    Local $p_Array_Copy
    $o_SAobj.SafeArray_to_Array($psa, $p_Array_Copy)
    SafeArrayDestroy($psa)      ;~~ delete the safeArray pointer when done.
    _ArrayDisplay( $p_Array_Copy )

    $o_SAobj = 0
    __Delete_SafeArray_ObjectFromTag( $t_SAobj )
EndFunc

 

ArrayPointer UDF.au3

Posted

1) Convert DllStruct of int to Array

#include <Array.au3>
#include "SafeArray.au3"
#include "Variant.au3"
#include "ArrayPointer UDF.au3"

__Example_1A()
Func __Example_1A()
    Local $n = 10
    Local $t_DllStruct = DllStructCreate( "int[" & $n & "]" )
    Local $p_DllStruct = DllStructGetPtr( $t_DllStruct )
    Local $nSize = DllStructGetSize($t_DllStruct)
    ConsoleWrite("+ " & $nSize & @CRLF)

    For $i = 1 To $n
        DllStructSetData($t_DllStruct, 1, $i, $i)
    Next

    Local $tsaBound = DllStructCreate( $tagSAFEARRAYBOUND )
    DllStructSetData( $tsaBound, "cElements", $n )
    DllStructSetData( $tsaBound, "lLbound", 0 )
    Local $psa = SafeArrayCreate( $VT_I4, 1, $tsaBound )

    Local $psaData
    SafeArrayAccessData( $psa, $psaData )

    Local $tSafeArrayBytes = DllStructCreate( "byte[" & $nSize & "]", $psaData )
    DllStructSetData( $tSafeArrayBytes, 1, DllStructGetData( DllStructCreate( "byte[" & $nSize & "]", $p_DllStruct ), 1 ) )
    SafeArrayUnaccessData( $psa )

    Local $t_SF_Obj
    Local $o_SF_Obj = __SafeArray_Dummy_Obj($t_SF_Obj)
    If Not IsObj($o_SF_Obj) Then Return

    Local $p_Array
    $o_SF_Obj.SafeArray_to_Array($psa, $p_Array)

    SafeArrayDestroy($psa)
    _ArrayDisplay( $p_Array )

    $o_SF_Obj = 0
    __Delete_SafeArray_ObjectFromTag( $t_SF_Obj )
EndFunc

 

2) Convert DllStruct of char to Array

#include <Array.au3>
#include "SafeArray.au3"
#include "Variant.au3"
#include "ArrayPointer UDF.au3"

__Example_1B()
Func __Example_1B()
    Local $t_DllStruct = DllStructCreate("wchar var1[20];char var2[20];char var3[20]")
    DllStructSetData($t_DllStruct, "var1", "How are you?")
    DllStructSetData($t_DllStruct, "var2", "Is it working?")
    DllStructSetData($t_DllStruct, "var3", "Hope, so....")
    Local $p_DllStruct = DllStructGetPtr($t_DllStruct)
    Local $nSize = DllStructGetSize($t_DllStruct)

    Local $nFields = 3
    Local $tsaBound = DllStructCreate($tagSAFEARRAYBOUND)
    DllStructSetData($tsaBound, "cElements", $nFields)
    DllStructSetData($tsaBound, "lLbound", 0)
    Local $psa = SafeArrayCreate($VT_BSTR, 1, $tsaBound)

    Local $psaData
    SafeArrayAccessData($psa, $psaData)

    Local $bstr
    Local $tSafeArrayStrings = DllStructCreate("ptr[" & $nFields & "]", $psaData)
    For $i = 1 To $nFields
        $bstr = SysAllocString(DllStructGetData($t_DllStruct, $i))
        DllStructSetData($tSafeArrayStrings, 1, $bstr, $i)
        $bstr = 0
    Next
    SafeArrayUnaccessData($psa)

    Local $t_SF_Obj
    Local $o_SF_Obj = __SafeArray_Dummy_Obj($t_SF_Obj)
    If Not IsObj($o_SF_Obj) Then Return

    Local $p_Array
    $o_SF_Obj.SafeArray_to_Array($psa, $p_Array)

    SafeArrayDestroy($psa)
    _ArrayDisplay($p_Array)

    $o_SF_Obj = 0
    __Delete_SafeArray_ObjectFromTag($t_SF_Obj)
EndFunc

 

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