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
data/example/vr/vrdde.rb
ADDED
@@ -0,0 +1,623 @@
|
|
1
|
+
###################################
|
2
|
+
#
|
3
|
+
# vrdde.rb
|
4
|
+
# Programmed by nyasu <nyasu@osk.3web.ne.jp>
|
5
|
+
# Copyright 1999-2005 Nishikawa,Yasuhiro
|
6
|
+
#
|
7
|
+
# More information at http://vruby.sourceforge.net/index.html
|
8
|
+
#
|
9
|
+
###################################
|
10
|
+
|
11
|
+
=begin
|
12
|
+
= VisualuRuby(tmp) modules for DDE
|
13
|
+
This file provides modules for DDE conversation.
|
14
|
+
<<< handlers.rd
|
15
|
+
=end
|
16
|
+
|
17
|
+
|
18
|
+
# DDE_ADVISE not tested.
|
19
|
+
|
20
|
+
VR_DIR="vr/" unless defined?(::VR_DIR)
|
21
|
+
require VR_DIR+'vruby'
|
22
|
+
require VR_DIR+'sysmod'
|
23
|
+
|
24
|
+
module DDElParam
|
25
|
+
PackDDElParam=Win32API.new("user32","PackDDElParam",["I","I","I"],"L")
|
26
|
+
UnpackDDElParam=Win32API.new("user32","UnpackDDElParam",["I","L","P","P"],"I")
|
27
|
+
FreeDDElParam=Win32API.new("user32","FreeDDElParam",["I","L"],"I")
|
28
|
+
ReuseDDElParam=Win32API.new("user32","ReuseDDElParam","IIIII","L")
|
29
|
+
|
30
|
+
def packDDElParam(msg,low,high)
|
31
|
+
PackDDElParam.call(msg,low,high)
|
32
|
+
end
|
33
|
+
def unpackDDElParam(msg,lparam)
|
34
|
+
a=" "; b=" "
|
35
|
+
UnpackDDElParam.call(msg,lparam,a,b)
|
36
|
+
[a.unpack("I")[0],b.unpack("I")[0]]
|
37
|
+
end
|
38
|
+
|
39
|
+
def freeDDElParam(msg,lparam)
|
40
|
+
FreeDDElParam.call(msg,lparam)
|
41
|
+
end
|
42
|
+
|
43
|
+
def reuseDDElParam(lParam, uMsgIn, uMsgOut, uLow, uHigh) #by yukimi_sake
|
44
|
+
ReuseDDElParam.call(lParam, uMsgIn, uMsgOut, uLow, uHigh)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module VRDdeConversation
|
49
|
+
=begin
|
50
|
+
== VRDdeConversation
|
51
|
+
Utilities for DDE conversation.
|
52
|
+
|
53
|
+
=== Methods
|
54
|
+
--- sendDDEAck(shwnd,aItem,retcode=0,ack=true,busy=false)
|
55
|
+
Sends DDE_ACK message to shwnd.
|
56
|
+
|
57
|
+
== VRDdeConversation::DDEAckFlags
|
58
|
+
This is a capsule of return code,ack flag, busy flag for DDE_ACK message
|
59
|
+
=== Attributes
|
60
|
+
--- retcode
|
61
|
+
8bit value.
|
62
|
+
--- ack
|
63
|
+
DDE request is accepted or not.
|
64
|
+
--- busy
|
65
|
+
busy or not.
|
66
|
+
=end
|
67
|
+
|
68
|
+
WM_DDE_INITIATE = 0x3e0
|
69
|
+
WM_DDE_TERMINATE= 0x3e1
|
70
|
+
WM_DDE_ADVISE = 0x3e2
|
71
|
+
WM_DDE_UNADVISE = 0x3e3
|
72
|
+
WM_DDE_ACK = 0x3e4
|
73
|
+
WM_DDE_DATA = 0x3e5
|
74
|
+
WM_DDE_REQUEST = 0x3e6
|
75
|
+
WM_DDE_POKE = 0x3e7
|
76
|
+
WM_DDE_EXECUTE = 0x3e8
|
77
|
+
|
78
|
+
class DDEAckFlags
|
79
|
+
# attr_accessor :ack
|
80
|
+
# attr_accessor :busy
|
81
|
+
# attr_accessor :retcode
|
82
|
+
def ack() @_vr_ack; end
|
83
|
+
def busy() @_vr_busy; end
|
84
|
+
def retcode() @_vr_retcode; end
|
85
|
+
|
86
|
+
def initialize(ack=true,busy=false,retcode=0)
|
87
|
+
@_vr_ack,@_vr_busy,@_vr_retcode = ack,busy,retcode
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def sendDDEAck(shwnd,aItem,retcode=0,ack=true,busy=false)
|
92
|
+
r = retcode & 0xff
|
93
|
+
r |= 0x8000 if ack
|
94
|
+
r |= 0x4000 if busy
|
95
|
+
lparam = packDDElParam(WM_DDE_ACK,r,aItem)
|
96
|
+
SMSG::PostMessage.call shwnd,WM_DDE_ACK, self.hWnd,lparam
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
module VRDdeServer
|
101
|
+
=begin
|
102
|
+
== VRDdeServer
|
103
|
+
This module prepares fundamental functions for DDE server.
|
104
|
+
|
105
|
+
=== Methods
|
106
|
+
--- addDDEAppTopic(appname,topic)
|
107
|
+
Adds acceptable pair of application name and topic for DDE.
|
108
|
+
--- delDDEAppTopic(appname,topic)
|
109
|
+
Deletes acceptable pair of application name and topic.
|
110
|
+
|
111
|
+
=== Event handlers
|
112
|
+
--- ????_ddeinitiate(shwnd,appname,topic)
|
113
|
+
Fired when DDE client whose hwnd is ((|shwnd|)) connects the
|
114
|
+
DDE server.
|
115
|
+
--- ???_ddeterminate(shwnd)
|
116
|
+
Fired when DDE client whose hwnd is ((|shwnd|)) disconnects.
|
117
|
+
=end
|
118
|
+
|
119
|
+
include VRMessageHandler
|
120
|
+
include VRDdeConversation
|
121
|
+
include DDElParam
|
122
|
+
|
123
|
+
def ddeserverinit
|
124
|
+
acceptEvents([WM_DDE_INITIATE,WM_DDE_TERMINATE])
|
125
|
+
addHandler WM_DDE_INITIATE,"_ddeInitiate",MSGTYPE::ARGINTINTINT,nil
|
126
|
+
addHandler WM_DDE_TERMINATE,"_ddeTerminate",MSGTYPE::ARGWINT,nil
|
127
|
+
@_vr_clients={} #{client's hwnd=>[client's hwnd,appname,topic]
|
128
|
+
@_vr_ddeacceptable=[] # [appname,topic]
|
129
|
+
end
|
130
|
+
def vrinit
|
131
|
+
super
|
132
|
+
ddeserverinit
|
133
|
+
end
|
134
|
+
|
135
|
+
def self__ddeInitiate(shwnd,aApp,aTopic)
|
136
|
+
p=[GAtom::GetName(aApp),GAtom::GetName(aTopic)]
|
137
|
+
return unless @_vr_ddeacceptable.index(p)
|
138
|
+
|
139
|
+
@_vr_clients[shwnd] = [shwnd] + p
|
140
|
+
r=nil
|
141
|
+
r=selfmsg_dispatching("ddeinitiate",shwnd,p[0],p[1])
|
142
|
+
SMSG::SendMessage.call shwnd,WM_DDE_ACK,self.hWnd,MAKELPARAM(aApp,aTopic)
|
143
|
+
end
|
144
|
+
|
145
|
+
def self__ddeTerminate(shwnd)
|
146
|
+
selfmsg_dispatching("ddeterminate",shwnd)
|
147
|
+
SMSG::PostMessage.call shwnd,WM_DDE_TERMINATE,self.hWnd,0
|
148
|
+
@_vr_clients.delete(shwnd)
|
149
|
+
end
|
150
|
+
|
151
|
+
def addDDEAppTopic(appname,topic)
|
152
|
+
@_vr_ddeacceptable.push([appname,topic])
|
153
|
+
end
|
154
|
+
def delDDEAppTopic(appname,topic)
|
155
|
+
@_vr_ddeacceptable.delete([appname,topic])
|
156
|
+
end
|
157
|
+
|
158
|
+
def self_ddeinitiate(*args) end
|
159
|
+
def self_ddeterminate(*arg) end
|
160
|
+
end
|
161
|
+
|
162
|
+
module VRDdeExecuteServer
|
163
|
+
=begin
|
164
|
+
== VRDdeExecuteServer
|
165
|
+
This module provides a feature of DDE_Execute server.
|
166
|
+
((<VRDdeServer>)) is included.
|
167
|
+
|
168
|
+
=== Event handler
|
169
|
+
--- self_ddeexecute(command,shwnd,appname,topic)
|
170
|
+
Fired when the client whose name is ((|shwnd|)) sends DDE_EXECUTE
|
171
|
+
to the server.The command string is ((|command|)).
|
172
|
+
If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
|
173
|
+
DDE_ACK message that will be sent is according to this return value.
|
174
|
+
=end
|
175
|
+
|
176
|
+
include VRDdeServer
|
177
|
+
|
178
|
+
EXECUTEMETHOD="ddeexecute"
|
179
|
+
|
180
|
+
def ddeexecuteserverinit
|
181
|
+
addEvent WM_DDE_EXECUTE
|
182
|
+
addHandler WM_DDE_EXECUTE,"_ddeexecuteinternal",MSGTYPE::ARGINTINT,nil
|
183
|
+
end
|
184
|
+
def vrinit
|
185
|
+
super
|
186
|
+
ddeexecuteserverinit
|
187
|
+
end
|
188
|
+
|
189
|
+
def self__ddeexecuteinternal(shwnd,hcmd)
|
190
|
+
cl=@_vr_clients[shwnd]
|
191
|
+
raise "unknown dde client (not initiated)" unless cl
|
192
|
+
cmd=GMEM::Get(hcmd).unpack("A*")[0]
|
193
|
+
ret=nil
|
194
|
+
ret=selfmsg_dispatching(EXECUTEMETHOD,cmd,*cl)
|
195
|
+
freeDDElParam(WM_DDE_EXECUTE,hcmd) #by yukimi_sake
|
196
|
+
if ret.is_a?(DDEAckFlags) then
|
197
|
+
sendDDEAck shwnd,hcmd,(ret.retcode || 0),ret.ack,ret.busy
|
198
|
+
else
|
199
|
+
sendDDEAck shwnd,hcmd
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
module VRDdeRequestServer #by yukimi_sake
|
205
|
+
=begin
|
206
|
+
== VRDdeRequestServer
|
207
|
+
This module provides a feature of DDE_REQUEST server.
|
208
|
+
((<VRDdeServer>)) is included.
|
209
|
+
|
210
|
+
=== Event handler
|
211
|
+
--- self_dderequest(item,shwnd,app,topic)
|
212
|
+
Fired when the client whose name is ((|shwnd|)) sends DDE_REQUEST
|
213
|
+
to the server.The item string is ((|item|)).
|
214
|
+
Retuern value(as String) is sended to shwnd which is handle of client,
|
215
|
+
using WM_DDE_DATA message.
|
216
|
+
If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
|
217
|
+
DDE_ACK message that will be sent is according to this return value.
|
218
|
+
=end
|
219
|
+
|
220
|
+
include VRDdeServer
|
221
|
+
|
222
|
+
EXECUTEMETHOD="dderequest"
|
223
|
+
GMEM_DDESHARE=0x2000
|
224
|
+
|
225
|
+
def sendDDEData(shwnd,lp,data)
|
226
|
+
raise "Data must be a String" unless data.is_a? String
|
227
|
+
dDEDATA=[0xb000,ClipboardFormat::CF_TEXT,data+"\0"].pack("Ssa*")
|
228
|
+
hData=GMEM::AllocStr(GMEM_DDESHARE,dDEDATA)
|
229
|
+
lParam=reuseDDElParam lp,WM_DDE_REQUEST,WM_DDE_DATA,hData,HIWORD(lp)
|
230
|
+
SMSG::PostMessage.call shwnd, WM_DDE_DATA, self.hWnd, lParam
|
231
|
+
end
|
232
|
+
|
233
|
+
def dderequestserverinit
|
234
|
+
addEvent WM_DDE_REQUEST
|
235
|
+
addHandler WM_DDE_REQUEST,"_dderequestinternal",MSGTYPE::ARGINTINT,nil
|
236
|
+
end
|
237
|
+
|
238
|
+
def vrinit
|
239
|
+
super
|
240
|
+
dderequestserverinit
|
241
|
+
end
|
242
|
+
|
243
|
+
def self__dderequestinternal(shwnd,lparam)
|
244
|
+
cl=@_vr_clients[shwnd]
|
245
|
+
raise "unknown dde client (not initiated)" unless cl
|
246
|
+
cformat,aitem = unpackDDElParam(WM_DDE_REQUEST,lparam)
|
247
|
+
raise "not supported this format" unless cformat == 1
|
248
|
+
item = GAtom::GetName(aitem)
|
249
|
+
ret=nil
|
250
|
+
ret=selfmsg_dispatching(EXECUTEMETHOD,item,*cl)
|
251
|
+
if ret.is_a?(DDEAckFlags) then
|
252
|
+
freeDDElParam(WM_DDE_REQEST,lparam)
|
253
|
+
sendDDEAck shwnd,aitem,(ret.retcode || 0),ret.ack,ret.busy
|
254
|
+
else
|
255
|
+
sendDDEData shwnd,lparam,ret
|
256
|
+
end
|
257
|
+
end
|
258
|
+
def self_dderequest(item,shwnd,app,topic) end
|
259
|
+
end
|
260
|
+
|
261
|
+
module VRDdePokeServer #by yukimi_sake
|
262
|
+
=begin
|
263
|
+
== VRDdePokeServer
|
264
|
+
This module provides a feature of DDE_POKE server.
|
265
|
+
((<VRDdeServer>)) is included.
|
266
|
+
|
267
|
+
=== Event handler
|
268
|
+
--- self_ddepoke(item,data,cfmt,shwnd,app,topic)
|
269
|
+
Fired when the client whose name is ((|shwnd|)) sends DDE_POKE
|
270
|
+
to the server.The item string is ((|item|)).The data is ((|data|)).
|
271
|
+
If you want to treat data other than String, carry out according to
|
272
|
+
clipboard format ((|cfmt|)) in the handler.
|
273
|
+
If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
|
274
|
+
DDE_ACK message that will be sent is according to this return value.
|
275
|
+
=end
|
276
|
+
include VRDdeServer
|
277
|
+
|
278
|
+
EXECUTEMETHOD="ddepoke"
|
279
|
+
|
280
|
+
def ddepokeserverinit
|
281
|
+
addEvent WM_DDE_POKE
|
282
|
+
addHandler WM_DDE_POKE,"_ddepokeinternal",MSGTYPE::ARGINTINT,nil
|
283
|
+
end
|
284
|
+
|
285
|
+
def vrinit
|
286
|
+
super
|
287
|
+
ddepokeserverinit
|
288
|
+
end
|
289
|
+
|
290
|
+
def self__ddepokeinternal(shwnd,lparam)
|
291
|
+
cl=@_vr_clients[shwnd]
|
292
|
+
raise "unknown dde client (not initiated)" unless cl
|
293
|
+
hdata,aitem = unpackDDElParam(WM_DDE_POKE,lparam)
|
294
|
+
item = GAtom::GetName(aitem)
|
295
|
+
datastr = GMEM::Get(hdata)
|
296
|
+
flag,cfmt,data = datastr.unpack("SsA*")
|
297
|
+
if (flag&0x2000) > 0 then # fRelease is asserted
|
298
|
+
GMEM::Free(hdata)
|
299
|
+
end
|
300
|
+
ret=nil
|
301
|
+
ret=selfmsg_dispatching(EXECUTEMETHOD,item,data,cfmt,*cl)
|
302
|
+
freeDDElParam(WM_DDE_POKE, lparam)
|
303
|
+
if ret.is_a?(DDEAckFlags) then
|
304
|
+
sendDDEAck shwnd,aitem,(ret.retcode || 0),ret.ack,ret.busy
|
305
|
+
else
|
306
|
+
sendDDEAck shwnd,aitem
|
307
|
+
end
|
308
|
+
end
|
309
|
+
def self_ddepoke(item,data,cfmt,shwnd,app,topic) end
|
310
|
+
end
|
311
|
+
|
312
|
+
module VRDdeClient
|
313
|
+
=begin
|
314
|
+
== VRDdeClient
|
315
|
+
This module provides features of DDE clients.
|
316
|
+
|
317
|
+
=== Methods
|
318
|
+
--- ddeconnected?
|
319
|
+
--- ddeready?
|
320
|
+
Returns whether it is able to request dde conversation.
|
321
|
+
--- ddebusy?
|
322
|
+
Returns true when it waits DDE_ACK/DDE_DATA message.
|
323
|
+
|
324
|
+
--- ddeexecute(appname,topic.command)
|
325
|
+
Sends DDE_EXECUTE request to the server specified by the pair of (appname,topic).
|
326
|
+
--- ddepoke(appname,topic,item,data,fmt)
|
327
|
+
Sends DDE_POKE request to the server specified by the pair of (appname,topic).
|
328
|
+
The ((|data|)) in the format of ((|fmt|)) (1 as CF_TEXT and so on) is transferred
|
329
|
+
tothe ((|item|)) in the server
|
330
|
+
--- dderequest(appname,topic,item,fmt)
|
331
|
+
Sends DDE_REQUEST request to the server specified by the pair of (appname,topic).
|
332
|
+
The server calls back ((<self_dderequestdata>)) method of client window to
|
333
|
+
transfer the data of ((|item|)).
|
334
|
+
--- ddeadvise(appname,topic,item,fmt)
|
335
|
+
--- ddeunadvise(appname,topic,item,fmt)
|
336
|
+
Not tested.
|
337
|
+
|
338
|
+
=== Event handlers
|
339
|
+
???? is the downcase-ed appname of the DDE conversation. It is because the ???? name
|
340
|
+
is named by WM_DDE_ACK message's App-name which is created by the server and that
|
341
|
+
may be different from the requested appname from client.
|
342
|
+
|
343
|
+
--- ????_ddeterminate(shwnd)
|
344
|
+
Fired when the server disconnects the conversation.
|
345
|
+
--- ????_dderefused(retcode,busy)
|
346
|
+
Fired when the server refused the connection. The return code is ((|retcode|)) and
|
347
|
+
busy flag is ((|busy|)).
|
348
|
+
--- ????_ddeexecdone(retcode)
|
349
|
+
Fired when the server accepts the DDE_EXECUTE request.
|
350
|
+
--- ????_ddepokedone(retcode)
|
351
|
+
Fired when the server accepts the DDE_POKE request.
|
352
|
+
--- ????_ddedata(data,fmt,flag)
|
353
|
+
Fired when the server returns the data by the DDE_REQUEST that client sended.
|
354
|
+
If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
|
355
|
+
DDE_ACK message that will be sent is according to this return value.
|
356
|
+
--- ????_ddeadvisedata(data,fmt,flag)
|
357
|
+
Not tested.
|
358
|
+
=end
|
359
|
+
|
360
|
+
include VRMessageHandler
|
361
|
+
include VRDdeConversation
|
362
|
+
include DDElParam
|
363
|
+
|
364
|
+
private
|
365
|
+
STATUSCONNECT= 1
|
366
|
+
STATUSEXECUTE= 2
|
367
|
+
STATUSPOKE = 4
|
368
|
+
STATUSREQUEST= 8
|
369
|
+
STATUSADVISE = 16
|
370
|
+
STATUSTERMINATE=128
|
371
|
+
GMEMSTYLE = 0x2042
|
372
|
+
|
373
|
+
|
374
|
+
def ddeconnect(appname,topic)
|
375
|
+
raise "DDE_INITIATE busy!" if @_vr_ddesearching
|
376
|
+
raise "Application name must be specified" unless appname
|
377
|
+
aApp = GAtom::Add(appname)
|
378
|
+
aTopic = if topic then GAtom::Add(topic) else 0 end
|
379
|
+
|
380
|
+
srv = @_vr_servers.find do |key,item| item[1]==appname end
|
381
|
+
|
382
|
+
shwnd = if srv then srv[0] else 0xffffffff end
|
383
|
+
@_vr_ddesearching=nil
|
384
|
+
SMSG::SendMessage.call shwnd,WM_DDE_INITIATE,self.hWnd,MAKELPARAM(aApp,aTopic)
|
385
|
+
shwnd = @_vr_ddesearching unless srv
|
386
|
+
@_vr_ddesearching=nil
|
387
|
+
|
388
|
+
GAtom::Delete(aApp)
|
389
|
+
GAtom::Delete(aTopic) if topic!=0
|
390
|
+
raise "DDE Server (#{appname}:#{topic}) not found" unless shwnd
|
391
|
+
shwnd
|
392
|
+
end
|
393
|
+
|
394
|
+
def ddeterminate(shwnd)
|
395
|
+
SMSG::PostMessage.call shwnd,WM_DDE_TERMINATE,self.hWnd,0
|
396
|
+
@_vr_servers[shwnd][2]|=STATUSTERMINATE
|
397
|
+
# @_vr_servers.delete(shwnd)
|
398
|
+
end
|
399
|
+
|
400
|
+
public
|
401
|
+
def vrinit
|
402
|
+
super
|
403
|
+
ddeclientinit
|
404
|
+
end
|
405
|
+
|
406
|
+
def ddeclientinit
|
407
|
+
acceptEvents([WM_DDE_ACK,WM_DDE_DATA,WM_DDE_TERMINATE])
|
408
|
+
addHandler WM_DDE_ACK, "ddeAck", MSGTYPE::ARGINTINT,nil
|
409
|
+
addHandler WM_DDE_DATA,"ddeData",MSGTYPE::ARGINTINT,nil
|
410
|
+
addHandler WM_DDE_TERMINATE,"ddeTerminate",MSGTYPE::ARGWINT,nil
|
411
|
+
@_vr_servers={} # {server's hwnd => [server's hwnd,appname,status,params]}
|
412
|
+
@_vr_ddesearching = false
|
413
|
+
end
|
414
|
+
|
415
|
+
def ddeconnected?(appname)
|
416
|
+
srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
|
417
|
+
if srv then srv=srv[1];((srv[2]&STATUSCONNECT)>0) else false end
|
418
|
+
end
|
419
|
+
def ddebusy?(appname)
|
420
|
+
srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
|
421
|
+
if srv then srv=srv[1]; ((srv[2] & ~STATUSCONNECT)>0) else nil end
|
422
|
+
end
|
423
|
+
def ddeidle?(appname)
|
424
|
+
srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
|
425
|
+
if srv then
|
426
|
+
srv=srv[1]
|
427
|
+
((srv[2]&STATUSCONNECT)>0) and ((srv[2] & ~STATUSCONNECT)==0)
|
428
|
+
else
|
429
|
+
true
|
430
|
+
end
|
431
|
+
end
|
432
|
+
def ddeready?(appname)
|
433
|
+
srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
|
434
|
+
if srv then
|
435
|
+
srv=srv[1]
|
436
|
+
((srv[2]&STATUSCONNECT)>0) and
|
437
|
+
((srv[2] & ~(STATUSCONNECT | STATUSADVISE))==0)
|
438
|
+
else
|
439
|
+
true
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
def ddeexecute(appname,topic,cmdstr)
|
444
|
+
raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
|
445
|
+
shwnd=ddeconnect(appname,topic)
|
446
|
+
executemem = GMEM::AllocStr(GMEMSTYLE,cmdstr)
|
447
|
+
@_vr_servers[shwnd][2] |= STATUSEXECUTE
|
448
|
+
SMSG::PostMessage.call shwnd,WM_DDE_EXECUTE,self.hWnd,executemem
|
449
|
+
end
|
450
|
+
|
451
|
+
def ddepoke(appname,topic,item,data,fmt=ClipboardFormat::CF_TEXT)
|
452
|
+
raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
|
453
|
+
shwnd=ddeconnect(appname,topic)
|
454
|
+
|
455
|
+
aItem = GAtom::Add(item.to_s)
|
456
|
+
|
457
|
+
pokedata=[0,fmt].pack("Ss")+data.to_s
|
458
|
+
pokemem = GMEM::AllocStr(GMEMSTYLE,pokedata)
|
459
|
+
|
460
|
+
@_vr_servers[shwnd][2] |= STATUSPOKE
|
461
|
+
@_vr_servers[shwnd][3] = pokemem
|
462
|
+
|
463
|
+
lparam = packDDElParam(WM_DDE_POKE,pokemem,aItem)
|
464
|
+
SMSG::PostMessage.call shwnd,WM_DDE_POKE,self.hWnd,lparam
|
465
|
+
end
|
466
|
+
|
467
|
+
def dderequest(appname,topic,item,fmt=ClipboardFormat::CF_TEXT)
|
468
|
+
raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
|
469
|
+
shwnd=ddeconnect(appname,topic)
|
470
|
+
|
471
|
+
aItem = GAtom::Add(item.to_s)
|
472
|
+
|
473
|
+
@_vr_servers[shwnd][2] |= STATUSREQUEST
|
474
|
+
SMSG::PostMessage.call shwnd,WM_DDE_REQUEST,self.hWnd,
|
475
|
+
MAKELPARAM(fmt.to_i,aItem)
|
476
|
+
end
|
477
|
+
|
478
|
+
def ddeadvise(appname,topic,item,fmt=1,defup=false,ackreq=false)
|
479
|
+
raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
|
480
|
+
shwnd=ddeconnect(appname,topic)
|
481
|
+
|
482
|
+
aItem = GAtom::Add(item.to_s)
|
483
|
+
|
484
|
+
flag = 0
|
485
|
+
if defup then flag |= 0x4000 end
|
486
|
+
if ackreq then flag |= 0x8000 end
|
487
|
+
|
488
|
+
advisedata=[flag,fmt].pack("Ss")
|
489
|
+
advisemem = GMEM::AllocStr(GMEMSTYLE,advisedata)
|
490
|
+
|
491
|
+
@_vr_servers[shwnd][2] |= STATUSADVISE
|
492
|
+
lparam = packDDElParam(WM_DDE_POKE,advisemem,aItem)
|
493
|
+
SMSG::PostMessage.call shwnd,WM_DDE_ADVISE,self.hWnd,lparam
|
494
|
+
end
|
495
|
+
|
496
|
+
def ddeunadvise(appname,topic,item,fmt=0)
|
497
|
+
raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
|
498
|
+
shwnd=ddeconnect(appname,topic)
|
499
|
+
|
500
|
+
aItem = GAtom::Add(item.to_s)
|
501
|
+
|
502
|
+
@_vr_servers[n][2] |= STATUSREQUEST
|
503
|
+
SMSG::PostMessage.call @_vr_servers[n][0],WM_DDE_UNADVISE,self.hWnd,
|
504
|
+
MAKELPARAM(fmt.to_i,aItem)
|
505
|
+
end
|
506
|
+
|
507
|
+
|
508
|
+
def self_ddeTerminate(shwnd)
|
509
|
+
return unless @_vr_servers[shwnd]
|
510
|
+
controlmsg_dispatching(@_vr_servers[shwnd][1],"ddeterminate")
|
511
|
+
@_vr_servers.delete(shwnd)
|
512
|
+
end
|
513
|
+
|
514
|
+
def self_ddeAck(shwnd,lparam)
|
515
|
+
#p "ACK"
|
516
|
+
sv = @_vr_servers[shwnd]
|
517
|
+
fname=""
|
518
|
+
if(!sv) then
|
519
|
+
aApp,aTopic = LOWORD(lparam),HIWORD(lparam)
|
520
|
+
appname=GAtom::GetName(aApp).downcase
|
521
|
+
tpcname=GAtom::GetName(aTopic)
|
522
|
+
appname2=appname.dup
|
523
|
+
def appname2.name() self; end # tricky thing for parentrelayer
|
524
|
+
@_vr_servers[shwnd]=[shwnd,appname2,STATUSCONNECT,nil]
|
525
|
+
|
526
|
+
@_vr_ddesearching=shwnd
|
527
|
+
|
528
|
+
GAtom::Delete(aApp)
|
529
|
+
GAtom::Delete(aTopic)
|
530
|
+
|
531
|
+
elsif (sv[2] & ~STATUSCONNECT)>0 then
|
532
|
+
wstatus,param = unpackDDElParam(WM_DDE_ACK,lparam)
|
533
|
+
freeDDElParam(WM_DDE_ACK,lparam)
|
534
|
+
|
535
|
+
retcode = wstatus&0xf
|
536
|
+
busy= 0<(wstatus&0x4000)
|
537
|
+
ack = 0<(wstatus&0x8000)
|
538
|
+
sname = sv[1]
|
539
|
+
|
540
|
+
unless ack then
|
541
|
+
sv[2] &= STATUSCONNECT
|
542
|
+
# fname=sname+"_dderefused"
|
543
|
+
# __send__(fname,retcode,busy) if respond_to?(fname)
|
544
|
+
controlmsg_dispatching(sname,"dderefused",retcode,busy)
|
545
|
+
end
|
546
|
+
if (sv[2] & STATUSEXECUTE)>0 then
|
547
|
+
GMEM::Free(param) unless ack
|
548
|
+
sv[2] &= ~STATUSEXECUTE
|
549
|
+
fname="ddeexecdone"
|
550
|
+
ddeterminate(shwnd)
|
551
|
+
elsif(sv[2] & STATUSPOKE)>0 then
|
552
|
+
GAtom::Delete(param)
|
553
|
+
GMEM::Free(sv[3])
|
554
|
+
sv[3]=nil
|
555
|
+
sv[2] &= ~STATUSPOKE
|
556
|
+
fname="ddepokedone"
|
557
|
+
ddeterminate(shwnd)
|
558
|
+
elsif(sv[2] & STATUSREQUEST)>0 then
|
559
|
+
GAtom::Delete(param)
|
560
|
+
sv[2] &= ~STATUSPOKE
|
561
|
+
fname=nil
|
562
|
+
ddeterminate(shwnd)
|
563
|
+
elsif(sv[2] & STATUSADVISE)>0 then
|
564
|
+
GMEM::Free(param) unless ack
|
565
|
+
sv[2] &= ~STATUSADVISE
|
566
|
+
fname=nil
|
567
|
+
else
|
568
|
+
ddeterminate(shwnd)
|
569
|
+
end
|
570
|
+
controlmsg_dispatching(sname,fname,retcode) if ack and fname
|
571
|
+
else
|
572
|
+
raise "DDE MultiSession Error"
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
def self_ddeData(shwnd,lparam)
|
577
|
+
#p "DATA"
|
578
|
+
datamem,aItem = unpackDDElParam(WM_DDE_DATA,lparam)
|
579
|
+
freeDDElParam(WM_DDE_DATA,lparam)
|
580
|
+
|
581
|
+
sv = @_vr_servers[shwnd]
|
582
|
+
fname=sname=nil
|
583
|
+
|
584
|
+
datastr = GMEM::Get(datamem)
|
585
|
+
flag,fmt,data = datastr.unpack("Ssa*")
|
586
|
+
|
587
|
+
if (flag&0x2000) > 0 then # fRelease is asserted
|
588
|
+
GMEM::Free(datamem)
|
589
|
+
end
|
590
|
+
|
591
|
+
ret = nil
|
592
|
+
if(!sv) then
|
593
|
+
# Ignored
|
594
|
+
else
|
595
|
+
sname=sv[1]
|
596
|
+
if (sv[2] & STATUSREQUEST)>0 then
|
597
|
+
sv[2]&=1
|
598
|
+
fname="ddedata"
|
599
|
+
ddeterminate(sv[0])
|
600
|
+
elsif (sv[2] & STATUSADVISE)>0
|
601
|
+
sv[2]&=1
|
602
|
+
fname="ddeadvisedata"
|
603
|
+
else
|
604
|
+
end
|
605
|
+
|
606
|
+
fn=sname+fname
|
607
|
+
if(fn) then
|
608
|
+
ret=controlmsg_dispatching(sname,fname,data,fmt,flag)
|
609
|
+
end
|
610
|
+
end
|
611
|
+
|
612
|
+
if (flag&0x8000) > 0 then #fAckReq is asserted
|
613
|
+
if ret.is_a?(DDEAckFlags) then
|
614
|
+
sendDDEAck shwnd,aItem,(ret.retcode || 0),ret.ack,ret.busy
|
615
|
+
else
|
616
|
+
sendDDEAck shwnd,aItem
|
617
|
+
end
|
618
|
+
else
|
619
|
+
GAtom::Delete(aItem)
|
620
|
+
end
|
621
|
+
|
622
|
+
end
|
623
|
+
end
|