Now you can call Interface methods:
.invoke ppvInterface.index ,.......
ppvInterface:variable = interface pointer
index : is const number 0=first function,1=second function, ...
or .invoke ppvInterface.IvTable.Method ,.......
or .invoke ppvInterface. ,....... ; to call the first method
Word Application Example:
STIUnknown STRUCT
Queryinterface DQ 0 ; index=0
AddRef DQ 0 ; index=1
Release DQ 0 ; index=2
STIUnknown ends
.data
IID_IUnknown GUID <000000000h,00000h,00000h,<0C0h,000h,000h,000h,000h,000h,000h,046h>>
CLSID_Word_Application GUID <0000209FFh,00000h,00000h,<0C0h,000h,000h,000h,000h,000h,000h,046h>>
IID_Word__Application GUID <000020970h,00000h,00000h,<0C0h,000h,000h,000h,000h,000h,000h,046h>>
.code
.invoke CoInitializeEx,0,0
.invoke CoCreateInstance,&CLSID_Word_Application,0,CLSCTX_LOCAL_SERVER,&IID_IUnknown,&_ppv_IUnknown
.if rax == S_OK
.invoke MessageBoxW,0,"CoCreateInstance Word Application ok",0,0
.invoke _ppv_IUnknown.STIUnknown.Queryinterface,&IID_Word__Application,&WordApplication
; Also you can use:
;.invoke _ppv_IUnknown.,&IID_Word__Application,&WordApplication
.if rax == S_OK
.invoke MessageBoxW,0,"IUnknown.Queryinterface ok",0,0
;------------------------------------ WordApplication.Visible = TRUE
.invoke WordApplication.34,TRUE
;------------------------------- pause
.invoke MessageBoxW,0,"push OK to quit Winword ",0,0
.data
NulloptionalArg dw VT_ERROR,0,0,0 ;Null Optional Arg
dq DISP_E_PARAMNOTFOUND,0
.code
; WordApplication.Quit ([in,optional] SaveChanges:Ptr Variant,[in,optional] OriginalFormat:Ptr Variant,...)
.invoke WordApplication.120,&NulloptionalArg,&NulloptionalArg,&NulloptionalArg
;WordApplication.Release
.invoke WordApplication.2
.endif
.endif