unknownr 0.1.0 → 0.2.0

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.
Files changed (3) hide show
  1. data/examples/DesktopGadget.rbw +25 -0
  2. data/lib/unknownr.rb +619 -0
  3. metadata +8 -3
@@ -0,0 +1,25 @@
1
+ require 'unknownr'
2
+
3
+ include Unknownr::Windows
4
+
5
+ InitializeOle()
6
+
7
+ IDesktopGadget = COM::Interface[IUnknown,
8
+ GUID['c1646bc4-f298-4f91-a204-eb2dd1709d1a'],
9
+
10
+ RunGadget: [[:buffer_in], :long]
11
+ ]
12
+
13
+ DesktopGadget = COM::Factory[IDesktopGadget, GUID['924ccc1b-6562-4c85-8657-d177925222b6']]
14
+
15
+ dg = DesktopGadget.new
16
+
17
+ begin
18
+ dg.RunGadget(
19
+ "#{ENV['ProgramFiles']}/Windows Sidebar/Gadgets/Clock.Gadget\0".
20
+ gsub('/', '\\').
21
+ encode('utf-16le')
22
+ )
23
+ ensure
24
+ dg.Release
25
+ end
data/lib/unknownr.rb CHANGED
@@ -66,6 +66,8 @@ module Unknownr
66
66
  }
67
67
  }
68
68
  end
69
+
70
+ def ==(other) Windows.memcmp(other, self, size) == 0 end
69
71
  end
70
72
 
71
73
  CLSCTX_INPROC_SERVER = 0x1
@@ -272,5 +274,622 @@ module Unknownr
272
274
  ]
273
275
 
274
276
  Unknown = COM::Instance[IUnknown]
