;*** generic functions

	.386
	.model flat,stdcall
	option casemap:none
	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

	.code

;--------------------------------------------------------------------------

;*** scan interface tab and see if requested iface is in there

IsInterfaceSupported proc public uses ebx esi edi pReqIF:ptr IID, pIFTab:ptr ptr IID, dwEntries:dword, pThis:ptr, ppReturn:ptr LPUNKNOWN
	
	mov ecx,dwEntries
	mov esi,pIFTab
	mov ebx,0
	.while (ecx)
		lodsd
		mov edi,eax
		lodsd
		mov edx,eax
		mov eax,esi
		mov esi,pReqIF
		push ecx
		mov ecx,4
		repz cmpsd
		pop ecx
		.if (ZERO?)
			mov ebx,edx
			add ebx,pThis
			.break
		.endif
		mov esi,eax
		dec ecx
	.endw
	mov ecx,ppReturn
	mov [ecx],ebx

	.if (ebx)
		invoke vf(ebx,IUnknown,AddRef)
		mov eax,S_OK
	.else
		mov eax,E_NOINTERFACE
	.endif
	ret
	align 4

IsInterfaceSupported endp

;--------------------------------------------------------------------------

ComPtrAssign proc public uses ebx pp:ptr LPUNKNOWN, lp:LPUNKNOWN
	.if (lp != NULL)
		invoke vf(lp,IUnknown,AddRef)
	.endif
	mov ebx,pp
	.if (dword ptr [ebx])
		invoke vf([ebx],IUnknown,Release)
	.endif
	mov eax,lp
	mov [ebx],eax
	ret
	align 4

ComPtrAssign endp

	end