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