jugador Posted Sunday at 07:51 PM Posted Sunday at 07:51 PM 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 KaFu 1
jugador Posted yesterday at 09:53 AM Author Posted yesterday at 09:53 AM 1) Convert DllStruct of int to Array expandcollapse popup#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 expandcollapse popup#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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now