module Puppet::Util::Windows::COM::Factory
Public Class Methods
[](iface, clsid)
click to toggle source
# File lib/puppet/util/windows/com.rb 156 def self.[](iface, clsid) 157 Class.new(iface) do 158 send(:include, Helpers) 159 160 const_set(:CLSID, clsid) 161 162 def initialize(opts = {}) 163 @opts = opts 164 165 @opts[:clsctx] ||= CLSCTX_INPROC_SERVER 166 167 FFI::MemoryPointer.new(:pointer) do |ppv| 168 hr = Puppet::Util::Windows::COM.CoCreateInstance(self.class::CLSID, FFI::Pointer::NULL, @opts[:clsctx], self.class::IID, ppv) 169 if Puppet::Util::Windows::COM.FAILED(hr) 170 raise _("CoCreateInstance failed (%{klass}).") % { klass: self.class } 171 end 172 173 self.pointer = ppv.read_pointer 174 end 175 176 @vtbl = self.class::VTBL.new(self[:lpVtbl]) 177 end 178 179 attr_reader :vtbl 180 181 self::VTBL.members.each do |name| 182 define_method(name) do |*args| 183 if Puppet::Util::Windows::COM.FAILED(result = @vtbl[name].call(self, *args)) 184 raise Puppet::Util::Windows::Error.new(_("Failed to call %{klass}::%{name} with HRESULT: %{result}.") % { klass: self, name: name, result: result }, result) 185 end 186 result 187 end 188 end 189 190 layout \ 191 :lpVtbl, :pointer 192 end 193 end
new(opts = {})
click to toggle source
# File lib/puppet/util/windows/com.rb 162 def initialize(opts = {}) 163 @opts = opts 164 165 @opts[:clsctx] ||= CLSCTX_INPROC_SERVER 166 167 FFI::MemoryPointer.new(:pointer) do |ppv| 168 hr = Puppet::Util::Windows::COM.CoCreateInstance(self.class::CLSID, FFI::Pointer::NULL, @opts[:clsctx], self.class::IID, ppv) 169 if Puppet::Util::Windows::COM.FAILED(hr) 170 raise _("CoCreateInstance failed (%{klass}).") % { klass: self.class } 171 end 172 173 self.pointer = ppv.read_pointer 174 end 175 176 @vtbl = self.class::VTBL.new(self[:lpVtbl]) 177 end