返回 DeepSeek-Reasonix
iunknown.go
1 //go:build windows
2
3 package combridge
4
5 import (
6 "golang.org/x/sys/windows"
7 )
8
9 const iUnknownGUID = "{00000000-0000-0000-C000-000000000046}"
10
11 func init() {
12 registerVTableInternal[IUnknown, IUnknown](
13 iUnknownGUID,
14 true,
15 iUnknownQueryInterface,
16 iUnknownAddRef,
17 iUnknownRelease,
18 )
19 }
20
21 type IUnknown interface{}
22
23 func iUnknownQueryInterface(this uintptr, refiid *windows.GUID, ppvObject *uintptr) uintptr {
24 if refiid == nil || ppvObject == nil {
25 return uintptr(windows.E_INVALIDARG)
26 }
27
28 comIfcePointersL.RLock()
29 obj := comIfcePointers[this]
30 comIfcePointersL.RUnlock()
31
32 ref := obj.queryInterface(refiid.String(), true)
33 if ref != 0 {
34 *ppvObject = ref
35 return windows.NO_ERROR
36 }
37
38 *ppvObject = 0
39 return uintptr(windows.E_NOINTERFACE)
40 }
41
42 func iUnknownAddRef(this uintptr) uintptr {
43 comIfcePointersL.RLock()
44 obj := comIfcePointers[this]
45 comIfcePointersL.RUnlock()
46
47 return uintptr(obj.addRef())
48 }
49
50 func iUnknownRelease(this uintptr) uintptr {
51 comIfcePointersL.RLock()
52 obj := comIfcePointers[this]
53 comIfcePointersL.RUnlock()
54
55 return uintptr(obj.release())
56 }
57
57 lines GO