exerb 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/ChangeLog.ja.rd +305 -0
- data/README.en.txt +12 -0
- data/README.ja.html +143 -0
- data/README.ja.txt +6 -0
- data/README.md +50 -0
- data/Rakefile +205 -0
- data/bin/exerb +185 -0
- data/bin/mkexy +47 -0
- data/doc/LGPL +513 -0
- data/doc/class.ja.html +92 -0
- data/doc/command.ja.html +109 -0
- data/doc/core.ja.html +72 -0
- data/doc/example.ja.html +89 -0
- data/doc/faq.ja.html +59 -0
- data/doc/inside.ja.rd +404 -0
- data/doc/license.ja.html +62 -0
- data/doc/logo.gif +0 -0
- data/doc/misc.ja.html +72 -0
- data/doc/navi.gif +0 -0
- data/doc/recipe.ja.html +317 -0
- data/doc/style.css +187 -0
- data/doc/tutorial.ja.html +182 -0
- data/example/Makefile +54 -0
- data/example/cat_n.rb +14 -0
- data/example/exception.rb +9 -0
- data/example/ext/Win32API.so +0 -0
- data/example/ext/swin.so +0 -0
- data/example/msgbox.rb +14 -0
- data/example/rubytk.rb +22 -0
- data/example/runtime.ico +0 -0
- data/example/runtime.rb +19 -0
- data/example/vr/clipboard.rb +106 -0
- data/example/vr/compat/rubycompat.rb +18 -0
- data/example/vr/compat/vrcomctl.rb +12 -0
- data/example/vr/compat/vrcontrol.rb +50 -0
- data/example/vr/compat/vrmmedia.rb +24 -0
- data/example/vr/contrib/inifile.rb +116 -0
- data/example/vr/contrib/msgboxconst.rb +55 -0
- data/example/vr/contrib/toolbar.rb +371 -0
- data/example/vr/contrib/vrctlcolor.rb +110 -0
- data/example/vr/contrib/vrhotkey.rb +35 -0
- data/example/vr/contrib/vrlistviewex.rb +71 -0
- data/example/vr/contrib/vrstdscrollbar.rb +414 -0
- data/example/vr/contrib/vrwincomponent.rb +54 -0
- data/example/vr/dragdropformat.rb +209 -0
- data/example/vr/rscutil.rb +168 -0
- data/example/vr/sysmod.rb +249 -0
- data/example/vr/vractivex.rb +56 -0
- data/example/vr/vrclipboard.rb +53 -0
- data/example/vr/vrcomctl.rb +1819 -0
- data/example/vr/vrcontrol.rb +1374 -0
- data/example/vr/vrdde.rb +623 -0
- data/example/vr/vrddrop.rb +190 -0
- data/example/vr/vrdialog.rb +406 -0
- data/example/vr/vrhandler.rb +195 -0
- data/example/vr/vrlayout.old.rb +209 -0
- data/example/vr/vrlayout.rb +173 -0
- data/example/vr/vrlayout2.rb +340 -0
- data/example/vr/vrmargin.rb +141 -0
- data/example/vr/vrmgdlayout.rb +381 -0
- data/example/vr/vrmmedia.rb +287 -0
- data/example/vr/vrolednd.rb +192 -0
- data/example/vr/vrowndraw.rb +108 -0
- data/example/vr/vrrichedit.rb +366 -0
- data/example/vr/vrtimer.rb +148 -0
- data/example/vr/vrtooltip.rb +273 -0
- data/example/vr/vrtray.rb +143 -0
- data/example/vr/vrtvitem.rb +118 -0
- data/example/vr/vrtwopane.rb +223 -0
- data/example/vr/vruby.rb +1051 -0
- data/example/vr/winconst.rb +158 -0
- data/example/vruby.rb +38 -0
- data/exerb.gemspec +26 -0
- data/extconf.rb +7 -0
- data/lib/exerb/archive.rb +143 -0
- data/lib/exerb/config.rb +51 -0
- data/lib/exerb/error.rb +15 -0
- data/lib/exerb/executable.rb +68 -0
- data/lib/exerb/file_table.rb +189 -0
- data/lib/exerb/mkexy.rb +81 -0
- data/lib/exerb/name_table.rb +120 -0
- data/lib/exerb/recipe.rb +465 -0
- data/lib/exerb/resource.rb +190 -0
- data/lib/exerb/resource/base.rb +29 -0
- data/lib/exerb/resource/binary.rb +31 -0
- data/lib/exerb/resource/dialog.rb +30 -0
- data/lib/exerb/resource/group_icon.rb +85 -0
- data/lib/exerb/resource/icon.rb +52 -0
- data/lib/exerb/resource/version_info.rb +155 -0
- data/lib/exerb/resource_library.rb +120 -0
- data/lib/exerb/utility.rb +95 -0
- data/lib/exerb/utility2.rb +122 -0
- data/lib/exerb/version.rb +13 -0
- data/lib/exerb/win32/const/resource.rb +51 -0
- data/lib/exerb/win32/icon_file.rb +78 -0
- data/lib/exerb/win32/pe_file.rb +59 -0
- data/lib/exerb/win32/resource_directory.rb +105 -0
- data/lib/exerb/win32/resource_directory_root.rb +67 -0
- data/lib/exerb/win32/resource_entry.rb +98 -0
- data/lib/exerb/win32/struct/base.rb +43 -0
- data/lib/exerb/win32/struct/icon_dir_entry.rb +83 -0
- data/lib/exerb/win32/struct/icon_header.rb +43 -0
- data/lib/exerb/win32/struct/icon_res_entry.rb +48 -0
- data/lib/exerb/win32/struct/image_dos_header.rb +73 -0
- data/lib/exerb/win32/struct/image_file_header.rb +47 -0
- data/lib/exerb/win32/struct/image_nt_headers32.rb +53 -0
- data/lib/exerb/win32/struct/image_optional_header32.rb +107 -0
- data/lib/exerb/win32/struct/image_resource_data_entry.rb +45 -0
- data/lib/exerb/win32/struct/image_resource_directory.rb +47 -0
- data/lib/exerb/win32/struct/image_resource_directory_entry.rb +72 -0
- data/lib/exerb/win32/struct/image_section_header.rb +53 -0
- data/lib/exerb/win32/struct/version_info_block.rb +75 -0
- data/lib/exerb/win32/struct/vs_fixed_file_info.rb +62 -0
- data/src/exerb/cui.c +48 -0
- data/src/exerb/default.rb +1 -0
- data/src/exerb/exerb.c +877 -0
- data/src/exerb/exerb.h +92 -0
- data/src/exerb/gui.c +176 -0
- data/src/exerb/module.c +138 -0
- data/src/exerb/module.h +7 -0
- data/src/exerb/patch.c +27 -0
- data/src/exerb/resource.h +22 -0
- data/src/exerb/resource.rc +121 -0
- data/src/exerb/ruby.ico +0 -0
- data/src/exerb/utility.c +263 -0
- data/src/exerb/utility.h +33 -0
- data/test/alltests.rb +16 -0
- data/test/test-argv.rb +26 -0
- data/test/test-argv/test-argv.rb +9 -0
- data/test/test-argv/test-argv.ret +1 -0
- data/test/test-dollarzero.rb +26 -0
- data/test/test-dollarzero/test-dollarzero.rb +10 -0
- data/test/test-dollarzero/test-dollarzero.ret +2 -0
- data/test/test-dot.rb +26 -0
- data/test/test-dot/dot.dot.dot.rb +9 -0
- data/test/test-dot/dot.dot.rb +9 -0
- data/test/test-dot/test-dot.rb +13 -0
- data/test/test-dot/test-dot.ret +5 -0
- data/test/test-exitcode.rb +28 -0
- data/test/test-exitcode/test-exitcode.rb +9 -0
- data/test/test-kcode.rb +43 -0
- data/test/test-kcode/euc.rb +10 -0
- data/test/test-kcode/euc.ret +2 -0
- data/test/test-kcode/none.rb +10 -0
- data/test/test-kcode/none.ret +2 -0
- data/test/test-kcode/sjis.rb +10 -0
- data/test/test-kcode/sjis.ret +2 -0
- data/test/test-kcode/utf8.rb +10 -0
- data/test/test-kcode/utf8.ret +2 -0
- data/test/test-loadpath.rb +24 -0
- data/test/test-loadpath/test-loadpath.rb +9 -0
- data/test/test-nest.rb +18 -0
- data/test/test-nest/foo.rb +1 -0
- data/test/test-nest/foo/bar.rb +2 -0
- data/test/test-nest/foo/foo.rb +1 -0
- data/test/test-nest/test-nest.rb +1 -0
- data/test/test-nest/test-nest.ret +1 -0
- data/test/test-preload.rb +24 -0
- data/test/test-preload/test-preload.rb +9 -0
- data/test/test-regexp.rb +26 -0
- data/test/test-regexp/test-regexp.rb +23 -0
- data/test/test-regexp/test-regexp.ret +13 -0
- data/test/test-require1.rb +26 -0
- data/test/test-require1/require1.rb +9 -0
- data/test/test-require1/require2.rb +9 -0
- data/test/test-require1/require3.rb +9 -0
- data/test/test-require1/require4.rb +9 -0
- data/test/test-require1/require5.rb +9 -0
- data/test/test-require1/require6.rb +9 -0
- data/test/test-require1/test-require1.rb +41 -0
- data/test/test-require1/test-require1.ret +27 -0
- data/test/test-socket.rb +26 -0
- data/test/test-socket/test-socket.rb +7 -0
- data/test/test-socket/test-socket.ret +1 -0
- data/test/testcase.rb +66 -0
- data/vendor/mkexports.rb +167 -0
- metadata +352 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: resource_library.rb,v 1.7 2005/04/30 15:16:04 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/utility'
|
7
|
+
require "exerb/resource"
|
8
|
+
|
9
|
+
#==============================================================================#
|
10
|
+
|
11
|
+
module Exerb
|
12
|
+
end # Exerb
|
13
|
+
|
14
|
+
#==============================================================================#
|
15
|
+
|
16
|
+
class Exerb::ResourceLibrary
|
17
|
+
|
18
|
+
def initialize(rsrc)
|
19
|
+
@rsrc = rsrc
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_accessor :rsrc
|
23
|
+
|
24
|
+
def self.create
|
25
|
+
return self.new(Exerb::Resource.new)
|
26
|
+
end
|
27
|
+
|
28
|
+
def pack
|
29
|
+
rsrc = @rsrc.pack(0x00001000)
|
30
|
+
stab = Exerb::ResourceLibrary::Stab.new
|
31
|
+
|
32
|
+
size_of_rsrc_with_padding = Exerb::Utility.alignment4k(rsrc).size
|
33
|
+
size_of_stab_with_padding = Exerb::Utility.alignment4k(stab.pack).size
|
34
|
+
|
35
|
+
stab.time_date_stamp = Time.now.to_i
|
36
|
+
stab.size_of_initialized_data = size_of_rsrc_with_padding
|
37
|
+
stab.size_of_image = size_of_stab_with_padding + size_of_rsrc_with_padding
|
38
|
+
stab.rsrc_section_virtual_address = size_of_stab_with_padding
|
39
|
+
stab.rsrc_section_virtual_size = rsrc.size
|
40
|
+
stab.rsrc_section_raw_size = size_of_rsrc_with_padding
|
41
|
+
|
42
|
+
return Exerb::Utility.alignment4k(stab.pack) + Exerb::Utility.alignment4k(rsrc)
|
43
|
+
end
|
44
|
+
|
45
|
+
def write(out)
|
46
|
+
case out
|
47
|
+
when IO then out.write(self.pack)
|
48
|
+
when String then File.open(out, 'wb') { |file| self.write(file) }
|
49
|
+
else raise(ArgumentError, 'arg must be IO or String object')
|
50
|
+
end
|
51
|
+
return nil
|
52
|
+
end
|
53
|
+
|
54
|
+
end # Exerb::ResourceLibrary
|
55
|
+
|
56
|
+
#==============================================================================#
|
57
|
+
|
58
|
+
class Exerb::ResourceLibrary::Stab
|
59
|
+
|
60
|
+
BASE_BINARY =
|
61
|
+
"\x4D\x5A\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xFF\xFF\x00\x00" +
|
62
|
+
"\xB8\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00" +
|
63
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
64
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xB0\x00\x00\x00" +
|
65
|
+
"\x0E\x1F\xBA\x0E\x00\xB4\x09\xCD\x21\xB8\x01\x4C\xCD\x21\x54\x68" +
|
66
|
+
"\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x20\x63\x61\x6E\x6E\x6F" +
|
67
|
+
"\x74\x20\x62\x65\x20\x72\x75\x6E\x20\x69\x6E\x20\x44\x4F\x53\x20" +
|
68
|
+
"\x6D\x6F\x64\x65\x2E\x0D\x0D\x0A\x24\x00\x00\x00\x00\x00\x00\x00" +
|
69
|
+
"\xEB\x20\x35\xDB\xAF\x41\x5B\x88\xAF\x41\x5B\x88\xAF\x41\x5B\x88" +
|
70
|
+
"\x68\x47\x5D\x88\xAE\x41\x5B\x88\x52\x69\x63\x68\xAF\x41\x5B\x88" +
|
71
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
72
|
+
"\x50\x45\x00\x00\x4C\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
73
|
+
"\x00\x00\x00\x00\xE0\x00\x0F\x21\x0B\x01\x06\x00\x00\x00\x00\x00" +
|
74
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00" +
|
75
|
+
"\x00\x10\x00\x00\x00\x00\x00\x10\x00\x10\x00\x00\x00\x10\x00\x00" +
|
76
|
+
"\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00" +
|
77
|
+
"\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00" +
|
78
|
+
"\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x10\x00\x00\x10\x00\x00" +
|
79
|
+
"\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
80
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
81
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
82
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
83
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
84
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
85
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
86
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +
|
87
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x2E\x72\x73\x72\x63\x00\x00\x00" +
|
88
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00" +
|
89
|
+
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x40"
|
90
|
+
|
91
|
+
def initialize
|
92
|
+
@time_date_stamp = 0
|
93
|
+
@size_of_initialized_data = 0
|
94
|
+
@size_of_image = 0
|
95
|
+
@rsrc_section_virtual_address = 0
|
96
|
+
@rsrc_section_virtual_size = 0
|
97
|
+
@rsrc_section_raw_size = 0
|
98
|
+
end
|
99
|
+
|
100
|
+
attr_accessor :time_date_stamp, :size_of_initialized_data, :size_of_image, :rsrc_section_virtual_address, :rsrc_section_virtual_size, :rsrc_section_raw_size
|
101
|
+
|
102
|
+
def pack
|
103
|
+
binary = BASE_BINARY.dup
|
104
|
+
|
105
|
+
binary[0x00B8, 4] = [@time_date_stamp].pack('L')
|
106
|
+
binary[0x00D0, 4] = [@size_of_initialized_data].pack('L')
|
107
|
+
binary[0x0100, 4] = [@size_of_image].pack('L')
|
108
|
+
binary[0x0138, 4] = [@rsrc_section_virtual_address].pack('L')
|
109
|
+
binary[0x013C, 4] = [@rsrc_section_virtual_size].pack('L')
|
110
|
+
binary[0x01B0, 4] = [@rsrc_section_virtual_size].pack('L')
|
111
|
+
binary[0x01B4, 4] = [@rsrc_section_virtual_address].pack('L')
|
112
|
+
binary[0x01B8, 4] = [@rsrc_section_raw_size].pack('L')
|
113
|
+
|
114
|
+
return binary
|
115
|
+
end
|
116
|
+
|
117
|
+
end # Exerb::ResourceLibrary::Stab
|
118
|
+
|
119
|
+
#==============================================================================#
|
120
|
+
#==============================================================================#
|
@@ -0,0 +1,95 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: utility.rb,v 1.15 2005/05/03 13:47:01 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
module Exerb
|
7
|
+
end # Exerb
|
8
|
+
|
9
|
+
#==============================================================================#
|
10
|
+
|
11
|
+
module Exerb::Utility
|
12
|
+
|
13
|
+
def self.align_value(value, align)
|
14
|
+
if value % align == 0
|
15
|
+
return value
|
16
|
+
else
|
17
|
+
return value + (align - (value % align))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.alignment(bin, align)
|
22
|
+
if bin.size % align == 0
|
23
|
+
return bin
|
24
|
+
else
|
25
|
+
return bin + "\0" * (align - (bin.size % align))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.alignment16(bin)
|
30
|
+
return alignment(bin, 16)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.alignment4k(bin)
|
34
|
+
return alignment(bin, 1024 * 4)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.find_file_by_filename(filename, path)
|
38
|
+
return filename if File.expand_path(filename) == filename && File.exist?(filename)
|
39
|
+
return path.collect { |dir| File.join(dir, filename) }.find { |filepath| File.exist?(filepath) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.find_file_by_name(name, table, path)
|
43
|
+
return nil unless table.has_key?(name)
|
44
|
+
return self.find_file_by_filename(table[name], path)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.find_core_by_filepath(filepath)
|
48
|
+
return (File.exist?(filepath) ? filepath : nil)
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.find_core_by_filename(filename)
|
52
|
+
require 'exerb/config'
|
53
|
+
return self.find_file_by_filename(filename, Exerb::CORE_PATH)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.find_core_by_name(name, error = false)
|
57
|
+
require 'exerb/config'
|
58
|
+
path = self.find_file_by_name(name, Exerb::CORE_NAME, Exerb::CORE_PATH)
|
59
|
+
raise(Exerb::ExerbError, "unknown core name -- #{name}") if path.nil? && error
|
60
|
+
return path
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.read(input)
|
64
|
+
case input
|
65
|
+
when IO
|
66
|
+
input.binmode
|
67
|
+
return input.read
|
68
|
+
when String
|
69
|
+
return File.open(input, "rb") { |file| self.read(file) }
|
70
|
+
else raise(ArgumentError, "input must be IO or String object")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.write(output, binary, mode = nil)
|
75
|
+
case output
|
76
|
+
when IO
|
77
|
+
output.binmode
|
78
|
+
output.write(binary)
|
79
|
+
when String
|
80
|
+
File.open(output, "wb") { |file| self.write(file, binary) }
|
81
|
+
File.chmod(mode, output) if mode
|
82
|
+
else raise(ArgumentError, "output must be IO or String object")
|
83
|
+
end
|
84
|
+
return nil
|
85
|
+
end
|
86
|
+
|
87
|
+
end # Exerb::Utility
|
88
|
+
|
89
|
+
#==============================================================================#
|
90
|
+
|
91
|
+
if $0 == __FILE__
|
92
|
+
end
|
93
|
+
|
94
|
+
#==============================================================================#
|
95
|
+
#==============================================================================#
|
@@ -0,0 +1,122 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: utility2.rb,v 1.2 2005/04/17 15:17:26 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
module Exerb
|
7
|
+
end # Exerb
|
8
|
+
|
9
|
+
#==============================================================================#
|
10
|
+
|
11
|
+
module Exerb::Utility2
|
12
|
+
|
13
|
+
def self.loaded_features(reject_list = [])
|
14
|
+
reject_list << File.expand_path(__FILE__)
|
15
|
+
|
16
|
+
__LOADED_FEATURES = $LOADED_FEATURES.clone # Don't change $LOADED_FEATURES
|
17
|
+
if RUBY_VERSION >= "1.9.3"
|
18
|
+
['enc/encdb.so', 'enc/utf_16le.so',
|
19
|
+
'enc/trans/transdb.so', 'enc/trans/utf_16_32.so',
|
20
|
+
'enc/trans/single_byte.so'].each do |enc|
|
21
|
+
|
22
|
+
unless __LOADED_FEATURES.find { |f| f.include?(enc) }
|
23
|
+
__LOADED_FEATURES << enc
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
features = __LOADED_FEATURES.collect { |filename|
|
29
|
+
case filename.downcase
|
30
|
+
when /\.rb$/o then type = "script"
|
31
|
+
when /\.so$/o then type = "extension-library"
|
32
|
+
when /\.dll$/o then type = "extension-library"
|
33
|
+
end
|
34
|
+
[type, filename]
|
35
|
+
}.collect { |type, filename|
|
36
|
+
if File.exist?(filename)
|
37
|
+
[type, require_name(filename), filename]
|
38
|
+
else
|
39
|
+
$LOAD_PATH.collect { |dirpath|
|
40
|
+
[type, filename, File.join(dirpath, filename)]
|
41
|
+
}.find { |type, filename, filepath|
|
42
|
+
File.exist?(filepath)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
}.compact.reject { |type, filename, filepath|
|
46
|
+
type.nil?
|
47
|
+
}.reject { |type, filename, filepath|
|
48
|
+
reject_list.index(File.expand_path(filepath))
|
49
|
+
}
|
50
|
+
|
51
|
+
detected_libraries.each do |path|
|
52
|
+
dll = ["extension-library", File.basename(path).downcase, path]
|
53
|
+
features << dll
|
54
|
+
end
|
55
|
+
|
56
|
+
return features
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.require_name(filename)
|
60
|
+
# FIXED BUG, if relative path in $LOAD_PATH. like '.', '..', ..
|
61
|
+
path = $LOAD_PATH.find { |path| File.dirname(filename) == File.expand_path(path) }
|
62
|
+
path = $LOAD_PATH.find { |path| filename.start_with?(File.expand_path(path)) } if !path
|
63
|
+
if path
|
64
|
+
# remove both the path and the platform from the filename
|
65
|
+
return filename.gsub("#{File.expand_path(path)}/", "").gsub("#{RUBY_PLATFORM}/", "")
|
66
|
+
end
|
67
|
+
|
68
|
+
filename
|
69
|
+
end
|
70
|
+
|
71
|
+
# Code copied and adapted from Ocra project
|
72
|
+
# http://ocra.rubyforge.org/
|
73
|
+
def self.loaded_libraries
|
74
|
+
require "Win32API"
|
75
|
+
|
76
|
+
enumprocessmodules = Win32API.new('psapi', 'EnumProcessModules', ['L','P','L','P'], 'L')
|
77
|
+
getmodulefilename = Win32API.new('kernel32', 'GetModuleFileName', ['L','P','L'], 'L')
|
78
|
+
getcurrentprocess = Win32API.new('kernel32', 'GetCurrentProcess', [], 'L')
|
79
|
+
|
80
|
+
bytes_needed = 4 * 32
|
81
|
+
module_handle_buffer = nil
|
82
|
+
process_handle = getcurrentprocess.call
|
83
|
+
|
84
|
+
loop do
|
85
|
+
module_handle_buffer = "\x00" * bytes_needed
|
86
|
+
bytes_needed_buffer = [0].pack("I")
|
87
|
+
|
88
|
+
r = enumprocessmodules.call(process_handle, module_handle_buffer,
|
89
|
+
module_handle_buffer.size, bytes_needed_buffer)
|
90
|
+
|
91
|
+
bytes_needed = bytes_needed_buffer.unpack("I")[0]
|
92
|
+
break if bytes_needed <= module_handle_buffer.size
|
93
|
+
end
|
94
|
+
|
95
|
+
handles = module_handle_buffer.unpack("I*")
|
96
|
+
handles.select { |handle| handle > 0 }.map do |handle|
|
97
|
+
str = "\x00" * 256
|
98
|
+
modulefilename_length = getmodulefilename.call(handle, str, str.size)
|
99
|
+
File.expand_path str[0, modulefilename_length]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.detected_libraries
|
104
|
+
require "rbconfig"
|
105
|
+
|
106
|
+
exec_prefix = RbConfig::CONFIG["exec_prefix"]
|
107
|
+
libruby_so = RbConfig::CONFIG["LIBRUBY_SO"]
|
108
|
+
loaded = loaded_libraries
|
109
|
+
|
110
|
+
detected = loaded.select { |path|
|
111
|
+
normalized = path.downcase
|
112
|
+
path.include?(exec_prefix) &&
|
113
|
+
File.extname(normalized) == ".dll" &&
|
114
|
+
File.basename(normalized) != libruby_so
|
115
|
+
}
|
116
|
+
|
117
|
+
return detected
|
118
|
+
end
|
119
|
+
end # Exerb::Utility2
|
120
|
+
|
121
|
+
#==============================================================================#
|
122
|
+
#==============================================================================#
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: version.rb,v 1.44 2010/12/26 00:03:43 arton Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
module Exerb
|
7
|
+
|
8
|
+
VERSION = '6.0.1'
|
9
|
+
|
10
|
+
end # Exerb
|
11
|
+
|
12
|
+
#==============================================================================#
|
13
|
+
#==============================================================================#
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: resource.rb,v 1.4 2005/04/17 15:56:25 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
module Exerb
|
7
|
+
module Win32
|
8
|
+
end # Win32
|
9
|
+
end # Exerb
|
10
|
+
|
11
|
+
#==============================================================================#
|
12
|
+
|
13
|
+
module Exerb::Win32::Const
|
14
|
+
|
15
|
+
IMAGE_RESOURCE_NAME_IS_STRING = 0x80000000
|
16
|
+
IMAGE_RESOURCE_DATA_IS_DIRECTORY = 0x80000000
|
17
|
+
|
18
|
+
RT_CURSOR = 1
|
19
|
+
RT_BITMAP = 2
|
20
|
+
RT_ICON = 3
|
21
|
+
RT_MENU = 4
|
22
|
+
RT_DIALOG = 5
|
23
|
+
RT_STRING = 6
|
24
|
+
RT_FONTDIR = 7
|
25
|
+
RT_FONT = 8
|
26
|
+
RT_ACCELERATOR = 9
|
27
|
+
RT_RCDATA = 10
|
28
|
+
RT_MESSAGETABLE = 11
|
29
|
+
RT_GROUP_CURSOR = 12
|
30
|
+
RT_GROUP_ICON = 14
|
31
|
+
RT_NAMETABLE = 15
|
32
|
+
RT_VERSION = 16
|
33
|
+
RT_DLGINCLUDE = 17
|
34
|
+
RT_PLUGPLAY = 19
|
35
|
+
RT_VXD = 20
|
36
|
+
RT_ANICURSOR = 21
|
37
|
+
RT_ANIICON = 22
|
38
|
+
RT_HTML = 23
|
39
|
+
|
40
|
+
VS_FFI_SIGNATURE = 0xFEEF04BD
|
41
|
+
VS_FFI_STRUCVERSION = 0x00010000
|
42
|
+
VS_FFI_FILEFLAGSMASK = 0x0000003F
|
43
|
+
VOS_NT_WINDOWS32 = 0x00040004
|
44
|
+
VFT_APP = 0x00000001
|
45
|
+
VFT_DLL = 0x00000002
|
46
|
+
VFT2_UNKNOWN = 0x00000000
|
47
|
+
|
48
|
+
end # Exerb::Win32::Const
|
49
|
+
|
50
|
+
#==============================================================================#
|
51
|
+
#==============================================================================#
|
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: icon_file.rb,v 1.5 2010/06/26 03:13:36 arton Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/win32/struct/icon_header'
|
7
|
+
require 'exerb/win32/struct/icon_dir_entry'
|
8
|
+
|
9
|
+
#==============================================================================#
|
10
|
+
|
11
|
+
module Exerb
|
12
|
+
module Win32
|
13
|
+
end # Win32
|
14
|
+
end # Exerb
|
15
|
+
|
16
|
+
#==============================================================================#
|
17
|
+
|
18
|
+
class Exerb::Win32::IconFile
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@entries = []
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_accessor :entries
|
25
|
+
|
26
|
+
def self.read(input)
|
27
|
+
case input
|
28
|
+
when IO then return self.new.read(input)
|
29
|
+
when String then return File.open(input, 'rb') { |file| self.read(file) }
|
30
|
+
else raise(ArgumentError, "input must be IO or String object")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def read(io)
|
35
|
+
base = io.pos
|
36
|
+
icon_header = Exerb::Win32::Struct::IconHeader.read(io)
|
37
|
+
|
38
|
+
@entries = (1..icon_header.count).collect {
|
39
|
+
Exerb::Win32::Struct::IconDirEntry.read(io)
|
40
|
+
}.collect { |icon_dir_entry|
|
41
|
+
io.seek(base + icon_dir_entry.image_offset)
|
42
|
+
icon_image_header = Exerb::Win32::Struct::IconImageHeader.read(io)
|
43
|
+
io.seek(icon_image_header.position)
|
44
|
+
|
45
|
+
entry = Exerb::Win32::IconFile::Entry.new
|
46
|
+
entry.width = icon_dir_entry.width
|
47
|
+
entry.height = icon_dir_entry.height
|
48
|
+
entry.bit_count = icon_image_header.bit_count
|
49
|
+
entry.value = io.read(icon_dir_entry.bytes_in_res)
|
50
|
+
if entry.width == 0
|
51
|
+
entry.bit_count = icon_dir_entry.bit_count
|
52
|
+
entry.width = entry.height = 256
|
53
|
+
end
|
54
|
+
entry
|
55
|
+
}
|
56
|
+
|
57
|
+
return self
|
58
|
+
end
|
59
|
+
|
60
|
+
end # Exerb::Win32::IconFile
|
61
|
+
|
62
|
+
#==============================================================================#
|
63
|
+
|
64
|
+
class Exerb::Win32::IconFile::Entry
|
65
|
+
|
66
|
+
def initialize
|
67
|
+
@width = nil
|
68
|
+
@height = nil
|
69
|
+
@bit_count = nil
|
70
|
+
@value = nil
|
71
|
+
end
|
72
|
+
|
73
|
+
attr_accessor :width, :height, :bit_count, :value
|
74
|
+
|
75
|
+
end # Exerb::Win32::IconFile::Entry
|
76
|
+
|
77
|
+
#==============================================================================#
|
78
|
+
#==============================================================================#
|