module Puppet::Util::Windows::COM::Factory

Public Class Methods

[](iface, clsid) click to toggle source
# File lib/puppet/util/windows/com.rb, line 155
def self.[](iface, clsid)
  Class.new(iface) do
    send(:include, Helpers)

    const_set(:CLSID, clsid)

    def initialize(opts = {})
      @opts = opts

      @opts[:clsctx] ||= CLSCTX_INPROC_SERVER

      FFI::MemoryPointer.new(:pointer) do |ppv|
        hr = Puppet::Util::Windows::COM.CoCreateInstance(self.class::CLSID, FFI::Pointer::NULL, @opts[:clsctx], self.class::IID, ppv)
        if Puppet::Util::Windows::COM.FAILED(hr)
          raise "CoCreateInstance failed (#{self.class})."
        end

        self.pointer = ppv.read_pointer
      end

      @vtbl = self.class::VTBL.new(self[:lpVtbl])
    end

    attr_reader :vtbl

    self::VTBL.members.each do |name|
      define_method(name) do |*args|
        if Puppet::Util::Windows::COM.FAILED(result = @vtbl[name].call(self, *args))
          raise Puppet::Util::Windows::Error.new("Failed to call #{self}::#{name} with HRESULT: #{result}.", result)
        end
        result
      end
    end

    layout            :lpVtbl, :pointer
  end
end
new(opts = {}) click to toggle source
# File lib/puppet/util/windows/com.rb, line 161
def initialize(opts = {})
  @opts = opts

  @opts[:clsctx] ||= CLSCTX_INPROC_SERVER

  FFI::MemoryPointer.new(:pointer) do |ppv|
    hr = Puppet::Util::Windows::COM.CoCreateInstance(self.class::CLSID, FFI::Pointer::NULL, @opts[:clsctx], self.class::IID, ppv)
    if Puppet::Util::Windows::COM.FAILED(hr)
      raise "CoCreateInstance failed (#{self.class})."
    end

    self.pointer = ppv.read_pointer
  end

  @vtbl = self.class::VTBL.new(self[:lpVtbl])
end