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