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