75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
//go:build windows
|
|
|
|
package combridge
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
// IUnknownFromPointer cast a generic pointer into a IUnknownImpl pointer
|
|
func IUnknownFromPointer(ref unsafe.Pointer) *IUnknownImpl {
|
|
return (*IUnknownImpl)(ref)
|
|
}
|
|
|
|
// IUnknownFromPointer cast native pointer into a IUnknownImpl pointer
|
|
func IUnknownFromUintptr(ref uintptr) *IUnknownImpl {
|
|
return IUnknownFromPointer(unsafe.Pointer(ref))
|
|
}
|
|
|
|
type IUnknownVtbl struct {
|
|
queryInterface uintptr
|
|
addRef uintptr
|
|
release uintptr
|
|
}
|
|
|
|
func (i *IUnknownVtbl) QueryInterface(this unsafe.Pointer, refiid *windows.GUID, ppvObject **IUnknownImpl) error {
|
|
r, _, _ := syscall.SyscallN(
|
|
i.queryInterface,
|
|
uintptr(this),
|
|
uintptr(unsafe.Pointer(refiid)),
|
|
uintptr(unsafe.Pointer(ppvObject)),
|
|
)
|
|
|
|
if r != uintptr(windows.S_OK) {
|
|
return syscall.Errno(r)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (i *IUnknownVtbl) AddRef(this unsafe.Pointer) uint32 {
|
|
r, _, _ := syscall.SyscallN(
|
|
i.addRef,
|
|
uintptr(this),
|
|
)
|
|
return uint32(r)
|
|
}
|
|
|
|
func (i *IUnknownVtbl) Release(this unsafe.Pointer) uint32 {
|
|
r, _, _ := syscall.SyscallN(
|
|
i.release,
|
|
uintptr(this),
|
|
)
|
|
|
|
return uint32(r)
|
|
}
|
|
|
|
type IUnknownImpl struct {
|
|
vtbl *IUnknownVtbl
|
|
}
|
|
|
|
func (i *IUnknownImpl) QueryInterface(refiid *windows.GUID, ppvObject **IUnknownImpl) error {
|
|
return i.vtbl.QueryInterface(unsafe.Pointer(i), refiid, ppvObject)
|
|
}
|
|
|
|
func (i *IUnknownImpl) AddRef() uint32 {
|
|
return i.vtbl.AddRef(unsafe.Pointer(i))
|
|
}
|
|
|
|
func (i *IUnknownImpl) Release() uint32 {
|
|
return i.vtbl.Release(unsafe.Pointer(i))
|
|
}
|