55 lines
955 B
PHP
55 lines
955 B
PHP
|
|
||
|
macro cominvk Object,proc,args&
|
||
|
iterate arg, args
|
||
|
indx 1+%%-%
|
||
|
pushd arg
|
||
|
end iterate
|
||
|
if ~ defined Object#.com.object
|
||
|
err `Object,' is not a COM object'
|
||
|
end if
|
||
|
mov eax,[Object]
|
||
|
push eax
|
||
|
mov eax,[eax]
|
||
|
call [eax+Object.proc]
|
||
|
end macro
|
||
|
|
||
|
macro comcall handle,Interface,proc,args&
|
||
|
iterate arg, args
|
||
|
indx 1+%%-%
|
||
|
pushd arg
|
||
|
end iterate
|
||
|
if ~ defined Interface#.com.interface
|
||
|
err `Interface,' is not a COM interface'
|
||
|
end if
|
||
|
match prefix [addr], :handle
|
||
|
mov eax,handle
|
||
|
push eax
|
||
|
mov eax,[eax]
|
||
|
else
|
||
|
push handle
|
||
|
local _handle
|
||
|
_handle := handle
|
||
|
mov eax,[_handle]
|
||
|
end match
|
||
|
call [eax+Interface.proc]
|
||
|
end macro
|
||
|
|
||
|
macro interface name,methods&
|
||
|
struc name
|
||
|
. dd ?
|
||
|
virtual at 0
|
||
|
iterate method, methods
|
||
|
.method dd ?
|
||
|
end iterate
|
||
|
end virtual
|
||
|
.com.object = name.com.interface
|
||
|
end struc
|
||
|
virtual at 0
|
||
|
iterate method, methods
|
||
|
name.method dd ?
|
||
|
end iterate
|
||
|
define name
|
||
|
name.com.interface = $ shr 2
|
||
|
end virtual
|
||
|
end macro
|