Skip to content

Instantly share code, notes, and snippets.

@doju-m
Created October 14, 2014 05:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save doju-m/1a64a579bea22e07bf7d to your computer and use it in GitHub Desktop.
Save doju-m/1a64a579bea22e07bf7d to your computer and use it in GitHub Desktop.
# -*- encoding: utf-8 -*-
# Original 'soleb' is written by Masaki Suketa ( http://homepage1.nifty.com/markey/ruby/win32ole/index_e.html ).
# This qtbindings version is modified by Toshiaki Yoshida ( toshi@doju-m.jp ).
# DO NOT ASK ABOUT THIS VERSION FOR ORIGINAL WRITER.
# You can redistribute it under the terms specified in the COPYING file of the Ruby distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
# PURPOSE.
require 'tk'
require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8
class OLEINFO
def initialize
@members = []
@tlibs = nil
end
def typelibs
if @tlibs.nil?
@tlibs = WIN32OLE_TYPELIB.typelibs.select{|t|
t.name.size > 0
}.sort {|a, b| a.name <=> b.name}
end
@tlibs
end
def ole_classes(tlib)
WIN32OLE_TYPE.ole_classes(tlib).collect {|t|
t.name
}.sort
end
def ole_members(tlib, klass)
@members = []
k = WIN32OLE_TYPE.ole_classes(tlib).find {|t|
t.name == klass
}
return [] if !k
@members = (k.ole_methods + k.variables).sort{|m1, m2|
m1.name <=> m2.name
}
(@members).collect {|m|
m.name
}
end
def ole_class_info(tlib, klass)
k = WIN32OLE_TYPE.ole_classes(tlib).find {|t|
t.name == klass
}
return "" if !k
"#{k.ole_type} #{k.name}\r\n" +
" GUID : #{k.guid}\r\n" +
" PROGID : #{k.progid}\r\n" +
" DESCRIPTION : #{k.helpstring}\r\n\r\n"
end
def method_info(m)
info = ""
info += "Event " if m.event?
info += m.invoke_kind
info += " "
info += m.return_type
info += " "
info += m.name
info += "\r\n"
info += " Dispatch ID : #{m.dispid}\r\n"
info += " DESCRIPTION : #{m.helpstring}\r\n"
m.params.each_with_index do |param, i|
pinfos = []
pinfos.push "IN" if param.input?
pinfos.push "OUT" if param.output?
pinfos.push "OPTION" if param.optional?
pinfo = "arg#{i+1} - #{param.ole_type} #{param.name} [#{pinfos.join(',')}]"
pinfo += " = #{param.default}" if param.default
info += " #{pinfo}\r\n"
end
info += "\r\n"
info += " Event Interface : #{m.event_interface}\r\n" if m.event?
info
end
def variable_info(m)
info = "\r\n #{m.variable_kind} #{m.ole_type} #{m.name}"
info += " = #{m.value}" if m.value
info
end
def ole_member_info(tlib, klass, member, i)
k = WIN32OLE_TYPE.ole_classes(tlib).find {|t|
t.name == klass
}
return "" if !k
m = (k.ole_methods + k.variables).find {|mm|
mm.name == member
}
m = @members[i]
return "" if !m
if m.kind_of?(WIN32OLE_METHOD)
return method_info(m)
else
return variable_info(m)
end
end
end
module SOleB
class App
VERSION = '0.0.1a'
def initialize(argv)
@ole_info = OLEINFO.new
@window = make_window
fill_typelibs
#Tk.mainloop
end
def make_window
app = self
root = TkRoot.new {
title "Simple OLE Browser #{App::VERSION}"
bind('Destroy', proc { exit })
}
lib_frm = TkFrame.new
@lib_list = TkListbox.new(lib_frm) {
bind('ButtonRelease-1', proc { app.tlib_selchanged })
pack('side' => 'left', 'fill' => 'both', 'expand' => 'true')
}
lib_src = TkScrollbar.new(lib_frm).pack('side' => 'left', 'fill' => 'y')
@lib_list.yscrollbar(lib_src)
lib_frm.pack 'fill' => 'both'
frm_m = TkFrame.new {
}
@if_list = TkListbox.new(frm_m) {
bind('ButtonRelease-1', proc { app.class_selchanged })
pack 'side' => 'left', 'fill' => 'both', 'expand' => 'true'
}
if_src = TkScrollbar.new(frm_m).pack('side' => 'left', 'fill' => 'y')
@if_list.yscrollbar(if_src)
@method_list = TkListbox.new(frm_m) {
bind('ButtonRelease-1', proc { app.member_selchanged })
pack 'side' => 'left', 'fill' => 'both', 'expand' => 'true'
}
meth_src = TkScrollbar.new(frm_m).pack('side' => 'left', 'fill' => 'y')
@method_list.yscrollbar(meth_src)
frm_m.pack 'fill' => 'both'
@desc_area = TkText.new {
pack 'fill' => 'both'
}
root
end
def exec
Tk.mainloop
end
def fill_typelibs
@ole_info.typelibs.each_with_index {|e, i|
@lib_list.insert(i, e.name)
}
end
def tlib_selchanged
@current_guid = @ole_info.typelibs[@lib_list.curselection[0]].guid
@if_list.tap {|lst|
lst.clear
@ole_info.ole_classes(@current_guid).each_with_index {|c, i|
lst.insert(i, c)
}
}
end
def class_selchanged
@current_class_name = @if_list.get(@if_list.curselection[0])
#puts @current_class_name
@method_list.tap {|lst|
lst.clear
@ole_info.ole_members(@current_guid, @current_class_name).each_with_index {|m, i|
lst.insert(i, m)
}
}
@desc_area.value = get_classinfo(@current_guid, @current_class_name)
end
def member_selchanged
idx = @method_list.curselection[0]
member_name = @method_list.get(idx)
#puts member_name
@desc_area.value =
get_classinfo(@current_guid, @current_class_name) +
@ole_info.ole_member_info(
@current_guid, @current_class_name, member_name, idx)
end
def get_classinfo(guid, class_name)
@ole_info.ole_class_info(guid, class_name)
end
end
end
SOleB::App.new(ARGV).exec
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment