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