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,190 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: resource.rb,v 1.30 2005/05/05 02:45:41 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'stringio'
|
7
|
+
require 'exerb/error'
|
8
|
+
require 'exerb/win32/resource_directory'
|
9
|
+
require 'exerb/win32/resource_directory_root'
|
10
|
+
require 'exerb/win32/resource_entry'
|
11
|
+
require 'exerb/win32/pe_file'
|
12
|
+
require 'exerb/win32/const/resource'
|
13
|
+
require 'exerb/resource/icon'
|
14
|
+
require 'exerb/resource/group_icon'
|
15
|
+
require 'exerb/resource/version_info'
|
16
|
+
require 'exerb/resource/dialog'
|
17
|
+
require 'exerb/resource/binary'
|
18
|
+
|
19
|
+
#==============================================================================#
|
20
|
+
|
21
|
+
module Exerb
|
22
|
+
end # Exerb
|
23
|
+
|
24
|
+
#==============================================================================#
|
25
|
+
|
26
|
+
class Exerb::Resource
|
27
|
+
|
28
|
+
include Enumerable
|
29
|
+
|
30
|
+
DEFAULT_LANG_ID = 0x0400 # Neutral
|
31
|
+
RT_EXERB = 100
|
32
|
+
ID_EXERB = 1
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
@entries = {}
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :entries
|
39
|
+
|
40
|
+
def self.read(io, base)
|
41
|
+
return self.new.read(io, base)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.new_from_binary(bin, base)
|
45
|
+
return self.read(StringIO.new(bin), base)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.new_from_pe_binary(bin)
|
49
|
+
pe = Exerb::Win32::PeFile.new_from_binary(bin)
|
50
|
+
rsrc = pe.sections.find { |sec| sec.name == '.rsrc' }
|
51
|
+
raise(ExerbError, "a resource section was not found in the core") if rsrc.nil?
|
52
|
+
|
53
|
+
return self.new_from_binary(bin[rsrc.pointer_to_raw_data, rsrc.virtual_size], rsrc.virtual_address)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.new_from_pe_file(filepath)
|
57
|
+
return File.open(filepath) { |file| self.new_from_pe_binary(file.read) }
|
58
|
+
end
|
59
|
+
|
60
|
+
def each
|
61
|
+
@entries.keys.sort.each { |type|
|
62
|
+
@entries[type].keys.sort.each { |id|
|
63
|
+
@entries[type][id].keys.sort.each { |lang|
|
64
|
+
yield(@entries[type][id][lang])
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def add(type, id, data, lang = DEFAULT_LANG_ID)
|
71
|
+
@entries[type] ||= {}
|
72
|
+
@entries[type][id] ||= {}
|
73
|
+
@entries[type][id][lang] = Exerb::Resource::Entry.new(type, id, lang, data)
|
74
|
+
|
75
|
+
return self
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_icon(id, data, lang = DEFAULT_LANG_ID)
|
79
|
+
return self.add(Exerb::Win32::Const::RT_ICON, id, data, lang)
|
80
|
+
end
|
81
|
+
|
82
|
+
def add_group_icon(id, data, lang = DEFAULT_LANG_ID)
|
83
|
+
return self.add(Exerb::Win32::Const::RT_GROUP_ICON, id, data, lang)
|
84
|
+
end
|
85
|
+
|
86
|
+
def add_dialog(id, data, lang = DEFAULT_LANG_ID)
|
87
|
+
return self.add(Exerb::Win32::Const::RT_DIALOG, id, data, lang)
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_version(id, data, lang = DEFAULT_LANG_ID)
|
91
|
+
return self.add(Exerb::Win32::Const::RT_VERSION, id, data, lang)
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_archive(archive)
|
95
|
+
return self.add(Exerb::Resource::RT_EXERB, Exerb::Resource::ID_EXERB, archive)
|
96
|
+
end
|
97
|
+
|
98
|
+
def pack(base, reloc = [])
|
99
|
+
root_dir = Exerb::Win32::ResourceDirectoryRoot.new
|
100
|
+
|
101
|
+
@entries.keys.sort.each { |type|
|
102
|
+
root_dir << Exerb::Win32::ResourceDirectory.new(type) { |type_dir|
|
103
|
+
@entries[type].keys.sort.each { |id|
|
104
|
+
type_dir << Exerb::Win32::ResourceDirectory.new(id) { |item_dir|
|
105
|
+
@entries[type][id].keys.sort.each { |lang|
|
106
|
+
item_dir << @entries[type][id][lang].to_resource_entry
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
return root_dir.pack_all(base, reloc)
|
114
|
+
end
|
115
|
+
|
116
|
+
def read(io, base)
|
117
|
+
root_dir = Exerb::Win32::ResourceDirectoryRoot.read(io, base)
|
118
|
+
root_dir.entries.each { |type_dir|
|
119
|
+
type_dir.entries.each { |item_dir|
|
120
|
+
item_dir.entries.each { |item|
|
121
|
+
type, id, lang = type_dir.name, item_dir.name, item.lang
|
122
|
+
@entries[type] ||= {}
|
123
|
+
@entries[type][id] ||= {}
|
124
|
+
@entries[type][id][lang] = Exerb::Resource::Entry.new(type, id, lang, Exerb::Resource::Binary.new(item.entry_data.data))
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
return self
|
130
|
+
end
|
131
|
+
|
132
|
+
def remove(type, id = nil, lang = nil)
|
133
|
+
if type && id && lang
|
134
|
+
if @entries[type] && @entries[type][id] && @entries[type][id][lang]
|
135
|
+
@entries[type][id].delete(lang)
|
136
|
+
end
|
137
|
+
elsif type && id
|
138
|
+
if @entries[type] && @entries[type][id]
|
139
|
+
@entries[type].delete(id)
|
140
|
+
end
|
141
|
+
elsif type
|
142
|
+
if @entries[type]
|
143
|
+
@entries.delete(type)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
if type && id && @entries[type] && @entries[type][id] && @entries[type][id].empty?
|
148
|
+
@entries[type].delete(id)
|
149
|
+
end
|
150
|
+
|
151
|
+
if type && @entries[type] && @entries[type].empty?
|
152
|
+
@entries.delete(type)
|
153
|
+
end
|
154
|
+
|
155
|
+
return self
|
156
|
+
end
|
157
|
+
|
158
|
+
def merge(res)
|
159
|
+
res.each { |entry|
|
160
|
+
@entries[entry.type] ||= {}
|
161
|
+
@entries[entry.type][entry.id] ||= {}
|
162
|
+
@entries[entry.type][entry.id][entry.lang] = entry
|
163
|
+
}
|
164
|
+
|
165
|
+
return self
|
166
|
+
end
|
167
|
+
|
168
|
+
end # Exerb::Resource
|
169
|
+
|
170
|
+
#==============================================================================#
|
171
|
+
|
172
|
+
class Exerb::Resource::Entry
|
173
|
+
|
174
|
+
def initialize(type, id, lang, data)
|
175
|
+
@type = type
|
176
|
+
@id = id
|
177
|
+
@lang = lang
|
178
|
+
@data = data
|
179
|
+
end
|
180
|
+
|
181
|
+
attr_accessor :type, :id, :lang, :data
|
182
|
+
|
183
|
+
def to_resource_entry
|
184
|
+
return Exerb::Win32::ResourceEntry.new(@data.pack, lang)
|
185
|
+
end
|
186
|
+
|
187
|
+
end # Exerb::Resource::Entry
|
188
|
+
|
189
|
+
#==============================================================================#
|
190
|
+
#==============================================================================#
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: base.rb,v 1.2 2005/04/30 15:16:04 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
module Exerb
|
7
|
+
class Resource
|
8
|
+
end # Resource
|
9
|
+
end # Exerb
|
10
|
+
|
11
|
+
#==============================================================================#
|
12
|
+
|
13
|
+
class Exerb::Resource::Base
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
end
|
17
|
+
|
18
|
+
def pack
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
21
|
+
|
22
|
+
def size
|
23
|
+
return self.pack.size
|
24
|
+
end
|
25
|
+
|
26
|
+
end # Exerb::Resource::Base
|
27
|
+
|
28
|
+
#==============================================================================#
|
29
|
+
#==============================================================================#
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: binary.rb,v 1.2 2005/04/30 15:37:02 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/resource/base'
|
7
|
+
|
8
|
+
#==============================================================================#
|
9
|
+
|
10
|
+
module Exerb
|
11
|
+
class Resource
|
12
|
+
end # Resource
|
13
|
+
end # Exerb
|
14
|
+
|
15
|
+
#==============================================================================#
|
16
|
+
|
17
|
+
class Exerb::Resource::Binary < Exerb::Resource::Base
|
18
|
+
|
19
|
+
def initialize(bin)
|
20
|
+
super()
|
21
|
+
@bin = bin
|
22
|
+
end
|
23
|
+
|
24
|
+
def pack
|
25
|
+
return @bin
|
26
|
+
end
|
27
|
+
|
28
|
+
end # Exerb::Resource::Binary
|
29
|
+
|
30
|
+
#==============================================================================#
|
31
|
+
#==============================================================================#
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: dialog.rb,v 1.4 2005/04/30 15:37:02 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/resource/base'
|
7
|
+
|
8
|
+
#==============================================================================#
|
9
|
+
|
10
|
+
module Exerb
|
11
|
+
class Resource
|
12
|
+
end # Resource
|
13
|
+
end # Exerb
|
14
|
+
|
15
|
+
#==============================================================================#
|
16
|
+
|
17
|
+
class Exerb::Resource::Dialog < Exerb::Resource::Base
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
super()
|
21
|
+
end
|
22
|
+
|
23
|
+
def pack
|
24
|
+
raise(NotImplementedError)
|
25
|
+
end
|
26
|
+
|
27
|
+
end # Exerb::Resource::Dialog
|
28
|
+
|
29
|
+
#==============================================================================#
|
30
|
+
#==============================================================================#
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: group_icon.rb,v 1.9 2010/06/26 03:13:36 arton Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/win32/struct/icon_header'
|
7
|
+
require 'exerb/win32/struct/icon_res_entry'
|
8
|
+
require 'exerb/resource/base'
|
9
|
+
|
10
|
+
#==============================================================================#
|
11
|
+
|
12
|
+
module Exerb
|
13
|
+
class Resource
|
14
|
+
end # Resource
|
15
|
+
end # Exerb
|
16
|
+
|
17
|
+
#==============================================================================#
|
18
|
+
|
19
|
+
class Exerb::Resource::GroupIcon < Exerb::Resource::Base
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super()
|
23
|
+
@entries = []
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :entries
|
27
|
+
|
28
|
+
def add(id, icon)
|
29
|
+
@entries << Entry.new(id, icon.width, icon.height, icon.bit_count, icon.size)
|
30
|
+
return self
|
31
|
+
end
|
32
|
+
|
33
|
+
def pack
|
34
|
+
header = Exerb::Win32::Struct::IconHeader.new
|
35
|
+
header.reserved = 0
|
36
|
+
header.type = 1
|
37
|
+
header.count = @entries.size
|
38
|
+
|
39
|
+
packed_header = header.pack
|
40
|
+
packed_entries = @entries.collect { |entry| entry.pack }.join
|
41
|
+
|
42
|
+
return packed_header + packed_entries
|
43
|
+
end
|
44
|
+
|
45
|
+
class Entry
|
46
|
+
|
47
|
+
def initialize(id, width, height, bit_count, size)
|
48
|
+
@id = id
|
49
|
+
@widht = width
|
50
|
+
@height = height
|
51
|
+
@bit_count = bit_count
|
52
|
+
@size = size
|
53
|
+
end
|
54
|
+
|
55
|
+
attr_accessor :id, :width, :height, :bit_count, :size
|
56
|
+
|
57
|
+
def pack
|
58
|
+
case @bit_count
|
59
|
+
when 1 then cc, bc = 2, 1
|
60
|
+
when 4 then cc, bc = 16, 4
|
61
|
+
when 8 then cc, bc = 0, 8
|
62
|
+
when 24 then cc, bc = 0, 24
|
63
|
+
when 32 then cc, bc = 0, 32
|
64
|
+
else raise "invalid bit count -- #{@bit_count}"
|
65
|
+
end
|
66
|
+
|
67
|
+
icon_dir_entry = Exerb::Win32::Struct::IconResEntry.new
|
68
|
+
icon_dir_entry.width = @widht
|
69
|
+
icon_dir_entry.height = @height
|
70
|
+
icon_dir_entry.color_count = cc
|
71
|
+
icon_dir_entry.reserved = 0
|
72
|
+
icon_dir_entry.planes = 1
|
73
|
+
icon_dir_entry.bit_count = bc
|
74
|
+
icon_dir_entry.bytes_in_res = @size
|
75
|
+
icon_dir_entry.image_offset = @id
|
76
|
+
|
77
|
+
return icon_dir_entry.pack
|
78
|
+
end
|
79
|
+
|
80
|
+
end # Entry
|
81
|
+
|
82
|
+
end # Exerb::Resource::GroupIcon
|
83
|
+
|
84
|
+
#==============================================================================#
|
85
|
+
#==============================================================================#
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: icon.rb,v 1.6 2005/05/05 02:26:29 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/error'
|
7
|
+
require 'exerb/win32/icon_file'
|
8
|
+
require 'exerb/resource/base'
|
9
|
+
|
10
|
+
#==============================================================================#
|
11
|
+
|
12
|
+
module Exerb
|
13
|
+
class Resource
|
14
|
+
end # Resource
|
15
|
+
end # Exerb
|
16
|
+
|
17
|
+
#==============================================================================#
|
18
|
+
|
19
|
+
class Exerb::Resource::Icon < Exerb::Resource::Base
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super()
|
23
|
+
@width = nil
|
24
|
+
@height = nil
|
25
|
+
@bit_count = nil
|
26
|
+
@value = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_accessor :width, :height, :bit_count, :value
|
30
|
+
|
31
|
+
def self.read(input, width, height, bit_count)
|
32
|
+
icon_file = Exerb::Win32::IconFile.read(input)
|
33
|
+
icon_entry = icon_file.entries.find { |entry| entry.width == width && entry.height == height && entry.bit_count == bit_count }
|
34
|
+
raise(Exerb::ExerbError, "no such icon #{width}x#{height}x#{bit_count} in #{input}") unless icon_entry
|
35
|
+
|
36
|
+
icon = self.new
|
37
|
+
icon.width = icon_entry.width
|
38
|
+
icon.height = icon_entry.height
|
39
|
+
icon.bit_count = icon_entry.bit_count
|
40
|
+
icon.value = icon_entry.value
|
41
|
+
|
42
|
+
return icon
|
43
|
+
end
|
44
|
+
|
45
|
+
def pack
|
46
|
+
return @value
|
47
|
+
end
|
48
|
+
|
49
|
+
end # Exerb::Resource::Icon
|
50
|
+
|
51
|
+
#==============================================================================#
|
52
|
+
#==============================================================================#
|
@@ -0,0 +1,155 @@
|
|
1
|
+
|
2
|
+
#==============================================================================#
|
3
|
+
# $Id: version_info.rb,v 1.15 2006/06/02 00:47:54 yuya Exp $
|
4
|
+
#==============================================================================#
|
5
|
+
|
6
|
+
require 'exerb/utility'
|
7
|
+
require 'exerb/resource/base'
|
8
|
+
require 'exerb/win32/const/resource'
|
9
|
+
require 'exerb/win32/struct/vs_fixed_file_info'
|
10
|
+
require 'exerb/win32/struct/version_info_block'
|
11
|
+
|
12
|
+
#==============================================================================#
|
13
|
+
|
14
|
+
module Exerb
|
15
|
+
class Resource
|
16
|
+
end # Resource
|
17
|
+
end # Exerb
|
18
|
+
|
19
|
+
#==============================================================================#
|
20
|
+
|
21
|
+
class Exerb::Resource::VersionInfo < Exerb::Resource::Base
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@file_version_number = 0
|
25
|
+
@product_version_number = 0
|
26
|
+
@comments = ""
|
27
|
+
@company_name = ""
|
28
|
+
@legal_copyright = ""
|
29
|
+
@legal_trademarks = ""
|
30
|
+
@file_version = ""
|
31
|
+
@product_version = ""
|
32
|
+
@product_name = ""
|
33
|
+
@file_description = ""
|
34
|
+
@internal_name = ""
|
35
|
+
@original_filename = ""
|
36
|
+
@private_build = ""
|
37
|
+
@special_build = ""
|
38
|
+
|
39
|
+
@is_dll = false
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_accessor :file_version_number, :product_version_number, :comments, :company_name, :legal_copyright, :legal_trademarks, :file_version, :product_version, :product_name, :file_description, :internal_name, :original_filename, :private_build, :special_build, :is_dll
|
43
|
+
|
44
|
+
def self.make_version(n1, n2, n3, n4)
|
45
|
+
version = (n1 & 0xFFFF) << 48
|
46
|
+
version |= (n2 & 0xFFFF) << 32
|
47
|
+
version |= (n3 & 0xFFFF) << 16
|
48
|
+
version |= (n4 & 0xFFFF)
|
49
|
+
|
50
|
+
return version
|
51
|
+
end
|
52
|
+
|
53
|
+
def pack
|
54
|
+
vsffi = Exerb::Win32::Struct::VsFixedFileInfo.new
|
55
|
+
vsffi.signature = Exerb::Win32::Const::VS_FFI_SIGNATURE
|
56
|
+
vsffi.struct_version = Exerb::Win32::Const::VS_FFI_STRUCVERSION
|
57
|
+
vsffi.file_version_ms = @file_version_number >> 32
|
58
|
+
vsffi.file_version_ls = @file_version_number & 0xFFFFFFFF
|
59
|
+
vsffi.product_version_ms = @product_version_number >> 32
|
60
|
+
vsffi.product_version_ls = @product_version_number & 0xFFFFFFFF
|
61
|
+
vsffi.file_flags_mask = Exerb::Win32::Const::VS_FFI_FILEFLAGSMASK
|
62
|
+
vsffi.file_flags = 0x00000000
|
63
|
+
vsffi.file_os = Exerb::Win32::Const::VOS_NT_WINDOWS32
|
64
|
+
vsffi.file_type = (@is_dll ? Exerb::Win32::Const::VFT_DLL : Exerb::Win32::Const::VFT_APP)
|
65
|
+
vsffi.file_subtype = Exerb::Win32::Const::VFT2_UNKNOWN
|
66
|
+
vsffi.file_date_ms = 0x00000000
|
67
|
+
vsffi.file_date_ls = 0x00000000
|
68
|
+
|
69
|
+
block = BlockType0.new('VS_VERSION_INFO', vsffi.pack) { |vvi|
|
70
|
+
vvi << BlockType1.new('StringFileInfo') { |sfi|
|
71
|
+
# Language:Neutral CodePage:Unicode
|
72
|
+
sfi << BlockType1.new('000004b0') { |neutral|
|
73
|
+
neutral << BlockType1String.new('Comments', @comments)
|
74
|
+
neutral << BlockType1String.new('CompanyName', @company_name)
|
75
|
+
neutral << BlockType1String.new('LegalCopyright', @legal_copyright)
|
76
|
+
neutral << BlockType1String.new('LegalTrademarks', @legal_trademarks)
|
77
|
+
neutral << BlockType1String.new('FileVersion', @file_version)
|
78
|
+
neutral << BlockType1String.new('ProductVersion', @product_version)
|
79
|
+
neutral << BlockType1String.new('ProductName', @product_name)
|
80
|
+
neutral << BlockType1String.new('FileDescription', @file_description)
|
81
|
+
neutral << BlockType1String.new('InternalName', @internal_name)
|
82
|
+
neutral << BlockType1String.new('OriginalFilename', @original_filename)
|
83
|
+
neutral << BlockType1String.new('PrivateBuild', @private_build)
|
84
|
+
neutral << BlockType1String.new('SpecialBuild', @special_build)
|
85
|
+
}
|
86
|
+
}
|
87
|
+
vvi << BlockType1.new('VarFileInfo') { |vfi|
|
88
|
+
vfi << BlockType0.new('Translation', [0x04B00000].pack('L'))
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
return block.pack
|
93
|
+
end
|
94
|
+
|
95
|
+
class BlockBase
|
96
|
+
|
97
|
+
def initialize(type, key, value = '', unicode = false)
|
98
|
+
@type = type
|
99
|
+
@key = key
|
100
|
+
@value = value
|
101
|
+
@unicode = unicode
|
102
|
+
@children = []
|
103
|
+
|
104
|
+
yield(self) if block_given?
|
105
|
+
end
|
106
|
+
|
107
|
+
attr_accessor :type, :key, :value, :unicode, :children
|
108
|
+
|
109
|
+
def <<(child)
|
110
|
+
@children << child
|
111
|
+
end
|
112
|
+
|
113
|
+
def pack
|
114
|
+
packed_children = @children.collect { |child| child.pack }.join
|
115
|
+
|
116
|
+
block = Exerb::Win32::Struct::VersionInfoBlock.new
|
117
|
+
block.type = @type
|
118
|
+
block.key = @key.unpack("U*").pack("v*") # UTF-8 to UTF-16LE
|
119
|
+
block.data = @value
|
120
|
+
block.value_length = (@unicode ? @value.size / 2 : @value.size)
|
121
|
+
block.total_length = block.pack.size + packed_children.size
|
122
|
+
|
123
|
+
return Exerb::Utility.alignment(block.pack, 4) + packed_children
|
124
|
+
end
|
125
|
+
|
126
|
+
end # Block
|
127
|
+
|
128
|
+
class BlockType0 < BlockBase
|
129
|
+
|
130
|
+
def initialize(key, value = '', unicode = false)
|
131
|
+
super(0x0000, key, value, unicode)
|
132
|
+
end
|
133
|
+
|
134
|
+
end # BlockType0
|
135
|
+
|
136
|
+
class BlockType1 < BlockBase
|
137
|
+
|
138
|
+
def initialize(key, value = '', unicode = false)
|
139
|
+
super(0x0001, key, value, unicode)
|
140
|
+
end
|
141
|
+
|
142
|
+
end # BlockType1
|
143
|
+
|
144
|
+
class BlockType1String < BlockType1
|
145
|
+
|
146
|
+
def initialize(key, value)
|
147
|
+
super(key, value.to_s.unpack("U*").pack("v*") + "\0\0", true) # UTF-8 to UTF-16LE
|
148
|
+
end
|
149
|
+
|
150
|
+
end # BlockType1String
|
151
|
+
|
152
|
+
end # Exerb::Resource::VersionInfo
|
153
|
+
|
154
|
+
#==============================================================================#
|
155
|
+
#==============================================================================#
|