exerb 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/ChangeLog.ja.rd +305 -0
  4. data/README.en.txt +12 -0
  5. data/README.ja.html +143 -0
  6. data/README.ja.txt +6 -0
  7. data/README.md +50 -0
  8. data/Rakefile +205 -0
  9. data/bin/exerb +185 -0
  10. data/bin/mkexy +47 -0
  11. data/doc/LGPL +513 -0
  12. data/doc/class.ja.html +92 -0
  13. data/doc/command.ja.html +109 -0
  14. data/doc/core.ja.html +72 -0
  15. data/doc/example.ja.html +89 -0
  16. data/doc/faq.ja.html +59 -0
  17. data/doc/inside.ja.rd +404 -0
  18. data/doc/license.ja.html +62 -0
  19. data/doc/logo.gif +0 -0
  20. data/doc/misc.ja.html +72 -0
  21. data/doc/navi.gif +0 -0
  22. data/doc/recipe.ja.html +317 -0
  23. data/doc/style.css +187 -0
  24. data/doc/tutorial.ja.html +182 -0
  25. data/example/Makefile +54 -0
  26. data/example/cat_n.rb +14 -0
  27. data/example/exception.rb +9 -0
  28. data/example/ext/Win32API.so +0 -0
  29. data/example/ext/swin.so +0 -0
  30. data/example/msgbox.rb +14 -0
  31. data/example/rubytk.rb +22 -0
  32. data/example/runtime.ico +0 -0
  33. data/example/runtime.rb +19 -0
  34. data/example/vr/clipboard.rb +106 -0
  35. data/example/vr/compat/rubycompat.rb +18 -0
  36. data/example/vr/compat/vrcomctl.rb +12 -0
  37. data/example/vr/compat/vrcontrol.rb +50 -0
  38. data/example/vr/compat/vrmmedia.rb +24 -0
  39. data/example/vr/contrib/inifile.rb +116 -0
  40. data/example/vr/contrib/msgboxconst.rb +55 -0
  41. data/example/vr/contrib/toolbar.rb +371 -0
  42. data/example/vr/contrib/vrctlcolor.rb +110 -0
  43. data/example/vr/contrib/vrhotkey.rb +35 -0
  44. data/example/vr/contrib/vrlistviewex.rb +71 -0
  45. data/example/vr/contrib/vrstdscrollbar.rb +414 -0
  46. data/example/vr/contrib/vrwincomponent.rb +54 -0
  47. data/example/vr/dragdropformat.rb +209 -0
  48. data/example/vr/rscutil.rb +168 -0
  49. data/example/vr/sysmod.rb +249 -0
  50. data/example/vr/vractivex.rb +56 -0
  51. data/example/vr/vrclipboard.rb +53 -0
  52. data/example/vr/vrcomctl.rb +1819 -0
  53. data/example/vr/vrcontrol.rb +1374 -0
  54. data/example/vr/vrdde.rb +623 -0
  55. data/example/vr/vrddrop.rb +190 -0
  56. data/example/vr/vrdialog.rb +406 -0
  57. data/example/vr/vrhandler.rb +195 -0
  58. data/example/vr/vrlayout.old.rb +209 -0
  59. data/example/vr/vrlayout.rb +173 -0
  60. data/example/vr/vrlayout2.rb +340 -0
  61. data/example/vr/vrmargin.rb +141 -0
  62. data/example/vr/vrmgdlayout.rb +381 -0
  63. data/example/vr/vrmmedia.rb +287 -0
  64. data/example/vr/vrolednd.rb +192 -0
  65. data/example/vr/vrowndraw.rb +108 -0
  66. data/example/vr/vrrichedit.rb +366 -0
  67. data/example/vr/vrtimer.rb +148 -0
  68. data/example/vr/vrtooltip.rb +273 -0
  69. data/example/vr/vrtray.rb +143 -0
  70. data/example/vr/vrtvitem.rb +118 -0
  71. data/example/vr/vrtwopane.rb +223 -0
  72. data/example/vr/vruby.rb +1051 -0
  73. data/example/vr/winconst.rb +158 -0
  74. data/example/vruby.rb +38 -0
  75. data/exerb.gemspec +26 -0
  76. data/extconf.rb +7 -0
  77. data/lib/exerb/archive.rb +143 -0
  78. data/lib/exerb/config.rb +51 -0
  79. data/lib/exerb/error.rb +15 -0
  80. data/lib/exerb/executable.rb +68 -0
  81. data/lib/exerb/file_table.rb +189 -0
  82. data/lib/exerb/mkexy.rb +81 -0
  83. data/lib/exerb/name_table.rb +120 -0
  84. data/lib/exerb/recipe.rb +465 -0
  85. data/lib/exerb/resource.rb +190 -0
  86. data/lib/exerb/resource/base.rb +29 -0
  87. data/lib/exerb/resource/binary.rb +31 -0
  88. data/lib/exerb/resource/dialog.rb +30 -0
  89. data/lib/exerb/resource/group_icon.rb +85 -0
  90. data/lib/exerb/resource/icon.rb +52 -0
  91. data/lib/exerb/resource/version_info.rb +155 -0
  92. data/lib/exerb/resource_library.rb +120 -0
  93. data/lib/exerb/utility.rb +95 -0
  94. data/lib/exerb/utility2.rb +122 -0
  95. data/lib/exerb/version.rb +13 -0
  96. data/lib/exerb/win32/const/resource.rb +51 -0
  97. data/lib/exerb/win32/icon_file.rb +78 -0
  98. data/lib/exerb/win32/pe_file.rb +59 -0
  99. data/lib/exerb/win32/resource_directory.rb +105 -0
  100. data/lib/exerb/win32/resource_directory_root.rb +67 -0
  101. data/lib/exerb/win32/resource_entry.rb +98 -0
  102. data/lib/exerb/win32/struct/base.rb +43 -0
  103. data/lib/exerb/win32/struct/icon_dir_entry.rb +83 -0
  104. data/lib/exerb/win32/struct/icon_header.rb +43 -0
  105. data/lib/exerb/win32/struct/icon_res_entry.rb +48 -0
  106. data/lib/exerb/win32/struct/image_dos_header.rb +73 -0
  107. data/lib/exerb/win32/struct/image_file_header.rb +47 -0
  108. data/lib/exerb/win32/struct/image_nt_headers32.rb +53 -0
  109. data/lib/exerb/win32/struct/image_optional_header32.rb +107 -0
  110. data/lib/exerb/win32/struct/image_resource_data_entry.rb +45 -0
  111. data/lib/exerb/win32/struct/image_resource_directory.rb +47 -0
  112. data/lib/exerb/win32/struct/image_resource_directory_entry.rb +72 -0
  113. data/lib/exerb/win32/struct/image_section_header.rb +53 -0
  114. data/lib/exerb/win32/struct/version_info_block.rb +75 -0
  115. data/lib/exerb/win32/struct/vs_fixed_file_info.rb +62 -0
  116. data/src/exerb/cui.c +48 -0
  117. data/src/exerb/default.rb +1 -0
  118. data/src/exerb/exerb.c +877 -0
  119. data/src/exerb/exerb.h +92 -0
  120. data/src/exerb/gui.c +176 -0
  121. data/src/exerb/module.c +138 -0
  122. data/src/exerb/module.h +7 -0
  123. data/src/exerb/patch.c +27 -0
  124. data/src/exerb/resource.h +22 -0
  125. data/src/exerb/resource.rc +121 -0
  126. data/src/exerb/ruby.ico +0 -0
  127. data/src/exerb/utility.c +263 -0
  128. data/src/exerb/utility.h +33 -0
  129. data/test/alltests.rb +16 -0
  130. data/test/test-argv.rb +26 -0
  131. data/test/test-argv/test-argv.rb +9 -0
  132. data/test/test-argv/test-argv.ret +1 -0
  133. data/test/test-dollarzero.rb +26 -0
  134. data/test/test-dollarzero/test-dollarzero.rb +10 -0
  135. data/test/test-dollarzero/test-dollarzero.ret +2 -0
  136. data/test/test-dot.rb +26 -0
  137. data/test/test-dot/dot.dot.dot.rb +9 -0
  138. data/test/test-dot/dot.dot.rb +9 -0
  139. data/test/test-dot/test-dot.rb +13 -0
  140. data/test/test-dot/test-dot.ret +5 -0
  141. data/test/test-exitcode.rb +28 -0
  142. data/test/test-exitcode/test-exitcode.rb +9 -0
  143. data/test/test-kcode.rb +43 -0
  144. data/test/test-kcode/euc.rb +10 -0
  145. data/test/test-kcode/euc.ret +2 -0
  146. data/test/test-kcode/none.rb +10 -0
  147. data/test/test-kcode/none.ret +2 -0
  148. data/test/test-kcode/sjis.rb +10 -0
  149. data/test/test-kcode/sjis.ret +2 -0
  150. data/test/test-kcode/utf8.rb +10 -0
  151. data/test/test-kcode/utf8.ret +2 -0
  152. data/test/test-loadpath.rb +24 -0
  153. data/test/test-loadpath/test-loadpath.rb +9 -0
  154. data/test/test-nest.rb +18 -0
  155. data/test/test-nest/foo.rb +1 -0
  156. data/test/test-nest/foo/bar.rb +2 -0
  157. data/test/test-nest/foo/foo.rb +1 -0
  158. data/test/test-nest/test-nest.rb +1 -0
  159. data/test/test-nest/test-nest.ret +1 -0
  160. data/test/test-preload.rb +24 -0
  161. data/test/test-preload/test-preload.rb +9 -0
  162. data/test/test-regexp.rb +26 -0
  163. data/test/test-regexp/test-regexp.rb +23 -0
  164. data/test/test-regexp/test-regexp.ret +13 -0
  165. data/test/test-require1.rb +26 -0
  166. data/test/test-require1/require1.rb +9 -0
  167. data/test/test-require1/require2.rb +9 -0
  168. data/test/test-require1/require3.rb +9 -0
  169. data/test/test-require1/require4.rb +9 -0
  170. data/test/test-require1/require5.rb +9 -0
  171. data/test/test-require1/require6.rb +9 -0
  172. data/test/test-require1/test-require1.rb +41 -0
  173. data/test/test-require1/test-require1.ret +27 -0
  174. data/test/test-socket.rb +26 -0
  175. data/test/test-socket/test-socket.rb +7 -0
  176. data/test/test-socket/test-socket.ret +1 -0
  177. data/test/testcase.rb +66 -0
  178. data/vendor/mkexports.rb +167 -0
  179. 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
+ #==============================================================================#