// Copyright 2010-2012 The W32 Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package w32

import (
	"unsafe"
)

type pIDispatchVtbl struct {
	pQueryInterface   uintptr
	pAddRef           uintptr
	pRelease          uintptr
	pGetTypeInfoCount uintptr
	pGetTypeInfo      uintptr
	pGetIDsOfNames    uintptr
	pInvoke           uintptr
}

type IDispatch struct {
	lpVtbl *pIDispatchVtbl
}

func (this *IDispatch) QueryInterface(id *GUID) *IDispatch {
	return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
}

func (this *IDispatch) AddRef() int32 {
	return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
}

func (this *IDispatch) Release() int32 {
	return ComRelease((*IUnknown)(unsafe.Pointer(this)))
}

func (this *IDispatch) GetIDsOfName(names []string) []int32 {
	return ComGetIDsOfName(this, names)
}

func (this *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) *VARIANT {
	return ComInvoke(this, dispid, dispatch, params...)
}
