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