fzeet 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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