source: Include/com/vbobject.ab@ 175

Last change on this file since 175 was 175, checked in by イグトランス (egtra), 17 years ago

Variant, VBObjectの追加

File size: 6.5 KB
Line 
1' com/vbobject.ab
2
3#ifndef _COM_VBIBJECT_AB
4#define _COM_VBIBJECT_AB
5
6#include <com/variant.ab>
7
8Class VBObject
9Public
10 Sub VBObject()
11 pdisp = 0
12 End Sub
13
14 Sub VBObject(className As String)
15 VBObject(ToWCStr(className))
16 End Sub
17
18 Sub VBObject(className As PCWSTR)
19 pdisp = 0
20 Dim clsid As CLSID
21 Dim hr = _System_CLSIDFromString(className, clsid)
22 Dim hr2 = CoCreateInstance(clsid, 0, CLSCTX_ALL, IID_IDispatch, pdisp)
23 End Sub
24
25 Sub VBObject(ByRef obj As VBObject)
26 pdisp = obj.pdisp
27 pdisp->AddRef()
28 End Sub
29
30 Sub Operator =(ByRef obj As VBObject)
31 ~VBObject()
32 VBObject(obj)
33 End Sub
34
35 Sub ~VBObject()
36 Clear()
37 End Sub
38
39 Sub Clear()
40 If pdisp <> 0 Then
41 pdisp->Release()
42 pdisp = 0
43 End If
44 End Sub
45
46 Function Operator [](name As PCWSTR) As DispatchCaller
47 Return GetCaller(name)
48 End Function
49
50 Function Operator [](name As String) As DispatchCaller
51 Return GetCaller(ToWCStr(name))
52 End Function
53
54 Function Equals(y As VBObject) As Boolean
55 Dim punkX = GetUnknown()
56 Dim punkY = y.GetUnknown()
57 Equals = (punkX == punkY)
58 punkX->Release()
59 punkY->Release()
60 End Function
61/*
62 Override Function GetHashCode() As Long
63 Dim punk = GetUnknown()
64 GetHashCode = _System_HashFromPtr(punk)
65 punk->Release()
66 End Function
67*/
68 Function Operator ==(y As VBObject) As Boolean
69 Return Equals(y)
70 End Function
71
72 Function Operator <>(y As VBObject) As Boolean
73 Return Not Equals(y)
74 End Function
75
76 Sub Assign(p As *IDispatch)
77 Clear()
78 VBObject.Copy(pdisp, p)
79 End Sub
80
81 Function GetDispatch() As *IDispatch
82 VBObject.Copy(GetDispatch, pdisp)
83 End Function
84
85 Sub Attach(ByRef p As *IDispatch)
86 Clear()
87 VBObject.Move(pdisp, p)
88 End Sub
89
90 Sub Detach() As *IDispatch
91 VBObject.Move(Detach, pdisp)
92 End Sub
93Private
94 Function GetCaller(name As PCWSTR) As DispatchCaller
95 Dim dispid As DISPID
96 Dim hr = pdisp->GetIDsOfNames(GUID_NULL, VarPtr(name), 1, LOCALE_USER_DEFAULT, VarPtr(dispid))
97 Return New DispatchCaller(pdisp, dispid)
98 End Function
99
100 Function GetUnknown() As *IUnknown
101 If FAILDED(pdisp->QueryInterface(IID_Unknown, GetUnknown)) Then
102 GetUnknown = 0
103 End If
104 End Function
105
106 pdisp As *IDispatch
107
108 Static Sub Copy(ByRef dst As *IDispatch, ByVal src As *IDispatch)
109 dst = src
110 dst->AddRef()
111 End Sub
112
113 Static Sub Move(ByRef dst As *IDispatch, ByRef src As *IDispatch)
114 dst = src
115 src = 0
116 End Sub
117End Class
118
119Class DispatchCaller
120Public
121 Sub DispatchCaller()
122 End Sub
123 Sub DispatchCaller(pDispatch As *IDispatch, dispatchId As DISPID)
124 pdisp = pDispatch
125 pdisp->AddRef()
126 dispid = dispatchId
127 End Sub
128
129 Sub DispatchCaller(ByRef dc As DispatchCaller)
130 pdisp = dc.pdisp
131 pdisp->AddRef()
132 dispid = dc.dispid
133 End Sub
134
135 Sub Operator =(ByRef dc As DispatchCaller)
136 Dispose()
137 DispatchCaller(dc)
138 End Sub
139
140 Sub Dispose()
141 If pdisp <> 0 Then
142 pdisp->Release()
143 pdisp = 0
144 End If
145 End Sub
146
147 Sub ~DispatchCaller()
148 Dispose()
149 End Sub
150
151 Function Prop() As Variant
152 Dim dispParams As DISPPARAMS
153 With dispParams
154 .rgvarg = 0
155 .rgdispidNamedArgs = 0
156 .cArgs = 0
157 .cNamedArgs = 0
158 End With
159 Dim ret As VARIANT
160 Dim hr = pdisp->Invoke(dispid, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, dispParams, ret, 0, 0)
161 Dispose()
162 Dim v = New Variant
163 v.Attach(ret)
164 Return v
165 End Function
166
167 Sub Prop(ByRef arg As Variant)
168 Prop(ByVal arg.PtrToVariant)
169 End Sub
170
171 Sub Prop(ByRef arg As VARIANT)
172 Dim dispParams As DISPPARAMS
173 With dispParams
174 .rgvarg = 1
175 .rgdispidNamedArgs = 0
176 .cArgs = VarPtr(arg)
177 .cNamedArgs = 0
178 End With
179 Dim ret As VARIANT
180 Dim hr = pdisp->Invoke(dispid, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, dispParams, ret, ByVal 0, 0)
181 Dispose()
182 End Sub
183
184 Sub PropRef(ByRef arg As Variant)
185 PropRef(arg.PtrToVariant)
186 End Sub
187
188 Sub PropRef(ByRef arg As VARIANT)
189 Dim dispParams As DISPPARAMS
190 With dispParams
191 .rgvarg = 1
192 .rgdispidNamedArgs = 0
193 .cArgs = VarPtr(arg)
194 .cNamedArgs = 0
195 End With
196 Dim ret As VARIANT
197 Dim hr = pdisp->Invoke(dispid, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF, dispParams, ret, ByVal 0, 0)
198 Dispose()
199 End Sub
200
201 Function Call(cArgs As Long, args As *VARIANT) As Variant
202 Dim dispParams As DISPPARAMS
203 With dispParams
204 .rgvarg = args
205 .rgdispidNamedArgs = 0
206 .cArgs = cArgs
207 .cNamedArgs = 0
208 End With
209 Dim ret As VARIANT
210 Dim hr = pdisp->Invoke(dispid, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, dispParams, ret, ByVal 0, 0)
211 Dispose()
212 Dim v = New Variant
213 v.Attach(ret)
214 Return v
215 End Function
216
217' Function Call(cArgs As Long, args As *Variant) As Variant
218' End Function
219
220 Function Call() As Variant
221 Return Call(0, 0)
222 End Function
223
224 Function Call(arg1 As Variant) As Variant
225 Return Call(1, arg1.PtrToVariant)
226 End Function
227
228 Function Call(ByRef arg1 As Variant, ByRef arg2 As Variant) As Variant
229 Dim arg[1] As VARIANT
230
231 Return Call(2, VarPtr(arg1) As *VARIANT)
232 End Function
233
234Private
235 pdisp As *IDispatch
236 dispid As DISPID
237End Class
238/*
239Function CreateObject(className As PCWSTR) As VBObject
240 Return New VBObject(className)
241End Function
242
243Function CreateObject(className As String) As VBObject
244 Return New VBObject(ToWCStr(className))
245End Function
246
247#ifdef _WIN32_DCOM
248Function CreateObject(className As PCWSTR, serverName As PCWSTR) As VBObject
249 Dim clsid As CLSID
250 Dim si As COSERVERINFO
251 Dim context As DWord
252 If /*Server = 0 OrElse* / Server[0] = 0 Then
253 context = CLSCTX_SERVER
254 Else
255 context = CLSCTX_REMOTE_SERVER
256 si.pwszName = serverName
257 End If
258
259 Dim hr = _System_CLSIDFromString(className, clsid)
260
261 Dim mqi As MULTI_QI
262 mqi.pIID = VarPtr(IID_IUnknown)
263 hr = CoCreateInstanceEx(clsid, 0, context, si, 1, VarPtr(mqi))
264 If SUCCEEDED(hr) Then
265 Dim obj As VBObject
266 obj.Attach(mqi.pItf As IDispatch)
267 Return obj
268 Else
269 'Throw
270 Return Nothing
271 End If
272End Function
273
274Function CreateObject(className As String, serverName As String) As VBObject
275 Return CreateObject(ToWCStr(className), ToWCStr(serverName))
276End Function
277#endif
278*/
279Function _System_CLSIDFromString(pwString As PCWSTR, ByRef guid As GUID) As HRESULT
280 If pwString[0] = &h007b As WCHAR Then
281 ' 1文字目が { ならクラスIDの文字列表現と見なしCLSIDFromStringで変換。
282 _System_CLSIDFromString = CLSIDFromString(pwString, guid)
283 Else
284 _System_CLSIDFromString = CLSIDFromProgID(pwString, guid)
285 End If
286End Function
287
288#endif '_COM_VBIBJECT_AB
Note: See TracBrowser for help on using the repository browser.