Skip to content

Commit ccb21a4

Browse files
authored
v0.1.2
Add: basic support for methods via "__defineMethod"
1 parent a8fecd4 commit ccb21a4

1 file changed

Lines changed: 54 additions & 2 deletions

File tree

AutoItObject_Internal.au3

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#cs ----------------------------------------------------------------------------
22
AutoIt Version : 3.3.14.2
33
Author.........: genius257
4-
Version........: 0.1.1
4+
Version........: 0.1.2
55
#ce ----------------------------------------------------------------------------
66

77
#include-once
@@ -16,9 +16,22 @@ Global Const $DISPATCH_PROPERTYGET = 2
1616
Global Const $DISPATCH_PROPERTYPUT = 4
1717
Global Const $DISPATCH_PROPERTYPUTREF = 8
1818

19+
Global Const $DISP_E_UNKNOWNINTERFACE = 0x80020001
1920
Global Const $DISP_E_MEMBERNOTFOUND = 0x80020003
21+
Global Const $DISP_E_PARAMNOTFOUND = 0x80020004
22+
Global Const $DISP_E_TYPEMISMATCH = 0x80020005
2023
Global Const $DISP_E_UNKNOWNNAME = 0x80020006
24+
Global Const $DISP_E_NONAMEDARGS = 0x80020007
2125
Global Const $DISP_E_BADVARTYPE = 0x80020008
26+
Global Const $DISP_E_EXCEPTION = 0x80020009
27+
Global Const $DISP_E_OVERFLOW = 0x8002000A
28+
Global Const $DISP_E_BADINDEX = 0x8002000B
29+
Global Const $DISP_E_UNKNOWNLCID = 0x8002000C
30+
Global Const $DISP_E_ARRAYISLOCKED = 0x8002000D
31+
Global Const $DISP_E_BADPARAMCOUNT = 0x8002000E
32+
Global Const $DISP_E_PARAMNOTOPTIONAL = 0x8002000F
33+
Global Const $DISP_E_BADCALLEE = 0x80020010
34+
Global Const $DISP_E_NOTACOLLECTION = 0x80020011
2235

2336
Global Const $tagVARIANT = "ushort vt;ushort r1;ushort r2;ushort r3;uint64 data"
2437
Global Const $tagDISPPARAMS = "ptr rgvargs;ptr rgdispidNamedArgs;dword cArgs;dword cNamedArgs;"
@@ -188,6 +201,9 @@ Func GetIDsOfNames($pSelf, $riid, $rgszNames, $cNames, $lcid, $rgDispId)
188201
ElseIf DllStructGetData($t_rgszNames, 1)=="__defineSetter" Then
189202
DllStructSetData($tIds, 1, -3)
190203
Return $S_OK
204+
ElseIf DllStructGetData($t_rgszNames, 1)=="__defineMethod" Then
205+
DllStructSetData($tIds, 1, -4)
206+
Return $S_OK
191207
EndIf
192208

193209
Local $iID = -1
@@ -260,11 +276,12 @@ Func Invoke($pSelf, $dispIdMember, $riid, $lcid, $wFlags, $pDispParams, $pVarRes
260276
If $dispIdMember=-1 Then Return $DISP_E_MEMBERNOTFOUND
261277
Local $tVARIANT, $_tVARIANT, $tDISPPARAMS
262278
Local $t
279+
Local $i
263280

264281
Local $pProperty = DllStructGetData(DllStructCreate("ptr", $pSelf + DllStructGetSize(DllStructCreate("ptr Object;ptr Methods[7];int_ptr Callbacks[7]"))),1)
265282
Local $tProperty = DllStructCreate($tagProperty, $pProperty)
266283

267-
If ($dispIdMember=-2) Or ($dispIdMember=-3) Then
284+
If ($dispIdMember=-2) Or ($dispIdMember=-3) Or ($dispIdMember=-4) Then
268285
$tDISPPARAMS = DllStructCreate($tagDISPPARAMS, $pDispParams)
269286
$t = DllStructCreate("ptr id_ptr;long id;ptr str_ptr_ptr;ptr str_ptr")
270287
DllStructSetData($t, "id_ptr", DllStructGetPtr($t, 2))
@@ -282,6 +299,12 @@ Func Invoke($pSelf, $dispIdMember, $riid, $lcid, $wFlags, $pDispParams, $pVarRes
282299
$pProperty = $tProperty.Next
283300
$tProperty = DllStructCreate($tagProperty, $pProperty)
284301
Next
302+
If ($dispIdMember=-4) Then
303+
$_tVARIANT = DllStructCreate($tagVARIANT, $tProperty.Variant)
304+
$_tVARIANT.vt = $VT_RECORD
305+
$_tVARIANT.data = _WinAPI_CreateString(DllStructGetData(DllStructCreate("WCHAR["&_WinAPI_StrLen($tVARIANT.data, True)&"]", $tVARIANT.data), 1))
306+
Return $S_OK
307+
EndIf
285308
If Not($tVARIANT.vt = $VT_I4) Then Return $DISP_E_BADVARTYPE;$VT_I4 should be the type returned from DllCallbackRegister
286309
If ($dispIdMember=-2) Then $tProperty.__getter = $tVARIANT.data
287310
If ($dispIdMember=-3) Then $tProperty.__setter = $tVARIANT.data
@@ -322,6 +345,35 @@ Func Invoke($pSelf, $dispIdMember, $riid, $lcid, $wFlags, $pDispParams, $pVarRes
322345
$_tVARIANT.vt = $__tVARIANT.vt
323346
$_tVARIANT.data = $__tVARIANT.data
324347
EndIf
348+
Return $S_OK
349+
ElseIf $tVARIANT.vt = $VT_RECORD Then
350+
$_tVARIANT.vt = $VT_BSTR
351+
$_tVARIANT.data = $tVARIANT.data
352+
353+
Local $oIDispatch = __IDispatch()
354+
$oIDispatch.a = 0
355+
Local $tDISPPARAMS = DllStructCreate($tagDISPPARAMS, $pDispParams)
356+
Local $aArgs[$tDISPPARAMS.cArgs+1]
357+
Local $iSize = DllStructGetSize(DllStructCreate($tagVARIANT))
358+
359+
Local $tPtr = DllStructCreate("ptr ptr")
360+
$tPtr.ptr = $oIDispatch
361+
Local $__tIDispatch = DllStructCreate("ptr Object;ptr Methods[7];int_ptr Callbacks[7];ptr Properties", $tPtr.ptr)
362+
Local $__tProperty = DllStructCreate($tagProperty, $__tIDispatch.Properties)
363+
Local $__tVARIANT = DllStructCreate($tagVARIANT, $__tProperty.VARIANT)
364+
365+
$aArgs[0]="CallArgArray"
366+
For $i=$tDISPPARAMS.cArgs To 1 Step -1
367+
$tVARIANT = DllStructCreate($tagVARIANT, $tDISPPARAMS.rgvargs+$iSize*($i-1))
368+
$__tVARIANT.vt = $tVARIANT.vt
369+
$__tVARIANT.data = $tVARIANT.data
370+
$aArgs[$tDISPPARAMS.cArgs-$i+1] = $oIDispatch.a
371+
Next
372+
$oIDispatch.a = Call(DllStructGetData(DllStructCreate("WCHAR["&_WinAPI_StrLen($_tVARIANT.data, True)&"]", $_tVARIANT.data), 1), $aArgs)
373+
374+
$_tVARIANT.vt = $__tVARIANT.vt
375+
$_tVARIANT.data = $__tVARIANT.data
376+
325377
Return $S_OK
326378
EndIf
327379

0 commit comments

Comments
 (0)