fzeet 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -99,7 +99,12 @@ module Fzeet
99
99
 
100
100
  if uMsg == Windows::WM_CREATE
101
101
  @@instances[hwnd.to_i].menu = Menu.new.
102
- append(:popup, '&Window', PopupMenu.new)
102
+ append(:popup, '&Windows', PopupMenu.new.
103
+ append(:string, 'Tile &Horizontal', :tileHorz).
104
+ append(:string, 'Tile &Vertical', :tileVert).
105
+ append(:string, '&Cascade', :cascade).
106
+ append(:string, 'Arrange &Icons', :arrangeIcons)
107
+ )
103
108
 
104
109
  ccs = Windows::CLIENTCREATESTRUCT.new
105
110
 
@@ -113,6 +118,18 @@ module Fzeet
113
118
  )
114
119
 
115
120
  @@instances[hwnd.to_i].instance_variable_set(:@client, Handle.wrap(hwndClient, WindowMethods))
121
+
122
+ @@instances[hwnd.to_i].
123
+ on(:command, :tileHorz) { Windows.TileWindows(hwndClient, Windows::MDITILE_HORIZONTAL, nil, 0, nil) }.
124
+ on(:command, :tileVert) { Windows.TileWindows(hwndClient, Windows::MDITILE_VERTICAL, nil, 0, nil) }.
125
+ on(:command, :cascade) { Windows.CascadeWindows(hwndClient, Windows::MDITILE_ZORDER, nil, 0, nil) }.
126
+ on(:command, :arrangeIcons) { Windows.ArrangeIconicWindows(hwndClient) }.
127
+
128
+ on(:initmenupopup) { |args|
129
+ [:tileHorz, :tileVert, :cascade, :arrangeIcons].each { |command|
130
+ @@instances[hwnd.to_i].menu[command].enabled = !Windows.GetWindow(hwndClient, Windows::GW_CHILD).null?
131
+ }
132
+ }
116
133
  end
117
134
 
118
135
  result = @@instances[hwnd.to_i].windowProc(hwnd, uMsg, wParam, lParam) if @@instances[hwnd.to_i]
@@ -290,9 +307,24 @@ module Fzeet
290
307
  }
291
308
 
292
309
  case _opts[:anchor]
293
- when :ltr; @parent.on(:size) { self.position = @parent.rect.tap { |r| r[:bottom] = _opts[:height] }.to_a }
294
- when :lrb; @parent.on(:size) { self.position = @parent.rect.tap { |r| r[:top] = r[:bottom] - _opts[:height]; r[:bottom] = _opts[:height] }.to_a }
295
- when :ltrb; @parent.on(:size) { self.position = @parent.rect.to_a }
310
+ when :ltr
311
+ @parent.on(:size) { |args|
312
+ self.position = @parent.rect.tap { |r| r[:bottom] = _opts[:height] }.to_a
313
+
314
+ args[:result] = nil if @parent.class == MDIChild
315
+ }
316
+ when :lrb
317
+ @parent.on(:size) { |args|
318
+ self.position = @parent.rect.tap { |r| r[:top] = r[:bottom] - _opts[:height]; r[:bottom] = _opts[:height] }.to_a
319
+
320
+ args[:result] = nil if @parent.class == MDIChild
321
+ }
322
+ when :ltrb
323
+ @parent.on(:size) { |args|
324
+ self.position = @parent.rect.to_a
325
+
326
+ args[:result] = nil if @parent.class == MDIChild
327
+ }
296
328
  else raise ArgumentError, "Bad anchor spec: #{_opts[:anchor]}."
297
329
  end if _opts[:anchor] && @parent
298
330
  end
@@ -12,6 +12,18 @@ module Fzeet
12
12
 
13
13
  super
14
14
  end
15
+
16
+ def activeChild
17
+ ((pchild = FFI::Pointer.new(Windows.SendMessage(client.handle, Windows::WM_MDIGETACTIVE, 0, 0))).null?) ?
18
+ nil :
19
+ Handle.instance(pchild)
20
+ end
21
+
22
+ def activate(child)
23
+ Windows.SendMessage(client.handle, Windows::WM_MDIACTIVATE, child.handle.to_i, 0)
24
+
25
+ self
26
+ end
15
27
  end
16
28
 
