Created
October 14, 2014 05:47
-
-
Save doju-m/1a64a579bea22e07bf7d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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