;*** methods IUnknown interface

	.386
	.model flat, stdcall
	option casemap:none ; case sensitive
	option proc:private

	.nolist
	.nocref
	include windows.inc
	include unknwn.inc
	include objidl.inc
	include oleidl.inc
	include olectl.inc
	include oaidl.inc
	include ocidl.inc
	include CatProp.inc

	include macros.inc
	include debugout.inc
	.list
	.cref

	include control.inc

;*** this is the general interface table. All interfaces being
;*** returned by QueryInterface should be listed here.

	.const

if ?AGGREGABLE

CUnknownVtbl label IUnknownVtbl 
	IUnknownVtbl {NDQueryInterface_, NDAddRef_, NDRelease_}

endif

supInterfaces label dword
if ?AGGREGABLE
	dd offset IID_IUnknown,			offset CAsmCtrl.m_IUnknown
else
	dd offset IID_IUnknown,			0
endif
	dd offset IID_IOleObject,			offset CAsmCtrl.m_IOleObject
	dd offset IID_IOleWindow,			offset CAsmCtrl.m_IOleInPlaceObject
	dd offset IID_IOleInPlaceObject,	offset CAsmCtrl.m_IOleInPlaceObject
;--- entry for IOleInPlaceActiveObject is somewhat "questionable" here
	dd offset IID_IOleInPlaceActiveObject,offset CAsmCtrl.m_IOleInPlaceActiveObject
	dd offset IID_IOleControl,			offset CAsmCtrl.m_IOleControl
	dd offset IID_IDispatch,			offset CAsmCtrl.m_IAsmCtrl
	dd offset IID_IAsmCtrl,				offset CAsmCtrl.m_IAsmCtrl
	dd offset IID_IProvideClassInfo,	offset CAsmCtrl.m_IProvideClassInfo
	dd offset IID_IPersist,				offset CAsmCtrl.m_IPersistStorage
	dd offset IID_IPersistStorage,		offset CAsmCtrl.m_IPersistStorage
	dd offset IID_IPersistStreamInit,	offset CAsmCtrl.m_IPersistStreamInit
	dd offset IID_IViewObject,			offset CAsmCtrl.m_IViewObject2
	dd offset IID_IViewObject2,			offset CAsmCtrl.m_IViewObject2
	dd offset IID_IConnectionPointContainer,offset CAsmCtrl.m_IConnectionPointContainer
if ?DATAOBJ
	dd offset IID_IDataObject,			offset CAsmCtrl.m_IDataObject
endif
if ?PROPBAG
	dd offset IID_IPersistPropertyBag,	offset CAsmCtrl.m_IPersistPropertyBag
endif
if ?SPECPROP
	dd offset IID_ISpecifyPropertyPages,offset CAsmCtrl.m_ISpecifyPropertyPages
endif
if ?CATPROP
	dd offset IID_ICategorizeProperties,offset CAsmCtrl.m_ICategorizeProperties
endif
if ?RUNNABLEOBJECT
	dd offset IID_IRunnableObject,		offset CAsmCtrl.m_IRunnableObject
endif

IFTABSIZE equ ($ - supInterfaces)/ (2 * sizeof dword)

	.code

if ?AGGREGABLE

QueryInterface proc public this_:ptr CAsmCtrl,riid:ptr IID,ppReturn:ptr
	mov eax,this_
	invoke vf([eax].CAsmCtrl.m_pUnkOuter, IUnknown, QueryInterface), riid, ppReturn
	ret
QueryInterface endp

AddRef proc public this_:ptr CAsmCtrl
	mov eax,this_
	invoke vf([eax].CAsmCtrl.m_pUnkOuter, IUnknown, AddRef)
	ret
AddRef endp

Release proc public this_:ptr CAsmCtrl
	mov eax,this_
	invoke vf([eax].CAsmCtrl.m_pUnkOuter, IUnknown, Release)
	ret
Release endp

CastOffset textequ <offset CAsmCtrl.m_IUnknown>

NDQueryInterface_::
	sub dword ptr [esp+4],CastOffset
	jmp NDQueryInterface
NDAddRef_::
	sub dword ptr [esp+4],CastOffset
	jmp NDAddRef
NDRelease_::
	sub dword ptr [esp+4],CastOffset
	jmp NDRelease

?QueryInterface	textequ <NDQueryInterface>
?AddRef			textequ <NDAddRef>
?Release		textequ <NDRelease>

else

?QueryInterface	textequ <QueryInterface>
?AddRef			textequ <AddRef>
?Release		textequ <Release>

endif

;*** IUnknown::QueryInterface - the real, undelegated QueryInterface

?QueryInterface proc public this_:ptr CAsmCtrl,riid:ptr IID,ppReturn:ptr

ifdef _DEBUG
local	wszIID[40]:word
endif

	invoke IsInterfaceSupported, riid, offset supInterfaces, IFTABSIZE,  this_, ppReturn
ifdef _DEBUG
	push eax
	invoke StringFromGUID2,riid, addr wszIID,40
	pop eax
	DebugOut "IUnknown::QueryInterface(%S)=%X", addr wszIID, eax
endif
	ret

?QueryInterface endp

;*** IUnknown::AddRef - the real, undelegated AddRef method

?AddRef proc public this_:ptr CAsmCtrl

	mov eax,this_
	inc [eax].CAsmCtrl.m_ObjRefCount
	mov eax, [eax].CAsmCtrl.m_ObjRefCount
	ret
?AddRef endp

;*** IUnknown::Release - the real, undelegated Release method

?Release proc public this_:ptr CAsmCtrl

	mov eax,this_
	dec [eax].CAsmCtrl.m_ObjRefCount
	mov eax,[eax].CAsmCtrl.m_ObjRefCount
	.if (eax == 0)
		invoke Destroy@CAsmCtrl,this_
		xor eax,eax
	.endif
	ret

?Release endp

	end