17
29
  MDIChild = BasicWindow['Fzeet.MDIChild',
@@ -273,11 +273,43 @@ module Fzeet
273
273
 
274
274
  Unknown = COM::Instance[IUnknown]
275
275
 
276
+ IDispatch = COM::Interface[IUnknown,
277
+ GUID['00020400-0000-0000-C000-000000000046'],
278
+
279
+ GetTypeInfoCount: [[:pointer], :long],
280
+ GetTypeInfo: [[:uint, :ulong, :pointer], :long],
281
+ GetIDsOfNames: [[:pointer, :pointer, :uint, :ulong, :pointer], :long],
282
+ Invoke: [[:long, :pointer, :ulong, :ushort, :pointer, :pointer, :pointer, :pointer], :long]
283
+ ]
284
+
285
+ Dispatch = COM::Instance[IDispatch]
286
+
287
+ IConnectionPointContainer = COM::Interface[IUnknown,
288
+ GUID['B196B284-BAB4-101A-B69C-00AA00341D07'],
289
+
290
+ EnumConnectionPoints: [[:pointer], :long],
291
+ FindConnectionPoint: [[:pointer, :pointer], :long]
292
+ ]
293
+
294
+ ConnectionPointContainer = COM::Instance[IConnectionPointContainer]
295
+
296
+ IConnectionPoint = COM::Interface[IUnknown,
297
+ GUID['B196B286-BAB4-101A-B69C-00AA00341D07'],
298
+
299
+ GetConnectionInterface: [[:pointer], :long],
300
+ GetConnectionPointContainer: [[:pointer], :long],
301
+ Advise: [[:pointer, :pointer], :long],
302
+ Unadvise: [[:ulong], :long],
303
+ EnumConnections: [[:pointer], :long]
304
+ ]
305
+
306
+ ConnectionPoint = COM::Instance[IConnectionPoint]
307
+
276
308
  IObjectWithSite = COM::Interface[IUnknown,
277
309
  GUID['FC4801A3-2BA9-11CF-A229-00AA003D7352'],
278
310
 
279
311
  SetSite: [[:pointer], :long],
280
- GetSite: [[:pointer, :pointer], :ulong]
312
+ GetSite: [[:pointer, :pointer], :long]
281
313
  ]
282
314
 
283
315
  ObjectWithSite = COM::Callback[IObjectWithSite]
@@ -10,6 +10,8 @@ module Fzeet
10
10
  attach_function :LoadLibrary, :LoadLibraryA, [:string], :pointer
11
11
  attach_function :FreeLibrary, [:pointer], :int
12
12
 
13
+ attach_function :GetSystemDefaultLCID, [], :ulong
14
+
13
15
  if WINVER.AtLeastWindowsXP?
14
16
  class ACTCTX < FFI::Struct
15
17
  layout \
@@ -0,0 +1,446 @@
1
+ require_relative 'com'
2
+
3
+ module Fzeet
4
+ module Windows
5
+ ffi_lib 'ole32'
6
+ ffi_convention :stdcall
7
+
8
+ attach_function :OleInitialize, [:pointer], :long
9
+ attach_function :OleUninitialize, [], :void
10
+
11
+ def InitializeOle
12
+ DetonateHresult(:OleInitialize, nil)
13
+
14
+ at_exit { OleUninitialize() }
15
+ end
16
+
17
+ module_function :InitializeOle
18
+
19
+ attach_function :CoTaskMemAlloc, [:ulong], :pointer
20
+ attach_function :CoTaskMemFree, [:pointer], :void
21
+
22
+ VT_EMPTY = 0
23
+ VT_NULL = 1
24
+ VT_I2 = 2
25
+ VT_I4 = 3
26
+ VT_R4 = 4
27
+ VT_R8 = 5
28
+ VT_CY = 6
29
+ VT_DATE = 7
30
+ VT_BSTR = 8
31
+ VT_DISPATCH = 9
32
+ VT_ERROR = 10
33
+ VT_BOOL = 11
34
+ VT_VARIANT = 12
35
+ VT_UNKNOWN = 13
36
+ VT_DECIMAL = 14
37
+ VT_I1 = 16
38
+ VT_UI1 = 17
39
+ VT_UI2 = 18
40
+ VT_UI4 = 19
41
+ VT_I8 = 20
42
+ VT_UI8 = 21
43
+ VT_INT = 22
44
+ VT_UINT = 23
45
+ VT_VOID = 24
46
+ VT_HRESULT = 25
47
+ VT_PTR = 26
48
+ VT_SAFEARRAY = 27
49
+ VT_CARRAY = 28
50
+ VT_USERDEFINED = 29
51
+ VT_LPSTR = 30
52
+ VT_LPWSTR = 31
53
+ VT_FILETIME = 64
54
+ VT_BLOB = 65
55
+ VT_STREAM = 66
56
+ VT_STORAGE = 67
57
+ VT_STREAMED_OBJECT = 68
58
+ VT_STORED_OBJECT = 69
59
+ VT_BLOB_OBJECT = 70
60
+ VT_CF = 71
61
+ VT_CLSID = 72
62
+ VT_VECTOR = 0x1000
63
+ VT_ARRAY = 0x2000
64
+ VT_BYREF = 0x4000
65
+ VT_RESERVED = 0x8000
66
+ VT_ILLEGAL = 0xffff
67
+ VT_ILLEGALMASKED = 0xfff
68
+ VT_TYPEMASK = 0xff
69
+
70
+ class PROPERTYKEY < FFI::Struct
71
+ layout \
72
+ :fmtid, GUID,
73
+ :pid, :ulong
74
+
75
+ def self.[](type, index)
76
+ new.tap { |key|
77
+ key[:fmtid].tap { |guid|
78
+ guid[:Data1] = 0x00000000 + index
79
+ guid[:Data2] = 0x7363
80
+ guid[:Data3] = 0x696e
81
+ [0x84, 0x41, 0x79, 0x8a, 0xcf, 0x5a, 0xeb, 0xb7].each_with_index { |part, i|
82
+ guid[:Data4][i] = part
83
+ }
84
+ }
85
+
86
+ key[:pid] = type
87
+ }
88
+ end
89
+
90
+ def ==(other) Windows.memcmp(other, self, size) == 0 end
91
+ end
92
+
93
+ class LARGE_INTEGER < FFI::Union
94
+ include AnonymousSupport
95
+
96
+ layout \
97
+ :_, Class.new(FFI::Struct) {
98
+ layout \
99
+ :LowPart, :ulong,
100
+ :HighPart, :long
101
+ },
102
+
103
+ :QuadPart, :long_long
104
+ end
105
+
106
+ class ULARGE_INTEGER < FFI::Union
107
+ include AnonymousSupport
108
+
109
+ layout \
110
+ :_, Class.new(FFI::Struct) {
111
+ layout \
112
+ :LowPart, :ulong,
113
+ :HighPart, :ulong
114
+ },
115
+
116
+ :QuadPart, :ulong_long
117
+ end
118
+
119
+ class FILETIME < FFI::Struct
120
+ layout \
121
+ :dwLowDateTime, :ulong,
122
+ :dwHighDateTime, :ulong
123
+ end
124
+
125
+ class BSTRBLOB < FFI::Struct
126
+ layout \
127
+ :cbSize, :ulong,
128
+ :pData, :pointer
129
+ end
130
+
131
+ class BLOB < FFI::Struct
132
+ layout \
133
+ :cbSize, :ulong,
134
+ :pBlobData, :pointer
135
+ end
136
+
137
+ class CA < FFI::Struct
138
+ layout \
139
+ :cElems, :ulong,
140
+ :pElems, :pointer
141
+ end
142
+
143
+ class DECIMAL < FFI::Struct
144
+ layout \
145
+ :wReserved, :ushort,
146
+ :scale, :uchar,
147
+ :sign, :uchar,
148
+ :Hi32, :ulong,
149
+ :Lo64, :ulong_long
150
+ end
151
+
152
+ class PROPVARIANT < FFI::Union
153
+ include AnonymousSupport
154
+
155
+ layout \
156
+ :_, Class.new(FFI::Struct) {
157
+ layout \
158
+ :vt, :ushort,
159
+ :wReserved1, :ushort,
160
+ :wReserved2, :ushort,
161
+ :wReserved3, :ushort,
162
+ :_, Class.new(FFI::Union) {
163
+ layout \
164
+ :cVal, :char,
165
+ :bVal, :uchar,
166
+ :iVal, :short,
167
+ :uiVal, :ushort,
168
+ :lVal, :long,
169
+ :ulVal, :ulong,
170
+ :intVal, :int,
171
+ :uintVal, :uint,
172
+ :hVal, LARGE_INTEGER,
173
+ :uhVal, ULARGE_INTEGER,
174
+ :fltVal, :float,
175
+ :dblVal, :double,
176
+ :boolVal, :short,
177
+ :bool, :short,
178
+ :scode, :long,
179
+ :cyVal, :long_long,
180
+ :date, :double,
181
+ :filetime, FILETIME,
182
+ :puuid, :pointer,
183
+ :pclipdata, :pointer,
184
+ :bstrVal, :pointer,
185
+ :bstrblobVal, BSTRBLOB,
186
+ :blob, BLOB,
187
+ :pszVal, :pointer,
188
+ :pwszVal, :pointer,
189
+ :punkVal, :pointer,
190
+ :pdispVal, :pointer,
191
+ :pStream, :pointer,
192
+ :pStorage, :pointer,
193
+ :pVersionedStream, :pointer,
194
+ :parray, :pointer,
195
+ :cac, CA,
196
+ :caub, CA,
197
+ :cai, CA,
198
+ :caui, CA,
199
+ :cal, CA,
200
+ :caul, CA,
201
+ :cah, CA,
202
+ :cauh, CA,
203
+ :caflt, CA,
204
+ :cadbl, CA,
205
+ :cabool, CA,
206
+ :cascode, CA,
207
+ :cacy, CA,
208
+ :cadate, CA,
209
+ :cafiletime, CA,
210
+ :cauuid, CA,
211
+ :caclipdata, CA,
212
+ :cabstr, CA,
213
+ :cabstrblob, CA,
214
+ :calpstr, CA,
215
+ :calpwstr, CA,
216
+ :capropvar, CA,
217
+ :pcVal, :pointer,
218
+ :pbVal, :pointer,
219
+ :piVal, :pointer,
220
+ :puiVal, :pointer,
221
+ :plVal, :pointer,
222
+ :pulVal, :pointer,
223
+ :pintVal, :pointer,
224
+ :puintVal, :pointer,
225
+ :pfltVal, :pointer,
226
+ :pdblVal, :pointer,
227
+ :pboolVal, :pointer,
228
+ :pdecVal, :pointer,
229
+ :pscode, :pointer,
230
+ :pcyVal, :pointer,
231
+ :pdate, :pointer,
232
+ :pbstrVal, :pointer,
233
+ :ppunkVal, :pointer,
234
+ :ppdispVal, :pointer,
235
+ :pparray, :pointer,
236
+ :pvarVal, :pointer
237
+ }
238
+ },
239
+
240
+ :decVal, DECIMAL
241
+
242
+ def self.[](t, *v) new.tap { |var| var.send("#{t}=", *v) } end
243
+
244
+ def bool; raise 'Wrong type tag.' unless self[:vt] == VT_BOOL; self[:boolVal] != 0 end
245
+ def bool=(bool) self[:vt] = VT_BOOL; self[:boolVal] = (bool) ? -1 : 0 end
246
+
247
+ def int; raise 'Wrong type tag.' unless self[:vt] == VT_I4; self[:intVal] end
248
+ def int=(int) self[:vt] = VT_I4; self[:intVal] = int end
249
+
250
+ def uint; raise 'Wrong type tag.' unless self[:vt] == VT_UI4; self[:uintVal] end
251
+ def uint=(uint) self[:vt] = VT_UI4; self[:uintVal] = uint end
252
+
253
+ def unknown
254
+ raise 'Wrong type tag.' unless self[:vt] == VT_UNKNOWN
255
+
256
+ yield Unknown.new(self[:punkVal])
257
+ ensure
258
+ Windows.PropVariantClear(self)
259
+ end
260
+
261
+ def unknown=(unknown) self[:vt] = VT_UNKNOWN; self[:punkVal] = unknown.pointer; unknown.AddRef end
262
+
263
+ def wstring; raise 'Wrong type tag.' unless self[:vt] == VT_LPWSTR; Windows.WCSTOMBS(self[:pwszVal]) end
264
+
265
+ def wstring=(string)
266
+ self[:vt] = VT_LPWSTR
267
+
268
+ FFI::MemoryPointer.new(:pointer) { |p|
269
+ Windows.DetonateHresult(:SHStrDup, string, p)
270
+
271
+ self[:pwszVal] = p.read_pointer
272
+ }
273
+ end
274
+
275
+ def decimal
276
+ raise 'Wrong type tag.' unless self[:vt] == VT_DECIMAL
277
+
278
+ Rational(self[:decVal][:Lo64], 10 ** self[:decVal][:scale]) + self[:decVal][:Hi32]
279
+ end
280
+
281
+ def decimal=(decimal) self[:vt] = VT_DECIMAL; self[:decVal][:Lo64] = decimal end
282
+ end
283
+
284
+ attach_function :PropVariantClear, [:pointer], :long
285
+
286
+ ffi_lib 'oleaut32'
287
+ ffi_convention :stdcall
288
+
289
+ attach_function :SysAllocString, [:buffer_in], :pointer
290
+ attach_function :SysFreeString, [:pointer], :void
291
+ attach_function :SysStringLen, [:pointer], :uint
292
+
293
+ OLEIVERB_PRIMARY = 0
294
+ OLEIVERB_SHOW = -1
295
+ OLEIVERB_OPEN = -2
296
+ OLEIVERB_HIDE = -3
297
+ OLEIVERB_UIACTIVATE = -4
298
+ OLEIVERB_INPLACEACTIVATE = -5
299
+ OLEIVERB_DISCARDUNDOSTATE = -6
300
+
301
+ IOleWindow = COM::Interface[IUnknown,
302
+ GUID['00000114-0000-0000-C000-000000000046'],
303
+
304
+ GetWindow: [[:pointer], :long],
305
+ ContextSensitiveHelp: [[:int], :long]
306
+ ]
307
+
308
+ OleWindow = COM::Instance[IOleWindow]
309
+
310
+ IOleInPlaceSite = COM::Interface[IOleWindow,
311
+ GUID['00000119-0000-0000-C000-000000000046'],
312
+
313
+ CanInPlaceActivate: [[], :long],
314
+ OnInPlaceActivate: [[], :long],
315
+ OnUIActivate: [[], :long],
316
+ GetWindowContext: [[:pointer, :pointer, :pointer, :pointer, :pointer], :long],
317
+ Scroll: [[:long_long], :long],
318
+ OnUIDeactivate: [[:int], :long],
319
+ OnInPlaceDeactivate: [[], :long],
320
+ DiscardUndoState: [[], :long],
321
+ DeactivateAndUndo: [[], :long],
322
+ OnPosRectChange: [[:pointer], :long]
323
+ ]
324
+
325
+ OleInPlaceSite = COM::Callback[IOleInPlaceSite]
326
+
327
+ IOleInPlaceUIWindow = COM::Interface[IOleWindow,
328
+ GUID['00000115-0000-0000-C000-000000000046'],
329
+
330
+ GetBorder: [[:pointer], :long],
331
+ RequestBorderSpace: [[:pointer], :long],
332
+ SetBorderSpace: [[:pointer], :long],
333
+ SetActiveObject: [[:pointer], :long]
334
+ ]
335
+
336
+ OleInPlaceUIWindow = COM::Callback[IOleInPlaceUIWindow]
337
+
338
+ class OLEINPLACEFRAMEINFO < FFI::Struct
339
+ layout \
340
+ :cb, :uint,
341
+ :fMDIApp, :int,
342
+ :hwndFrame, :pointer,
343
+ :haccel, :pointer,
344
+ :cAccelEntries, :uint
345
+ end
346
+
347
+ class OLEMENUGROUPWIDTHS < FFI::Struct
348
+ layout \
349
+ :width, [:long, 6]
350
+ end
351
+
352
+ IOleInPlaceFrame = COM::Interface[IOleInPlaceUIWindow,
353
+ GUID['00000116-0000-0000-C000-000000000046'],
354
+
355
+ InsertMenus: [[:pointer, :pointer], :long],
356
+ SetMenu: [[:pointer, :pointer, :pointer], :long],
357
+ RemoveMenus: [[:pointer], :long],
358
+ SetStatusText: [[:pointer], :long],
359
+ EnableModeless: [[:int], :long],
360
+ TranslateAccelerator: [[:pointer, :ushort], :long]
361
+ ]
362
+
363
+ OleInPlaceFrame = COM::Callback[IOleInPlaceFrame]
364
+
365
+ IOleClientSite = COM::Interface[IUnknown,
366
+ GUID['00000118-0000-0000-C000-000000000046'],
367
+
368
+ SaveObject: [[], :long],
369
+ GetMoniker: [[:ulong, :ulong, :pointer], :long],
370
+ GetContainer: [[:pointer], :long],
371
+ ShowObject: [[], :long],
372
+ OnShowWindow: [[:int], :long],
373
+ RequestNewObjectLayout: [[], :long]
374
+ ]
375
+
376
+ OleClientSite = COM::Callback[IOleClientSite]
377
+
378
+ OLEGETMONIKER_ONLYIFTHERE = 1
379
+ OLEGETMONIKER_FORCEASSIGN = 2
380
+ OLEGETMONIKER_UNASSIGN = 3
381
+ OLEGETMONIKER_TEMPFORUSER = 4
382
+
383
+ OLEWHICHMK_CONTAINER = 1
384
+ OLEWHICHMK_OBJREL = 2
385
+ OLEWHICHMK_OBJFULL = 3
386
+
387
+ USERCLASSTYPE_FULL = 1
388
+ USERCLASSTYPE_SHORT = 2
389
+ USERCLASSTYPE_APPNAME = 3
390
+
391
+ OLEMISC_RECOMPOSEONRESIZE = 0x00000001
392
+ OLEMISC_ONLYICONIC = 0x00000002
393
+ OLEMISC_INSERTNOTREPLACE = 0x00000004
394
+ OLEMISC_STATIC = 0x00000008
395
+ OLEMISC_CANTLINKINSIDE = 0x00000010
396
+ OLEMISC_CANLINKBYOLE1 = 0x00000020
397
+ OLEMISC_ISLINKOBJECT = 0x00000040
398
+ OLEMISC_INSIDEOUT = 0x00000080
399
+ OLEMISC_ACTIVATEWHENVISIBLE = 0x00000100
400
+ OLEMISC_RENDERINGISDEVICEINDEPENDENT = 0x00000200
401
+ OLEMISC_INVISIBLEATRUNTIME = 0x00000400
402
+ OLEMISC_ALWAYSRUN = 0x00000800
403
+ OLEMISC_ACTSLIKEBUTTON = 0x00001000
404
+ OLEMISC_ACTSLIKELABEL = 0x00002000
405
+ OLEMISC_NOUIACTIVATE = 0x00004000
406
+ OLEMISC_ALIGNABLE = 0x00008000
407
+ OLEMISC_SIMPLEFRAME = 0x00010000
408
+ OLEMISC_SETCLIENTSITEFIRST = 0x00020000
409
+ OLEMISC_IMEMODE = 0x00040000
410
+ OLEMISC_IGNOREACTIVATEWHENVISIBLE = 0x00080000
411
+ OLEMISC_WANTSTOMENUMERGE = 0x00100000
412
+ OLEMISC_SUPPORTSMULTILEVELUNDO = 0x00200000
413
+
414
+ OLECLOSE_SAVEIFDIRTY = 0
415
+ OLECLOSE_NOSAVE = 1
416
+ OLECLOSE_PROMPTSAVE = 2
417
+
418
+ IOleObject = COM::Interface[IUnknown,
419
+ GUID['00000112-0000-0000-C000-000000000046'],
420
+
421
+ SetClientSite: [[:pointer], :long],
422
+ GetClientSite: [[:pointer], :long],
423
+ SetHostNames: [[:pointer, :pointer], :long],
424
+ Close: [[:ulong], :long],
425
+ SetMoniker: [[:ulong, :pointer], :long],
426
+ GetMoniker: [[:ulong, :ulong, :pointer], :long],
427
+ InitFromData: [[:pointer, :int, :ulong], :long],
428
+ GetClipboardData: [[:ulong, :pointer], :long],
429
+ DoVerb: [[:long, :pointer, :pointer, :long, :pointer, :pointer], :long],
430
+ EnumVerbs: [[:pointer], :long],
431
+ Update: [[], :long],
432
+ IsUpToDate: [[], :long],
433
+ GetUserClassID: [[:pointer], :long],
434
+ GetUserType: [[:ulong, :pointer], :long],
435
+ SetExtent: [[:ulong, :pointer], :long],
436
+ GetExtent: [[:ulong, :pointer], :long],
437
+ Advise: [[:pointer, :pointer], :long],
438
+ Unadvise: [[:ulong], :long],
439
+ EnumAdvise: [[:pointer], :long],
440
+ GetMiscStatus: [[:ulong, :pointer], :long],
441
+ SetColorScheme: [[:pointer], :long]
442
+ ]
443
+
444
+ OleObject = COM::Instance[IOleObject]
445
+ end
446
+ end