class TurboRex::Windows::COM::Client

Attributes

api_proxy[R]
clsid[R]
iunknown[R]

Public Class Methods

new(clsid, opts = {}) click to toggle source
# File lib/turborex/windows/com/client.rb, line 11
def initialize(clsid, opts = {})
  @clsid = clsid
  @context = opts[:cls_context] || CLSCTX_ALL
  @iunknown = Interface::IUnknown.new
  @apartment = opts[:apartment] || 0
  @api_proxy = Win32API.dup
  @cp = @api_proxy.cp

  Win32API.coinitializeex(0, @apartment)
end

Public Instance Methods

create_instance(opts={}) click to toggle source

Binding to class implementation

# File lib/turborex/windows/com/client.rb, line 23
def create_instance(opts={})
  interface = opts[:interface] || @iunknown
  iid = interface.iid
  cls_context = opts[:cls_context] || @context
  ppv = @api_proxy.alloc_c_ptr('PVOID')
  pclsid = Utils.clsid_to_raw(@clsid)
  piid = Utils.clsid_to_raw(iid)

  hr = @api_proxy.cocreateinstance(pclsid, 0, cls_context, piid, ppv)
  raise "Failed to call CoCreateInstance: #{TinySDK.format_hex_ntstatus(hr, hex_str: true)}" unless TinySDK.nt_success?(hr)
  pthis = ppv[0]
  interface.this = pthis
  @iunknown = interface if interface.kind_of?(Interface::IUnknown)
  interface
end
get_class_object(opts={}) click to toggle source

Binding to class object(class factory)

# File lib/turborex/windows/com/client.rb, line 40
def get_class_object(opts={})
  interface = Interface::IClassFactory.new
  iid = interface.iid
  cls_context = opts[:cls_context] || @context
  server_info = opts[:server_info]
  ppv = @api_proxy.alloc_c_ptr('LPVOID')
  pclsid = Utils.clsid_to_raw(@clsid)
  piid = Utils.clsid_to_raw(iid)

  hr = @api_proxy.cogetclassobject(pclsid, cls_context, server_info, piid, ppv)
  raise "Failed to call CoGetClassObject: #{TinySDK.format_hex_ntstatus(hr, hex_str: true)}" unless TinySDK.nt_success?(hr)

  pthis = ppv[0]
  interface.this = pthis
  interface
end
query_interface(iid_or_iface) click to toggle source
# File lib/turborex/windows/com/client.rb, line 57
def query_interface(iid_or_iface)
  interface = nil
  if iid_or_iface.is_a?(Interface)
    interface = iid_or_iface
    iid = interface.iid
  elsif iid_or_iface.is_a?(String)
    iid = iid_or_iface
  end

  create_instance unless @iunknown.this
  iid = Utils.clsid_to_raw(iid)
  ppv = @api_proxy.alloc_c_ptr('PVOID')

  if @iunknown.QueryInterface(iid, ppv).nil?
    if interface
      interface.this = ppv[0]
      return interface
    else
      return ppv[0]
    end
  end

  false
end