Module: WindowsCOM::COMInterface_

Defined in:
lib/windows_com/common.rb

Class Method Summary collapse

Class Method Details

.[](vtbl, siid) ⇒ Object



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/windows_com/common.rb', line 124

def self.[](vtbl, siid)
  Class.new {
    const_set :Vtbl, vtbl
    const_set :IID, WindowsCOM::GUIDFromString(siid)

    def initialize(pointer)
      @vptr = COMVptr_.new(pointer)
      @vtbl = self.class::Vtbl.new(@vptr[:lpVtbl])
    end

    attr_reader :vptr, :vtbl

    self::Vtbl.members.each { |name, sig|
      define_method(name) { |*args|
        hresult = @vtbl[name].call(@vptr, *args)

        raise "#{self}.#{name} failed (hresult: #{format('%#08x', hresult)})" if
          WindowsCOM::FAILED(hresult)

        hresult
      }
    }
  }
end