277
+
278
+ IDispatch = COM::Interface[IUnknown,
279
+ GUID['00020400-0000-0000-C000-000000000046'],
280
+
281
+ GetTypeInfoCount: [[:pointer], :long],
282
+ GetTypeInfo: [[:uint, :ulong, :pointer], :long],
283
+ GetIDsOfNames: [[:pointer, :pointer, :uint, :ulong, :pointer], :long],
284
+ Invoke: [[:long, :pointer, :ulong, :ushort, :pointer, :pointer, :pointer, :pointer], :long]
285
+ ]
286
+
287
+ Dispatch = COM::Instance[IDispatch]
288
+ DCallback = COM::Callback[IDispatch]
289
+
290
+ IConnectionPointContainer = COM::Interface[IUnknown,
291
+ GUID['B196B284-BAB4-101A-B69C-00AA00341D07'],
292
+
293
+ EnumConnectionPoints: [[:pointer], :long],
294
+ FindConnectionPoint: [[:pointer, :pointer], :long]
295
+ ]
296
+
297
+ ConnectionPointContainer = COM::Instance[IConnectionPointContainer]
298
+
299
+ IConnectionPoint = COM::Interface[IUnknown,
300
+ GUID['B196B286-BAB4-101A-B69C-00AA00341D07'],
301
+
302
+ GetConnectionInterface: [[:pointer], :long],
303
+ GetConnectionPointContainer: [[:pointer], :long],
304
+ Advise: [[:pointer, :pointer], :long],
305
+ Unadvise: [[:ulong], :long],
306
+ EnumConnections: [[:pointer], :long]
307
+ ]
308
+
309
+ ConnectionPoint = COM::Instance[IConnectionPoint]
310
+
311
+ IObjectWithSite = COM::Interface[IUnknown,
312
+ GUID['FC4801A3-2BA9-11CF-A229-00AA003D7352'],
313
+
314
+ SetSite: [[:pointer], :long],
315
+ GetSite: [[:pointer, :pointer], :long]
316
+ ]
317
+
318
+ ObjectWithSite = COM::Callback[IObjectWithSite]
319
+
320
+ attach_function :OleInitialize, [:pointer], :long
321
+ attach_function :OleUninitialize, [], :void
322
+
323
+ def InitializeOle
324
+ DetonateHresult(:OleInitialize, nil)
325
+
326
+ at_exit { OleUninitialize() }
327
+ end
328
+
329
+ module_function :InitializeOle
330
+
331
+ attach_function :CoTaskMemAlloc, [:ulong], :pointer
332
+ attach_function :CoTaskMemFree, [:pointer], :void
333
+
334
+ VT_EMPTY = 0
335
+ VT_NULL = 1
336
+ VT_I2 = 2
337
+ VT_I4 = 3
338
+ VT_R4 = 4
339
+ VT_R8 = 5
340
+ VT_CY = 6
341
+ VT_DATE = 7
342
+ VT_BSTR = 8
343
+ VT_DISPATCH = 9
344
+ VT_ERROR = 10
345
+ VT_BOOL = 11
346
+ VT_VARIANT = 12
347
+ VT_UNKNOWN = 13
348
+ VT_DECIMAL = 14
349
+ VT_I1 = 16
350
+ VT_UI1 = 17
351
+ VT_UI2 = 18
352
+ VT_UI4 = 19
353
+ VT_I8 = 20
354
+ VT_UI8 = 21
355
+ VT_INT = 22
356
+ VT_UINT = 23
357
+ VT_VOID = 24
358
+ VT_HRESULT = 25
359
+ VT_PTR = 26
360
+ VT_SAFEARRAY = 27
361
+ VT_CARRAY = 28
362
+ VT_USERDEFINED = 29
363
+ VT_LPSTR = 30
364
+ VT_LPWSTR = 31
365
+ VT_FILETIME = 64
366
+ VT_BLOB = 65
367
+ VT_STREAM = 66
368
+ VT_STORAGE = 67
369
+ VT_STREAMED_OBJECT = 68
370
+ VT_STORED_OBJECT = 69
371
+ VT_BLOB_OBJECT = 70
372
+ VT_CF = 71
373
+ VT_CLSID = 72
374
+ VT_VECTOR = 0x1000
375
+ VT_ARRAY = 0x2000
376
+ VT_BYREF = 0x4000
377
+ VT_RESERVED = 0x8000
378
+ VT_ILLEGAL = 0xffff
379
+ VT_ILLEGALMASKED = 0xfff
380
+ VT_TYPEMASK = 0xff
381
+
382
+ class PROPERTYKEY < FFI::Struct
383
+ layout \
384
+ :fmtid, GUID,
385
+ :pid, :ulong
386
+
387
+ def self.[](type, index)
388
+ new.tap { |key|
389
+ key[:fmtid].tap { |guid|
390
+ guid[:Data1] = 0x00000000 + index
391
+ guid[:Data2] = 0x7363
392
+ guid[:Data3] = 0x696e
393
+ [0x84, 0x41, 0x79, 0x8a, 0xcf, 0x5a, 0xeb, 0xb7].each_with_index { |part, i|
394
+ guid[:Data4][i] = part
395
+ }
396
+ }
397
+
398
+ key[:pid] = type
399
+ }
400
+ end
401
+
402
+ def ==(other) Windows.memcmp(other, self, size) == 0 end
403
+ end
404
+
405
+ module AnonymousSupport
406
+ def [](k)
407
+ if members.include?(k)
408
+ super
409
+ elsif self[:_].members.include?(k)
410
+ self[:_][k]
411
+ else
412
+ self[:_][:_][k]
413
+ end
414
+ end
415
+
416
+ def []=(k, v)
417
+ if members.include?(k)
418
+ super
419
+ elsif self[:_].members.include?(k)
420
+ self[:_][k] = v
421
+ else
422
+ self[:_][:_][k] = v
423
+ end
424
+ end
425
+ end
426
+
427
+ class LARGE_INTEGER < FFI::Union
428
+ include AnonymousSupport
429
+
430
+ layout \
431
+ :_, Class.new(FFI::Struct) {
432
+ layout \
433
+ :LowPart, :ulong,
434
+ :HighPart, :long
435
+ },
436
+
437
+ :QuadPart, :long_long
438
+ end
439
+
440
+ class ULARGE_INTEGER < FFI::Union
441
+ include AnonymousSupport
442
+
443
+ layout \
444
+ :_, Class.new(FFI::Struct) {
445
+ layout \
446
+ :LowPart, :ulong,
447
+ :HighPart, :ulong
448
+ },
449
+
450
+ :QuadPart, :ulong_long
451
+ end
452
+
453
+ class FILETIME < FFI::Struct
454
+ layout \
455
+ :dwLowDateTime, :ulong,
456
+ :dwHighDateTime, :ulong
457
+ end
458
+
459
+ class BSTRBLOB < FFI::Struct
460
+ layout \
461
+ :cbSize, :ulong,
462
+ :pData, :pointer
463
+ end
464
+
465
+ class BLOB < FFI::Struct
466
+ layout \
467
+ :cbSize, :ulong,
468
+ :pBlobData, :pointer
469
+ end
470
+
471
+ class CA < FFI::Struct
472
+ layout \
473
+ :cElems, :ulong,
474
+ :pElems, :pointer
475
+ end
476
+
477
+ class DECIMAL < FFI::Struct
478
+ layout \
479
+ :wReserved, :ushort,
480
+ :scale, :uchar,
481
+ :sign, :uchar,
482
+ :Hi32, :ulong,
483
+ :Lo64, :ulong_long
484
+ end
485
+
486
+ class VARIANT < FFI::Union
487
+ include AnonymousSupport
488
+
489
+ layout \
490
+ :_, Class.new(FFI::Struct) {
491
+ layout \
492
+ :vt, :ushort,
493
+ :wReserved1, :ushort,
494
+ :wReserved2, :ushort,
495
+ :wReserved3, :ushort,
496
+ :_, Class.new(FFI::Union) {
497
+ layout \
498
+ :llVal, :long_long,
499
+ :lVal, :long,
500
+ :bVal, :uchar,
501
+ :iVal, :short,
502
+ :fltVal, :float,
503
+ :dblVal, :double,
504
+ :boolVal, :short,
505
+ :bool, :short,
506
+ :scode, :long,
507
+ :cyVal, :ulong_long,
508
+ :date, :double,
509
+ :bstrVal, :pointer,
510
+ :punkVal, :pointer,
511
+ :pdispVal, :pointer,
512
+ :parray, :pointer,
513
+ :pbVal, :pointer,
514
+ :piVal, :pointer,
515
+ :plVal, :pointer,
516
+ :pllVal, :pointer,
517
+ :pfltVal, :pointer,
518
+ :pdblVal, :pointer,
519
+ :pboolVal, :pointer,
520
+ :pbool, :pointer,
521
+ :pscode, :pointer,
522
+ :pcyVal, :pointer,
523
+ :pdate, :pointer,
524
+ :pbstrVal, :pointer,
525
+ :ppunkVal, :pointer,
526
+ :ppdispVal, :pointer,
527
+ :pparrayv, :pointer,
528
+ :pvarVal, :pointer,
529
+ :byref, :pointer,
530
+ :cVal, :char,
531
+ :uiVal, :ushort,
532
+ :ulVal, :ulong,
533
+ :ullVal, :ulong_long,
534
+ :intVal, :int,
535
+ :uintVal, :uint,
536
+ :pdecVal, :pointer,
537
+ :pcVal, :pointer,
538
+ :puiVal, :pointer,
539
+ :pulVal, :pointer,
540
+ :pullVal, :pointer,
541
+ :pintVal, :pointer,
542
+ :puintVal, :pointer,
543
+ :BRECORD, Class.new(FFI::Struct) {
544
+ layout \
545
+ :pvRecord, :pointer,
546
+ :pRecInfo, :pointer
547
+ }
548
+ }
549
+ },
550
+
551
+ :decVal, DECIMAL
552
+ end
553
+
554
+ class PROPVARIANT < FFI::Union
555
+ include AnonymousSupport
556
+
557
+ layout \
558
+ :_, Class.new(FFI::Struct) {
559
+ layout \
560
+ :vt, :ushort,
561
+ :wReserved1, :ushort,
562
+ :wReserved2, :ushort,
563
+ :wReserved3, :ushort,
564
+ :_, Class.new(FFI::Union) {
565
+ layout \
566
+ :cVal, :char,
567
+ :bVal, :uchar,
568
+ :iVal, :short,
569
+ :uiVal, :ushort,
570
+ :lVal, :long,
571
+ :ulVal, :ulong,
572
+ :intVal, :int,
573
+ :uintVal, :uint,
574
+ :hVal, LARGE_INTEGER,
575
+ :uhVal, ULARGE_INTEGER,
576
+ :fltVal, :float,
577
+ :dblVal, :double,
578
+ :boolVal, :short,
579
+ :bool, :short,
580
+ :scode, :long,
581
+ :cyVal, :long_long,
582
+ :date, :double,
583
+ :filetime, FILETIME,
584
+ :puuid, :pointer,
585
+ :pclipdata, :pointer,
586
+ :bstrVal, :pointer,
587
+ :bstrblobVal, BSTRBLOB,
588
+ :blob, BLOB,
589
+ :pszVal, :pointer,
590
+ :pwszVal, :pointer,
591
+ :punkVal, :pointer,
592
+ :pdispVal, :pointer,
593
+ :pStream, :pointer,
594
+ :pStorage, :pointer,
595
+ :pVersionedStream, :pointer,
596
+ :parray, :pointer,
597
+ :cac, CA,
598
+ :caub, CA,
599
+ :cai, CA,
600
+ :caui, CA,
601
+ :cal, CA,
602
+ :caul, CA,
603
+ :cah, CA,
604
+ :cauh, CA,
605
+ :caflt, CA,
606
+ :cadbl, CA,
607
+ :cabool, CA,
608
+ :cascode, CA,
609
+ :cacy, CA,
610
+ :cadate, CA,
611
+ :cafiletime, CA,
612
+ :cauuid, CA,
613
+ :caclipdata, CA,
614
+ :cabstr, CA,
615
+ :cabstrblob, CA,
616
+ :calpstr, CA,
617
+ :calpwstr, CA,
618
+ :capropvar, CA,
619
+ :pcVal, :pointer,
620
+ :pbVal, :pointer,
621
+ :piVal, :pointer,
622
+ :puiVal, :pointer,
623
+ :plVal, :pointer,
624
+ :pulVal, :pointer,
625
+ :pintVal, :pointer,
626
+ :puintVal, :pointer,
627
+ :pfltVal, :pointer,
628
+ :pdblVal, :pointer,
629
+ :pboolVal, :pointer,
630
+ :pdecVal, :pointer,
631
+ :pscode, :pointer,
632
+ :pcyVal, :pointer,
633
+ :pdate, :pointer,
634
+ :pbstrVal, :pointer,
635
+ :ppunkVal, :pointer,
636
+ :ppdispVal, :pointer,
637
+ :pparray, :pointer,
638
+ :pvarVal, :pointer
639
+ }
640
+ },
641
+
642
+ :decVal, DECIMAL
643
+
644
+ def self.[](t, *v) new.tap { |var| var.send("#{t}=", *v) } end
645
+
646
+ def bool; raise 'Wrong type tag.' unless self[:vt] == VT_BOOL; self[:boolVal] != 0 end
647
+ def bool=(bool) self[:vt] = VT_BOOL; self[:boolVal] = (bool) ? -1 : 0 end
648
+
649
+ def int; raise 'Wrong type tag.' unless self[:vt] == VT_I4; self[:intVal] end
650
+ def int=(int) self[:vt] = VT_I4; self[:intVal] = int end
651
+
652
+ def uint; raise 'Wrong type tag.' unless self[:vt] == VT_UI4; self[:uintVal] end
653
+ def uint=(uint) self[:vt] = VT_UI4; self[:uintVal] = uint end
654
+
655
+ def unknown
656
+ raise 'Wrong type tag.' unless self[:vt] == VT_UNKNOWN
657
+
658
+ yield Unknown.new(self[:punkVal])
659
+ ensure
660
+ Windows.PropVariantClear(self)
661
+ end
662
+
663
+ def unknown=(unknown) self[:vt] = VT_UNKNOWN; self[:punkVal] = unknown.pointer; unknown.AddRef end
664
+
665
+ def wstring; raise 'Wrong type tag.' unless self[:vt] == VT_LPWSTR; Windows.WCSTOMBS(self[:pwszVal]) end
666
+
667
+ def wstring=(string)
668
+ self[:vt] = VT_LPWSTR
669
+
670
+ FFI::MemoryPointer.new(:pointer) { |p|
671
+ Windows.DetonateHresult(:SHStrDup, string, p)
672
+
673
+ self[:pwszVal] = p.read_pointer
674
+ }
675
+ end
676
+
677
+ def decimal
678
+ raise 'Wrong type tag.' unless self[:vt] == VT_DECIMAL
679
+
680
+ Rational(self[:decVal][:Lo64], 10 ** self[:decVal][:scale]) + self[:decVal][:Hi32]
681
+ end
682
+
683
+ def decimal=(decimal) self[:vt] = VT_DECIMAL; self[:decVal][:Lo64] = decimal end
684
+ end
685
+
686
+ attach_function :PropVariantClear, [:pointer], :long
687
+
688
+ class SAFEARRAYBOUND < FFI::Struct
689
+ layout \
690
+ :cElements, :ulong,
691
+ :lLbound, :long
692
+ end
693
+
694
+ class SAFEARRAY < FFI::Struct
695
+ layout \
696
+ :cDims, :ushort,
697
+ :fFeatures, :ushort,
698
+ :cbElements, :ulong,
699
+ :cLocks, :ulong,
700
+ :pvData, :pointer,
701
+ :rgsabound, [SAFEARRAYBOUND, 1]
702
+ end
703
+
704
+ ffi_lib 'oleaut32'
705
+ ffi_convention :stdcall
706
+
707
+ attach_function :SysAllocString, [:buffer_in], :pointer
708
+ attach_function :SysFreeString, [:pointer], :void
709
+ attach_function :SysStringLen, [:pointer], :uint
710
+
711
+ attach_function :SafeArrayCreateVector, [:ushort, :long, :uint], :pointer
712
+ attach_function :SafeArrayDestroy, [:pointer], :long
713
+ attach_function :SafeArrayAccessData, [:pointer, :pointer], :long
714
+ attach_function :SafeArrayUnaccessData, [:pointer], :long
715
+
716
+ OLEIVERB_PRIMARY = 0
717
+ OLEIVERB_SHOW = -1
718
+ OLEIVERB_OPEN = -2
719
+ OLEIVERB_HIDE = -3
720
+ OLEIVERB_UIACTIVATE = -4
721
+ OLEIVERB_INPLACEACTIVATE = -5
722
+ OLEIVERB_DISCARDUNDOSTATE = -6
723
+
724
+ IOleWindow = COM::Interface[IUnknown,
725
+ GUID['00000114-0000-0000-C000-000000000046'],
726
+
727
+ GetWindow: [[:pointer], :long],
728
+ ContextSensitiveHelp: [[:int], :long]
729
+ ]
730
+
731
+ OleWindow = COM::Instance[IOleWindow]
732
+
733
+ IOleInPlaceObject = COM::Interface[IOleWindow,
734
+ GUID['00000113-0000-0000-C000-000000000046'],
735
+
736
+ InPlaceDeactivate: [[], :long],
737
+ UIDeactivate: [[], :long],
738
+ SetObjectRects: [[:pointer, :pointer], :long],
739
+ ReactivateAndUndo: [[], :long]
740
+ ]
741
+
742
+ OleInPlaceObject = COM::Instance[IOleInPlaceObject]
743
+
744
+ IOleInPlaceSite = COM::Interface[IOleWindow,
745
+ GUID['00000119-0000-0000-C000-000000000046'],
746
+
747
+ CanInPlaceActivate: [[], :long],
748
+ OnInPlaceActivate: [[], :long],
749
+ OnUIActivate: [[], :long],
750
+ GetWindowContext: [[:pointer, :pointer, :pointer, :pointer, :pointer], :long],
751
+ Scroll: [[:long_long], :long],
752
+ OnUIDeactivate: [[:int], :long],
753
+ OnInPlaceDeactivate: [[], :long],
754
+ DiscardUndoState: [[], :long],
755
+ DeactivateAndUndo: [[], :long],
756
+ OnPosRectChange: [[:pointer], :long]
757
+ ]
758
+
759
+ OleInPlaceSite = COM::Callback[IOleInPlaceSite]
760
+
761
+ IOleClientSite = COM::Interface[IUnknown,
762
+ GUID['00000118-0000-0000-C000-000000000046'],
763
+
764
+ SaveObject: [[], :long],
765
+ GetMoniker: [[:ulong, :ulong, :pointer], :long],
766
+ GetContainer: [[:pointer], :long],
767
+ ShowObject: [[], :long],
768
+ OnShowWindow: [[:int], :long],
769
+ RequestNewObjectLayout: [[], :long]
770
+ ]
771
+
772
+ OleClientSite = COM::Callback[IOleClientSite]
773
+
774
+ OLEGETMONIKER_ONLYIFTHERE = 1
775
+ OLEGETMONIKER_FORCEASSIGN = 2
776
+ OLEGETMONIKER_UNASSIGN = 3
777
+ OLEGETMONIKER_TEMPFORUSER = 4
778
+
779
+ OLEWHICHMK_CONTAINER = 1
780
+ OLEWHICHMK_OBJREL = 2
781
+ OLEWHICHMK_OBJFULL = 3
782
+
783
+ USERCLASSTYPE_FULL = 1
784
+ USERCLASSTYPE_SHORT = 2
785
+ USERCLASSTYPE_APPNAME = 3
786
+
787
+ OLEMISC_RECOMPOSEONRESIZE = 0x00000001
788
+ OLEMISC_ONLYICONIC = 0x00000002
789
+ OLEMISC_INSERTNOTREPLACE = 0x00000004
790
+ OLEMISC_STATIC = 0x00000008
791
+ OLEMISC_CANTLINKINSIDE = 0x00000010
792
+ OLEMISC_CANLINKBYOLE1 = 0x00000020
793
+ OLEMISC_ISLINKOBJECT = 0x00000040
794
+ OLEMISC_INSIDEOUT = 0x00000080
795
+ OLEMISC_ACTIVATEWHENVISIBLE = 0x00000100
796
+ OLEMISC_RENDERINGISDEVICEINDEPENDENT = 0x00000200
797
+ OLEMISC_INVISIBLEATRUNTIME = 0x00000400
798
+ OLEMISC_ALWAYSRUN = 0x00000800
799
+ OLEMISC_ACTSLIKEBUTTON = 0x00001000
800
+ OLEMISC_ACTSLIKELABEL = 0x00002000
801
+ OLEMISC_NOUIACTIVATE = 0x00004000
802
+ OLEMISC_ALIGNABLE = 0x00008000
803
+ OLEMISC_SIMPLEFRAME = 0x00010000
804
+ OLEMISC_SETCLIENTSITEFIRST = 0x00020000
805
+ OLEMISC_IMEMODE = 0x00040000
806
+ OLEMISC_IGNOREACTIVATEWHENVISIBLE = 0x00080000
807
+ OLEMISC_WANTSTOMENUMERGE = 0x00100000
808
+ OLEMISC_SUPPORTSMULTILEVELUNDO = 0x00200000
809
+
810
+ OLECLOSE_SAVEIFDIRTY = 0
811
+ OLECLOSE_NOSAVE = 1
812
+ OLECLOSE_PROMPTSAVE = 2
813
+
814
+ IOleObject = COM::Interface[IUnknown,
815
+ GUID['00000112-0000-0000-C000-000000000046'],
816
+
817
+ SetClientSite: [[:pointer], :long],
818
+ GetClientSite: [[:pointer], :long],
819
+ SetHostNames: [[:pointer, :pointer], :long],
820
+ Close: [[:ulong], :long],
821
+ SetMoniker: [[:ulong, :pointer], :long],
822
+ GetMoniker: [[:ulong, :ulong, :pointer], :long],
823
+ InitFromData: [[:pointer, :int, :ulong], :long],
824
+ GetClipboardData: [[:ulong, :pointer], :long],
825
+ DoVerb: [[:long, :pointer, :pointer, :long, :pointer, :pointer], :long],
826
+ EnumVerbs: [[:pointer], :long],
827
+ Update: [[], :long],
828
+ IsUpToDate: [[], :long],
829
+ GetUserClassID: [[:pointer], :long],
830
+ GetUserType: [[:ulong, :pointer], :long],
831
+ SetExtent: [[:ulong, :pointer], :long],
832
+ GetExtent: [[:ulong, :pointer], :long],
833
+ Advise: [[:pointer, :pointer], :long],
834
+ Unadvise: [[:ulong], :long],
835
+ EnumAdvise: [[:pointer], :long],
836
+ GetMiscStatus: [[:ulong, :pointer], :long],
837
+ SetColorScheme: [[:pointer], :long]
838
+ ]
839
+
840
+ OleObject = COM::Instance[IOleObject]
841
+
842
+ class PARAMDATA < FFI::Struct
843
+ layout \
844
+ :szName, :pointer,
845
+ :vt, :ushort
846
+ end
847
+
848
+ CC_FASTCALL = 0
849
+ CC_CDECL = 1
850
+ CC_MSCPASCAL = CC_CDECL + 1
851
+ CC_PASCAL = CC_MSCPASCAL
852
+ CC_MACPASCAL = CC_PASCAL + 1
853
+ CC_STDCALL = CC_MACPASCAL + 1
854
+ CC_FPFASTCALL = CC_STDCALL + 1
855
+ CC_SYSCALL = CC_FPFASTCALL + 1
856
+ CC_MPWCDECL = CC_SYSCALL + 1
857
+ CC_MPWPASCAL = CC_MPWCDECL + 1
858
+ CC_MAX = CC_MPWPASCAL + 1
859
+
860
+ DISPATCH_METHOD = 0x1
861
+ DISPATCH_PROPERTYGET = 0x2
862
+ DISPATCH_PROPERTYPUT = 0x4
863
+ DISPATCH_PROPERTYPUTREF = 0x8
864
+
865
+ class METHODDATA < FFI::Struct
866
+ layout \
867
+ :szName, :pointer,
868
+ :ppdata, :pointer,
869
+ :dispid, :long,
870
+ :iMeth, :uint,
871
+ :cc, :uint,
872
+ :cArgs, :uint,
873
+ :wFlags, :ushort,
874
+ :vtReturn, :ushort
875
+ end
876
+
877
+ class INTERFACEDATA < FFI::Struct
878
+ layout \
879
+ :pmethdata, :pointer,
880
+ :cMembers, :uint
881
+ end
882
+
883
+ attach_function :CreateDispTypeInfo, [:pointer, :ulong, :pointer], :long
884
+
885
+ class DISPPARAMS < FFI::Struct
886
+ layout \
887
+ :rgvarg, :pointer,
888
+ :rgdispidNamedArgs, :pointer,
889
+ :cArgs, :uint,
890
+ :cNamedArgs, :uint
891
+ end
892
+
893
+ attach_function :DispInvoke, [:pointer, :pointer, :long, :ushort, :pointer, :pointer, :pointer, :pointer], :long
275
894
  end
276
895
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unknownr
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 1
8
+ - 2
8
9
  - 0
9
- version: 0.1.0
10
+ version: 0.2.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Radoslav Peev
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-09-07 00:00:00 +03:00
18
+ date: 2010-10-08 00:00:00 +03:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
@@ -25,6 +26,7 @@ dependencies:
25
26
  requirements:
26
27
  - - ~>
27
28
  - !ruby/object:Gem::Version
29
+ hash: 1
28
30
  segments:
29
31
  - 0
30
32
  - 6
@@ -42,6 +44,7 @@ extra_rdoc_files: []
42
44
 
43
45
  files:
44
46
  - lib/unknownr.rb
47
+ - examples/DesktopGadget.rbw
45
48
  - LICENSE
46
49
  has_rdoc: true
47
50
  homepage:
@@ -57,6 +60,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - ">="
59
62
  - !ruby/object:Gem::Version
63
+ hash: 3
60
64
  segments:
61
65
  - 0
62
66
  version: "0"
@@ -65,6 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
69
  requirements:
66
70
  - - ">="
67
71
  - !ruby/object:Gem::Version
72
+ hash: 3
68
73
  segments:
69
74
  - 0
70
75
  version: "0"