win 0.1.27 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -5
- data/.gitignore +21 -21
- data/LICENSE +20 -20
- data/README.rdoc +175 -175
- data/Rakefile +58 -58
- data/VERSION +1 -1
- data/features/support/env.rb +4 -4
- data/features/win.feature +9 -9
- data/lib/win/dde.rb +1234 -1234
- data/lib/win/error.rb +1223 -1223
- data/lib/win/extensions.rb +41 -41
- data/lib/win/gui.rb +16 -16
- data/lib/win/gui/dialog.rb +50 -50
- data/lib/win/gui/input.rb +319 -319
- data/lib/win/gui/message.rb +807 -807
- data/lib/win/gui/window.rb +679 -679
- data/lib/win/library.rb +463 -463
- data/spec/spec.opts +2 -2
- data/spec/spec_helper.rb +140 -135
- data/spec/test_apps/locknote/LockNote.exe +0 -0
- data/spec/win/dde_spec.rb +528 -528
- data/spec/win/error_spec.rb +112 -112
- data/spec/win/extensions_spec.rb +73 -73
- data/spec/win/gui/dialog_spec.rb +43 -43
- data/spec/win/gui/input_spec.rb +101 -101
- data/spec/win/gui/message_spec.rb +236 -236
- data/spec/win/gui/window_spec.rb +549 -548
- data/spec/win/library_spec.rb +341 -341
- data/win.gemspec +87 -87
- metadata +34 -17
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.3.1
|
data/features/support/env.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
-
require 'win'
|
3
|
-
|
4
|
-
require 'spec/expectations'
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
require 'win'
|
3
|
+
|
4
|
+
require 'spec/expectations'
|
data/features/win.feature
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
Feature: something something
|
2
|
-
In order to something something
|
3
|
-
A user something something
|
4
|
-
something something something
|
5
|
-
|
6
|
-
Scenario: something something
|
7
|
-
Given inspiration
|
8
|
-
When I create a sweet new gem
|
9
|
-
Then everyone should see how awesome I am
|
1
|
+
Feature: something something
|
2
|
+
In order to something something
|
3
|
+
A user something something
|
4
|
+
something something something
|
5
|
+
|
6
|
+
Scenario: something something
|
7
|
+
Given inspiration
|
8
|
+
When I create a sweet new gem
|
9
|
+
Then everyone should see how awesome I am
|
data/lib/win/dde.rb
CHANGED
@@ -1,1234 +1,1234 @@
|
|
1
|
-
require 'win/library'
|
2
|
-
|
3
|
-
module Win
|
4
|
-
|
5
|
-
# Includes functions related to DDE exchange protocol in Windows
|
6
|
-
#
|
7
|
-
module
|
8
|
-
include Win::Library
|
9
|
-
|
10
|
-
# Windows ANSI codepage:
|
11
|
-
CP_WINANSI = 1004
|
12
|
-
|
13
|
-
# DDE name service afCmd commands used by DdeNameService function:
|
14
|
-
|
15
|
-
# Registers the service name.
|
16
|
-
DNS_REGISTER = 1
|
17
|
-
# Unregisters the service name. When hsz1 == 0L, ALL service names registered by the server will be unregistered.
|
18
|
-
DNS_UNREGISTER = 2
|
19
|
-
# Turns on service name initiation filtering. The filter prevents a server from receiving
|
20
|
-
# XTYP_CONNECT transactions for service names it has not registered. This is the default
|
21
|
-
# setting for this filter. If a server application does not register any service names,
|
22
|
-
# the application cannot receive XTYP_WILDCONNECT transactions.
|
23
|
-
DNS_FILTERON = 4
|
24
|
-
# Turns off service name initiation filtering. If this flag is specified, the server
|
25
|
-
# receives an XTYP_CONNECT transaction whenever another DDE application calls the
|
26
|
-
# DdeConnect function, regardless of the service name.
|
27
|
-
DNS_FILTEROFF = 8
|
28
|
-
|
29
|
-
# Transaction confirmations:
|
30
|
-
|
31
|
-
# Transaction confirmation
|
32
|
-
DDE_FACK = 0x8000
|
33
|
-
# Server is too busy to process transaction
|
34
|
-
DDE_FBUSY = 0x4000
|
35
|
-
DDE_FDEFERUPD = 0x4000
|
36
|
-
DDE_FACKREQ = 0x8000
|
37
|
-
DDE_FRELEASE = 0x2000
|
38
|
-
DDE_FREQUESTED = 0x1000
|
39
|
-
DDE_FAPPSTATUS = 0x00ff
|
40
|
-
# Transaction rejected
|
41
|
-
DDE_FNOTPROCESSED = 0
|
42
|
-
|
43
|
-
# Transaction types:
|
44
|
-
|
45
|
-
XTYPF_NOBLOCK = 0x0002
|
46
|
-
XTYPF_NODATA = 0x0004
|
47
|
-
XTYPF_ACKREQ = 0x0008
|
48
|
-
|
49
|
-
XCLASS_MASK = 0xFC00
|
50
|
-
XCLASS_BOOL = 0x1000
|
51
|
-
XCLASS_DATA = 0x2000
|
52
|
-
XCLASS_FLAGS = 0x4000
|
53
|
-
XCLASS_NOTIFICATION = 0x8000
|
54
|
-
|
55
|
-
XTYP_ERROR = XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
56
|
-
XTYP_ADVDATA = 0x0010 | XCLASS_FLAGS
|
57
|
-
XTYP_ADVREQ = 0x0020 | XCLASS_DATA | XTYPF_NOBLOCK
|
58
|
-
XTYP_ADVSTART = 0x0030 | XCLASS_BOOL
|
59
|
-
XTYP_ADVSTOP = 0x0040 | XCLASS_NOTIFICATION
|
60
|
-
XTYP_EXECUTE = 0x0050 | XCLASS_FLAGS
|
61
|
-
# A client uses the XTYP_CONNECT transaction to establish a conversation. A DDE server callback function,
|
62
|
-
# DdeCallback, receives this transaction when a client specifies a service name that the server supports
|
63
|
-
# (and a topic name that is not NULL) in a call to the DdeConnect function.
|
64
|
-
XTYP_CONNECT = 0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK
|
65
|
-
XTYP_CONNECT_CONFIRM = 0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
66
|
-
XTYP_XACT_COMPLETE = 0x0080 | XCLASS_NOTIFICATION
|
67
|
-
# A client uses the XTYP_POKE transaction to send unsolicited data to the server. DDE server callback function,
|
68
|
-
# DdeCallback, receives this transaction when a client specifies XTYP_POKE in the DdeClientTransaction function.
|
69
|
-
XTYP_POKE = 0x0090 | XCLASS_FLAGS
|
70
|
-
XTYP_REGISTER = 0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
71
|
-
XTYP_REQUEST = 0x00B0 | XCLASS_DATA
|
72
|
-
XTYP_DISCONNECT = 0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
73
|
-
XTYP_UNREGISTER = 0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
74
|
-
XTYP_WILDCONNECT = 0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK
|
75
|
-
XTYP_MONITOR = 0X00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
76
|
-
XTYP_MASK = 0x00F0
|
77
|
-
XTYP_SHIFT = 0x0004
|
78
|
-
|
79
|
-
# Types Hash {TRANSACTION_TYPE=>'Type description')}
|
80
|
-
TYPES = {
|
81
|
-
XTYPF_NOBLOCK => 'XTYPF_NOBLOCK',
|
82
|
-
XTYPF_NODATA => 'XTYPF_NODATA',
|
83
|
-
XTYPF_ACKREQ => 'XTYPF_ACKREQ',
|
84
|
-
XCLASS_MASK => 'XCLASS_MASK',
|
85
|
-
XCLASS_BOOL => 'XCLASS_BOOL',
|
86
|
-
XCLASS_DATA => 'XCLASS_DATA',
|
87
|
-
XCLASS_FLAGS => 'XCLASS_FLAGS',
|
88
|
-
XCLASS_NOTIFICATION => 'XCLASS_NOTIFICATION',
|
89
|
-
XTYP_ERROR => 'XTYP_ERROR',
|
90
|
-
XTYP_ADVDATA => 'XTYP_ADVDATA',
|
91
|
-
XTYP_ADVREQ => 'XTYP_ADVREQ',
|
92
|
-
XTYP_ADVSTART => 'XTYP_ADVSTART',
|
93
|
-
XTYP_ADVSTOP => 'XTYP_ADVSTOP',
|
94
|
-
XTYP_EXECUTE => 'XTYP_EXECUTE',
|
95
|
-
XTYP_CONNECT => 'XTYP_CONNECT',
|
96
|
-
XTYP_CONNECT_CONFIRM=> 'XTYP_CONNECT_CONFIRM',
|
97
|
-
XTYP_XACT_COMPLETE => 'XTYP_XACT_COMPLETE',
|
98
|
-
XTYP_POKE => 'XTYP_POKE',
|
99
|
-
XTYP_REGISTER => 'XTYP_REGISTER',
|
100
|
-
XTYP_REQUEST => 'XTYP_REQUEST',
|
101
|
-
XTYP_DISCONNECT => 'XTYP_DISCONNECT',
|
102
|
-
XTYP_UNREGISTER => 'XTYP_UNREGISTER',
|
103
|
-
XTYP_WILDCONNECT => 'XTYP_WILDCONNECT',
|
104
|
-
XTYP_MONITOR => 'XTYP_MONITOR',
|
105
|
-
XTYP_MASK => 'XTYP_MASK',
|
106
|
-
XTYP_SHIFT => 'XTYP_SHIFT'
|
107
|
-
}
|
108
|
-
|
109
|
-
|
110
|
-
# DdeInitialize afCmd flaggs:
|
111
|
-
|
112
|
-
# Registers the application as a standard (nonmonitoring) DDEML application.
|
113
|
-
APPCLASS_STANDARD = 0
|
114
|
-
# Makes it possible for the application to monitor DDE activity in the system.
|
115
|
-
# This flag is for use by DDE monitoring applications. The application specifies the types of DDE
|
116
|
-
# activity to monitor by combining one or more monitor flags with the APPCLASS_MONITOR flag.
|
117
|
-
APPCLASS_MONITOR = 0x00000001
|
118
|
-
# ?
|
119
|
-
APPCLASS_MASK = 0x0000000F
|
120
|
-
# Prevents the application from becoming a server in a DDE conversation. The application can only be a client.
|
121
|
-
# This flag reduces consumption of resources by the DDEML. It includes the CBF_FAIL_ALLSVRXACTIONS flag.
|
122
|
-
APPCMD_CLIENTONLY = 0x00000010
|
123
|
-
# Prevents the DDEML from sending XTYP_CONNECT and XTYP_WILDCONNECT transactions to the application until
|
124
|
-
# the application has created its string handles and registered its service names or has turned off filtering
|
125
|
-
# by a subsequent call to the DdeNameService or DdeInitialize function. This flag is always in effect when an
|
126
|
-
# application calls DdeInitialize for the first time, regardless of whether the application specifies the flag.
|
127
|
-
# On subsequent calls to DdeInitialize, not specifying this flag turns off the application's service-name
|
128
|
-
# filters, but specifying it turns on the application's service name filters.
|
129
|
-
APPCMD_FILTERINITS = 0x00000020
|
130
|
-
# ?
|
131
|
-
APPCMD_MASK = 0x00000FF0
|
132
|
-
# Prevents the callback function from receiving XTYP_CONNECT transactions from the application's own instance.
|
133
|
-
# This flag prevents an application from establishing a DDE conversation with its own instance. An application
|
134
|
-
# should use this flag if it needs to communicate with other instances of itself but not with itself.
|
135
|
-
CBF_FAIL_SELFCONNECTIONS = 0x00001000
|
136
|
-
# Prevents the callback function from receiving XTYP_CONNECT and XTYP_WILDCONNECT.
|
137
|
-
CBF_FAIL_CONNECTIONS = 0x00002000
|
138
|
-
# Prevents the callback function from receiving XTYP_ADVSTART and XTYP_ADVSTOP transactions. The system returns
|
139
|
-
# DDE_FNOTPROCESSED to each client that sends an XTYP_ADVSTART or XTYP_ADVSTOP transaction to the server.
|
140
|
-
CBF_FAIL_ADVISES = 0x00004000
|
141
|
-
# Prevents the callback function from receiving XTYP_EXECUTE transactions. The system returns DDE_FNOTPROCESSED
|
142
|
-
# to a client that sends an XTYP_EXECUTE transaction to the server.
|
143
|
-
CBF_FAIL_EXECUTES = 0x00008000
|
144
|
-
# Prevents the callback function from receiving XTYP_POKE transactions. The system returns DDE_FNOTPROCESSED
|
145
|
-
# to a client that sends an XTYP_POKE transaction to the server.
|
146
|
-
CBF_FAIL_POKES = 0x00010000
|
147
|
-
# Prevents the callback function from receiving XTYP_REQUEST transactions. The system returns DDE_FNOTPROCESSED
|
148
|
-
# to a client that sends an XTYP_REQUEST transaction to the server.
|
149
|
-
CBF_FAIL_REQUESTS = 0x00020000
|
150
|
-
# Prevents the callback function from receiving server transactions. The system returns DDE_FNOTPROCESSED to each
|
151
|
-
# client that sends a transaction to this application. This flag is equivalent to combining all CBF_FAIL_ flags.
|
152
|
-
CBF_FAIL_ALLSVRXACTIONS = 0x0003f000
|
153
|
-
# Prevents the callback function from receiving XTYP_CONNECT_CONFIRM.
|
154
|
-
CBF_SKIP_CONNECT_CONFIRMS = 0x00040000
|
155
|
-
# Prevents the callback function from receiving XTYP_REGISTER notifications.
|
156
|
-
CBF_SKIP_REGISTRATIONS = 0x00080000
|
157
|
-
# Prevents the callback function from receiving XTYP_UNREGISTER notifications.
|
158
|
-
CBF_SKIP_UNREGISTRATIONS = 0x00100000
|
159
|
-
# Prevents the callback function from receiving XTYP_DISCONNECT notifications.
|
160
|
-
CBF_SKIP_DISCONNECTS = 0x00200000
|
161
|
-
# Prevents the callback function from receiving any notifications. Equivalent to combining all CBF_SKIP_ flags.
|
162
|
-
CBF_SKIP_ALLNOTIFICATIONS = 0x003c0000
|
163
|
-
# Notifies the callback function whenever a DDE application creates, frees, or increments the usage count of
|
164
|
-
# a string handle or whenever a string handle is freed as a result of a call to the DdeUninitialize function.
|
165
|
-
MF_HSZ_INFO = 0x01000000
|
166
|
-
# Notifies the callback function whenever the system or an application sends a DDE message.
|
167
|
-
MF_SENDMSGS = 0x02000000
|
168
|
-
# Notifies the callback function whenever the system or an application posts a DDE message.
|
169
|
-
MF_POSTMSGS = 0x04000000
|
170
|
-
# Notifies the callback function whenever a transaction is sent to any DDE callback function in the system.
|
171
|
-
MF_CALLBACKS = 0x08000000
|
172
|
-
# Notifies the callback function whenever a DDE error occurs.
|
173
|
-
MF_ERRORS = 0x10000000
|
174
|
-
# Notifies the callback function whenever an advise loop is started or ended.
|
175
|
-
MF_LINKS = 0x20000000
|
176
|
-
# Notifies the callback function whenever a conversation is established or terminated.
|
177
|
-
MF_CONV = 0x40000000
|
178
|
-
# ?
|
179
|
-
MF_MASK = 0xFF000000
|
180
|
-
|
181
|
-
# Flags Hash {FLAG=>'Flag description')}
|
182
|
-
FLAGS = {
|
183
|
-
APPCLASS_STANDARD => 'APPCLASS_STANDARD',
|
184
|
-
APPCLASS_MONITOR => 'APPCLASS_MONITOR',
|
185
|
-
APPCLASS_MASK => 'APPCLASS_MASK',
|
186
|
-
APPCMD_CLIENTONLY => 'APPCMD_CLIENTONLY',
|
187
|
-
APPCMD_FILTERINITS => 'APPCMD_FILTERINITS',
|
188
|
-
APPCMD_MASK => 'APPCMD_MASK',
|
189
|
-
CBF_FAIL_SELFCONNECTIONS => 'CBF_FAIL_SELFCONNECTIONS',
|
190
|
-
CBF_FAIL_CONNECTIONS => 'CBF_FAIL_CONNECTIONS',
|
191
|
-
CBF_FAIL_ADVISES => 'CBF_FAIL_ADVISES',
|
192
|
-
CBF_FAIL_EXECUTES => 'CBF_FAIL_EXECUTES',
|
193
|
-
CBF_FAIL_POKES => 'CBF_FAIL_POKES',
|
194
|
-
CBF_FAIL_REQUESTS => 'CBF_FAIL_REQUESTS',
|
195
|
-
CBF_FAIL_ALLSVRXACTIONS => 'CBF_FAIL_ALLSVRXACTIONS',
|
196
|
-
CBF_SKIP_CONNECT_CONFIRMS => 'CBF_SKIP_CONNECT_CONFIRMS',
|
197
|
-
CBF_SKIP_REGISTRATIONS => 'CBF_SKIP_REGISTRATIONS',
|
198
|
-
CBF_SKIP_UNREGISTRATIONS => 'CBF_SKIP_UNREGISTRATIONS',
|
199
|
-
CBF_SKIP_DISCONNECTS => 'CBF_SKIP_DISCONNECTS',
|
200
|
-
CBF_SKIP_ALLNOTIFICATIONS => 'CBF_SKIP_ALLNOTIFICATIONS',
|
201
|
-
MF_HSZ_INFO => 'MF_HSZ_INFO',
|
202
|
-
MF_SENDMSGS => 'MF_SENDMSGS',
|
203
|
-
MF_POSTMSGS => 'MF_POSTMSGS',
|
204
|
-
MF_CALLBACKS => 'MF_CALLBACKS',
|
205
|
-
MF_ERRORS => 'MF_ERRORS',
|
206
|
-
MF_LINKS => 'MF_LINKS',
|
207
|
-
MF_CONV => 'MF_CONV',
|
208
|
-
MF_MASK => 'MF_MASK'
|
209
|
-
}
|
210
|
-
|
211
|
-
# Error codes:
|
212
|
-
|
213
|
-
# Returned if DDE Init successful
|
214
|
-
DMLERR_NO_ERROR = 0x00
|
215
|
-
# First (lowest) error code
|
216
|
-
DMLERR_FIRST = 0x4000
|
217
|
-
# A request for a synchronous advise transaction has timed out.
|
218
|
-
DMLERR_ADVACKTIMEOUT = DMLERR_FIRST
|
219
|
-
# The response to the transaction caused the DDE_FBUSY flag to be set
|
220
|
-
DMLERR_BUSY = 0x4001
|
221
|
-
# A request for a synchronous data transaction has timed out.
|
222
|
-
DMLERR_DATAACKTIMEOUT = 0x4002
|
223
|
-
# A DDEML function was called without first calling the DdeInitialize function, or an invalid instance
|
224
|
-
# identifier was passed to a DDEML function.
|
225
|
-
DMLERR_DLL_NOT_INITIALIZED = 0x4003
|
226
|
-
# An application initialized as APPCLASS_MONITOR has attempted to perform a Dynamic Data Exchange (DDE) transaction,
|
227
|
-
# or an application initialized as APPCMD_CLIENTONLY has attempted to perform server transactions.
|
228
|
-
DMLERR_DLL_USAGE = 0x4004
|
229
|
-
# A request for a synchronous execute transaction has timed out.
|
230
|
-
DMLERR_EXECACKTIMEOUT = 0x4005
|
231
|
-
# A parameter failed to be validated by the DDEML. Some of the possible causes follow:
|
232
|
-
# - The application used a data handle initialized with a different item name handle than was required by the
|
233
|
-
# transaction.
|
234
|
-
# - The application used a data handle that was initialized with a different clipboard data format than was
|
235
|
-
# required by the transaction.
|
236
|
-
# - The application used a client-side conversation handle with a server-side function or vice versa.
|
237
|
-
# - The application used a freed data handle or string handle.
|
238
|
-
# - More than one instance of the application used the same object.
|
239
|
-
DMLERR_INVALIDPARAMETER = 0x4006
|
240
|
-
# A DDEML application has created a prolonged race condition (in which the server application
|
241
|
-
# outruns the client), causing large amounts of memory to be consumed.
|
242
|
-
DMLERR_LOW_MEMORY = 0x4007
|
243
|
-
# A memory allocation has failed.
|
244
|
-
DMLERR_MEMORY_ERROR = 0x4008
|
245
|
-
# A transaction has failed.
|
246
|
-
DMLERR_NOTPROCESSED = 0x4009
|
247
|
-
# A client's attempt to establish a conversation has failed.
|
248
|
-
DMLERR_NO_CONV_ESTABLISHED = 0x400a
|
249
|
-
# A request for a synchronous poke transaction has timed out.
|
250
|
-
DMLERR_POKEACKTIMEOUT = 0x400b
|
251
|
-
# An internal call to the PostMessage function has failed.
|
252
|
-
DMLERR_POSTMSG_FAILED = 0x400c
|
253
|
-
# An application instance with a synchronous transaction already in progress attempted to initiate another
|
254
|
-
# synchronous transaction, or the DdeEnableCallback function was called from within a DDEML callback function.
|
255
|
-
DMLERR_REENTRANCY = 0x400d
|
256
|
-
# A server-side transaction was attempted on a conversation terminated by the client, or the server terminated
|
257
|
-
# before completing a transaction.
|
258
|
-
DMLERR_SERVER_DIED = 0x400e
|
259
|
-
# An internal error has occurred in the DDEML.
|
260
|
-
DMLERR_SYS_ERROR = 0x400f
|
261
|
-
# A request to end an advise transaction has timed out.
|
262
|
-
DMLERR_UNADVACKTIMEOUT = 0x4010
|
263
|
-
# An invalid transaction identifier was passed to a DDEML function. Once the application has returned from an
|
264
|
-
# XTYP_XACT_COMPLETE callback, the transaction identifier for that callback function is no longer valid.
|
265
|
-
DMLERR_UNFOUND_QUEUE_ID = 0x4011
|
266
|
-
# Last (highest) error code
|
267
|
-
DMLERR_LAST = DMLERR_UNFOUND_QUEUE_ID
|
268
|
-
|
269
|
-
# Errors Hash {ERROR_CODE=>'Error description')}
|
270
|
-
ERRORS = {
|
271
|
-
nil => 'No DDEML error',
|
272
|
-
DMLERR_NO_ERROR => 'No DDEML error',
|
273
|
-
DMLERR_ADVACKTIMEOUT => 'A request for a synchronous advise transaction has timed out.',
|
274
|
-
DMLERR_BUSY => 'The response to the transaction caused the DDE_FBUSY flag to be set.',
|
275
|
-
DMLERR_DATAACKTIMEOUT => 'A request for a synchronous data transaction has timed out.',
|
276
|
-
DMLERR_DLL_NOT_INITIALIZED => 'A DDEML function was called without first calling the DdeInitialize ' +
|
277
|
-
'function, or an invalid instance identifier was passed to a DDEML function.',
|
278
|
-
DMLERR_DLL_USAGE => 'An application initialized as APPCLASS_MONITOR has attempted to perform a DDE ' +
|
279
|
-
'transaction, or an application initialized as APPCMD_CLIENTONLY has attempted to perform ' +
|
280
|
-
'server transactions.',
|
281
|
-
DMLERR_EXECACKTIMEOUT => 'A request for a synchronous execute transaction has timed out.',
|
282
|
-
DMLERR_INVALIDPARAMETER => 'A parameter failed to be validated by the DDEML. Possible causes: ' +
|
283
|
-
'Application used a data handle initialized with a different item name handle than was required ' +
|
284
|
-
'by the transaction. ' +
|
285
|
-
'The application used a data handle that was initialized with a different clipboard data format ' +
|
286
|
-
'than was required by the transaction. ' +
|
287
|
-
'The application used a client-side conversation handle with server-side function or vice versa. ' +
|
288
|
-
'The application used a freed data handle or string handle. ' +
|
289
|
-
'More than one instance of the application used the same object.',
|
290
|
-
DMLERR_LOW_MEMORY => 'A DDEML application has created a prolonged race condition (in which the server ' +
|
291
|
-
'application outruns the client), causing large amounts of memory to be consumed.',
|
292
|
-
DMLERR_MEMORY_ERROR => 'A memory allocation has failed.',
|
293
|
-
DMLERR_NO_CONV_ESTABLISHED => 'A client`s attempt to establish a conversation has failed.',
|
294
|
-
DMLERR_NOTPROCESSED => 'A transaction has failed.',
|
295
|
-
DMLERR_POKEACKTIMEOUT => 'A request for a synchronous poke transaction has timed out.',
|
296
|
-
DMLERR_POSTMSG_FAILED => 'An internal call to the PostMessage function has failed.',
|
297
|
-
DMLERR_REENTRANCY => 'An application instance with a synchronous transaction already in progress ' +
|
298
|
-
'attempted to initiate another synchronous transaction, or the DdeEnableCallback function ' +
|
299
|
-
'was called from within a DDEML callback function.',
|
300
|
-
DMLERR_SERVER_DIED => 'A server-side transaction was attempted on a conversation terminated by the ' +
|
301
|
-
'client, or the server terminated before completing a transaction.',
|
302
|
-
DMLERR_SYS_ERROR => 'An internal error has occurred in the DDEML.',
|
303
|
-
DMLERR_UNADVACKTIMEOUT => 'A request to end an advise transaction has timed out.',
|
304
|
-
DMLERR_UNFOUND_QUEUE_ID => 'An invalid transaction identifier was passed to a DDEML function. Once the ' +
|
305
|
-
'application has returned from an XTYP_XACT_COMPLETE callback, the transaction identifier for ' +
|
306
|
-
'that callback function is no longer valid.'
|
307
|
-
}
|
308
|
-
|
309
|
-
# Predefined Clipboard Formats:
|
310
|
-
|
311
|
-
# The simplest form of Clipboard data. It is a null-terminated string containing a carriage return
|
312
|
-
# and linefeed at the end of each line.
|
313
|
-
CF_TEXT = 1
|
314
|
-
# A Windows version 2.x-compatible bitmap
|
315
|
-
CF_BITMAP = 2
|
316
|
-
# A metafile picture structure. See docs for Microsoft Windows Software Development Kit.
|
317
|
-
CF_METAFILEPICT = 3
|
318
|
-
# Microsoft symbolic link (SYLK) format. Microsoft Excel for the Apple Macintosh was originally designed to use
|
319
|
-
# SYLK format, and this format is now supported by Microsoft Excel on both the Windows and Macintosh platforms
|
320
|
-
CF_SYLK = 4
|
321
|
-
# An ASCII format used by the VisiCalc spreadsheet program
|
322
|
-
CF_DIF = 5
|
323
|
-
CF_TIFF = 6
|
324
|
-
CF_OEMTEXT = 7
|
325
|
-
CF_DIB = 8
|
326
|
-
CF_PALETTE = 9
|
327
|
-
CF_PENDATA = 10
|
328
|
-
CF_RIFF = 11
|
329
|
-
CF_WAVE = 12
|
330
|
-
CF_UNICODETEXT = 13
|
331
|
-
CF_ENHMETAFILE = 14
|
332
|
-
# Filename copied to clipboard
|
333
|
-
CF_HDROP = 15
|
334
|
-
CF_LOCALE = 16
|
335
|
-
CF_MAX = 17
|
336
|
-
|
337
|
-
# DdeClientTransaction timeout value indicating async transaction
|
338
|
-
TIMEOUT_ASYNC = 0xFFFFFFFF
|
339
|
-
|
340
|
-
# The MONCBSTRUCT structure contains information about the current Dynamic Data Exchange (DDE)
|
341
|
-
# transaction. A DDE debugging application can use this structure when monitoring transactions that the
|
342
|
-
# system passes to the DDE callback functions of other applications.
|
343
|
-
#
|
344
|
-
# [*Typedef*] struct { UINT cb; DWORD dwTime; HANDLE hTask; DWORD dwRet; UINT wType; UINT wFmt; HCONV
|
345
|
-
# hConv; HSZ hsz1; HSZ hsz2; HDDEDATA hData; ULONG_PTR dwData1; ULONG_PTR dwData2;
|
346
|
-
# CONVCONTEXT cc; DWORD cbData; DWORD Data[8] } MONCBSTRUCT;
|
347
|
-
#
|
348
|
-
# cb:: Specifies the structure's size, in bytes.
|
349
|
-
# dwTime:: Specifies the Windows time at which the transaction occurred. Windows time is the number of
|
350
|
-
# milliseconds that have elapsed since the system was booted.
|
351
|
-
# hTask:: Handle to the task (app instance) containing the DDE callback function that received the transaction.
|
352
|
-
# dwRet:: Specifies the value returned by the DDE callback function that processed the transaction.
|
353
|
-
# wType:: Specifies the transaction type.
|
354
|
-
# wFmt:: Specifies the format of the data exchanged (if any) during the transaction.
|
355
|
-
# hConv:: Handle to the conversation in which the transaction took place.
|
356
|
-
# hsz1:: Handle to a string.
|
357
|
-
# hsz2:: Handle to a string.
|
358
|
-
# hData:: Handle to the data exchanged (if any) during the transaction.
|
359
|
-
# dwData1:: Specifies additional data.
|
360
|
-
# dwData2:: Specifies additional data.
|
361
|
-
# cc:: Specifies a CONVCONTEXT structure containing language information used to share data in different languages.
|
362
|
-
# cbData:: Specifies the amount, in bytes, of data being passed with the transaction. This value can be
|
363
|
-
# more than 32 bytes.
|
364
|
-
# Data:: Contains the first 32 bytes of data being passed with the transaction (8 * sizeof(DWORD)).
|
365
|
-
# ---
|
366
|
-
# *Information*:
|
367
|
-
# Header Declared in Ddeml.h, include Windows.h
|
368
|
-
|
369
|
-
class MonCbStruct < FFI::Struct # :nodoc:
|
370
|
-
layout :cb, :uint,
|
371
|
-
:dw_time, :uint32,
|
372
|
-
:h_task, :ulong,
|
373
|
-
:dw_ret, :uint32,
|
374
|
-
:w_type, :uint,
|
375
|
-
:w_fmt, :uint,
|
376
|
-
:h_conv, :ulong,
|
377
|
-
:hsz1, :ulong,
|
378
|
-
:hsz2, :ulong,
|
379
|
-
:h_data, :pointer,
|
380
|
-
:dw_data1, :pointer,
|
381
|
-
:dw_data2, :pointer,
|
382
|
-
:cc, :pointer,
|
383
|
-
:cb_data, :uint32,
|
384
|
-
:data, [:uint32, 8]
|
385
|
-
end
|
386
|
-
|
387
|
-
# The MONCONVSTRUCT structure contains information about a Dynamic Data Exchange (DDE) conversation. A
|
388
|
-
# DDE monitoring application can use this structure to obtain information about a conversation that has
|
389
|
-
# been established or has terminated.
|
390
|
-
#
|
391
|
-
# [*Typedef*] struct { UINT cb; BOOL fConnect; DWORD dwTime; HANDLE hTask; HSZ hszSvc; HSZ hszTopic;
|
392
|
-
# HCONV hConvClient; HCONV hConvServer } MONCONVSTRUCT;
|
393
|
-
#
|
394
|
-
# cb:: Specifies the structure's size, in bytes.
|
395
|
-
# fConnect:: Indicates whether the conversation is currently established. A value of TRUE indicates the
|
396
|
-
# conversation is established; FALSE indicates it is not.
|
397
|
-
# dwTime:: Specifies the Windows time at which the conversation was established or terminated. Windows
|
398
|
-
# time is the number of milliseconds that have elapsed since the system was booted.
|
399
|
-
# hTask:: Handle to a task (application instance) that is a partner in the conversation.
|
400
|
-
# hszSvc:: Handle to the service name on which the conversation is established.
|
401
|
-
# hszTopic:: Handle to the topic name on which the conversation is established.
|
402
|
-
# hConvClient:: Handle to the client conversation.
|
403
|
-
# hConvServer:: Handle to the server conversation.
|
404
|
-
# ---
|
405
|
-
# *Remarks*:
|
406
|
-
#
|
407
|
-
# Because string handles are local to the process, the hszSvc and hszTopic members are global atoms.
|
408
|
-
# Similarly, conversation handles are local to the instance; therefore, the hConvClient and hConvServer
|
409
|
-
# members are window handles.
|
410
|
-
# The hConvClient and hConvServer members of the MONCONVSTRUCT structure do not hold the same value as
|
411
|
-
# would be seen by the applications engaged in the conversation. Instead, they hold a globally unique
|
412
|
-
# pair of values that identify the conversation.
|
413
|
-
# ---
|
414
|
-
# Structure Information:
|
415
|
-
# Header Declared in Ddeml.h, include Windows.h
|
416
|
-
#
|
417
|
-
class MonConvStruct < FFI::Struct # :nodoc:
|
418
|
-
layout :cb, :uint,
|
419
|
-
:f_connect, :uchar,
|
420
|
-
:dw_time, :uint32,
|
421
|
-
:h_task, :ulong,
|
422
|
-
:hsz_svc, :ulong,
|
423
|
-
:hsz_topic, :ulong,
|
424
|
-
:h_conv_client, :ulong,
|
425
|
-
:h_conv_server, :ulong
|
426
|
-
end
|
427
|
-
|
428
|
-
# The MONERRSTRUCT structure contains information about the current Dynamic Data Exchange (DDE) error. A
|
429
|
-
# DDE monitoring application can use this structure to monitor errors returned by DDE Management Library
|
430
|
-
# functions.
|
431
|
-
#
|
432
|
-
# [*Typedef*] struct { UINT cb; UINT wLastError; DWORD dwTime; HANDLE hTask } MONERRSTRUCT;
|
433
|
-
#
|
434
|
-
# cb:: Specifies the structure's size, in bytes.
|
435
|
-
# wLastError:: Specifies the current error.
|
436
|
-
# dwTime:: Specifies the Windows time at which the error occurred. Windows time is the number of
|
437
|
-
# milliseconds that have elapsed since the system was booted.
|
438
|
-
# hTask:: Handle to the task (application instance) that called the DDE function that caused the error.
|
439
|
-
# ---
|
440
|
-
# Structure Information:
|
441
|
-
# Header Declared in Ddeml.h, include Windows.h
|
442
|
-
#
|
443
|
-
class MonErrStruct < FFI::Struct # :nodoc:
|
444
|
-
layout :cb, :uint,
|
445
|
-
:w_last_error, :uint,
|
446
|
-
:dw_time, :uint32,
|
447
|
-
:h_task, :ulong
|
448
|
-
end
|
449
|
-
|
450
|
-
MH_CREATE = 1
|
451
|
-
MH_KEEP = 2
|
452
|
-
MH_DELETE = 3
|
453
|
-
MH_CLEANUP = 4
|
454
|
-
|
455
|
-
# The MONHSZSTRUCT structure contains information about a Dynamic Data Exchange (DDE) string handle. A
|
456
|
-
# DDE monitoring application can use this structure when monitoring the activity of the string manager
|
457
|
-
# component of the DDE Management Library.
|
458
|
-
#
|
459
|
-
# [*Typedef*] struct { UINT cb; BOOL fsAction; DWORD dwTime; HSZ hsz; HANDLE hTask; TCHAR str[1] } MONHSZSTRUCT;
|
460
|
-
#
|
461
|
-
# cb:: Specifies the structure's size, in bytes.
|
462
|
-
# fsAction:: Specifies the action being performed on the string identified by the hsz member.
|
463
|
-
# MH_CLEANUP:: An application is freeing its DDE resources, causing the system to delete string handles
|
464
|
-
# the application had created. (The application called the DdeUninitialize function.)
|
465
|
-
# MH_CREATE:: An application is creating a string handle. (The app called the DdeCreateStringHandle)
|
466
|
-
# MH_DELETE:: An application is deleting a string handle. (The app called the DdeFreeStringHandle)
|
467
|
-
# MH_KEEP:: An application is increasing the usage count of a string handle. (The application called the
|
468
|
-
# DdeKeepStringHandle function.)
|
469
|
-
# dwTime:: Specifies the Windows time at which the action specified by the fsAction member takes place.
|
470
|
-
# Windows time is the number of milliseconds that have elapsed since the system was booted.
|
471
|
-
# hsz:: Handle to the string. Because string handles are local to the process, this member is a global atom.
|
472
|
-
# hTask:: Handle to the task (application instance) performing the action on the string handle.
|
473
|
-
# str:: Pointer to the string identified by the hsz member.
|
474
|
-
# ---
|
475
|
-
# Structure Information
|
476
|
-
# Header Declared in Ddeml.h, include Windows.h
|
477
|
-
#
|
478
|
-
class MonHszStruct < FFI::Struct # :nodoc:
|
479
|
-
layout :cb, :uint,
|
480
|
-
:fs_action, :uchar,
|
481
|
-
:dw_time, :uint32,
|
482
|
-
:hsz, :ulong,
|
483
|
-
:h_task, :ulong,
|
484
|
-
:str, :pointer
|
485
|
-
end
|
486
|
-
|
487
|
-
# The MONLINKSTRUCT structure contains information about a Dynamic Data Exchange (DDE) advise loop. A
|
488
|
-
# DDE monitoring application can use this structure to obtain information about an advise loop that has
|
489
|
-
# started or ended.
|
490
|
-
#
|
491
|
-
# [*Typedef*] struct { UINT cb; DWORD dwTime; HANDLE hTask; BOOL fEstablished; BOOL fNoData; HSZ hszSvc;
|
492
|
-
# HSZ hszTopic; HSZ hszItem; UINT wFmt; BOOL fServer; HCONV hConvServer; HCONV hConvClient }
|
493
|
-
# MONLINKSTRUCT;
|
494
|
-
#
|
495
|
-
# cb:: Specifies the structure's size, in bytes.
|
496
|
-
# dwTime:: Specifies the Windows time at which the advise loop was started or ended. Windows time is the
|
497
|
-
# number of milliseconds that have elapsed since the system was booted.
|
498
|
-
# hTask:: Handle to a task (application instance) that is a partner in the advise loop.
|
499
|
-
# fEstablished:: Indicates whether an advise loop was successfully established. A value of TRUE
|
500
|
-
# indicates an advise loop was established; FALSE indicates it was not.
|
501
|
-
# fNoData:: Indicates whether the XTYPF_NODATA flag is set for the advise loop. A value of TRUE
|
502
|
-
# indicates the flag is set; FALSE indicates it is not.
|
503
|
-
# hszSvc:: Handle to the service name of the server in the advise loop.
|
504
|
-
# hszTopic:: Handle to the topic name on which the advise loop is established.
|
505
|
-
# hszItem:: Handle to the item name that is the subject of the advise loop.
|
506
|
-
# wFmt:: Specifies the format of the data exchanged (if any) during the advise loop.
|
507
|
-
# fServer:: Indicates whether the link notification came from the server. A value of TRUE indicates the
|
508
|
-
# notification came from the server; FALSE indicates otherwise.
|
509
|
-
# hConvServer:: Handle to the server conversation.
|
510
|
-
# hConvClient:: Handle to the client conversation.
|
511
|
-
# ---
|
512
|
-
# *Remarks*:
|
513
|
-
# Because string handles are local to the process, the hszSvc, hszTopic, and hszItem members are global atoms.
|
514
|
-
# The hConvClient and hConvServer members of the MONLINKSTRUCT structure do not hold the same value as
|
515
|
-
# would be seen by the applications engaged in the conversation. Instead, they hold a globally unique
|
516
|
-
# pair of values that identify the conversation.
|
517
|
-
# ---
|
518
|
-
# Structure Information
|
519
|
-
# Header Declared in Ddeml.h, include Windows.h
|
520
|
-
#
|
521
|
-
class MonLinkStruct < FFI::Struct # :nodoc:
|
522
|
-
layout :cb, :uint,
|
523
|
-
:dw_time, :uint32,
|
524
|
-
:h_task, :ulong,
|
525
|
-
:f_established, :uchar,
|
526
|
-
:f_no_data, :uchar,
|
527
|
-
:hsz_svc, :ulong,
|
528
|
-
:hsz_topic, :ulong,
|
529
|
-
:hsz_item, :ulong,
|
530
|
-
:w_fmt, :uint,
|
531
|
-
:f_server, :uchar,
|
532
|
-
:h_conv_server, :ulong,
|
533
|
-
:h_conv_client, :ulong
|
534
|
-
end
|
535
|
-
|
536
|
-
# The MONMSGSTRUCT structure contains information about a Dynamic Data Exchange (DDE) message. A DDE
|
537
|
-
# monitoring application can use this structure to obtain information about a DDE message that was sent
|
538
|
-
# or posted.
|
539
|
-
#
|
540
|
-
# [*Typedef*] struct { UINT cb; HWND hwndTo; DWORD dwTime; HANDLE hTask; UINT wMsg; WPARAM wParam;
|
541
|
-
# LPARAM lParam; DDEML_MSG_HOOK_DATA dmhd } MONMSGSTRUCT;
|
542
|
-
#
|
543
|
-
# cb:: Specifies the structure's size, in bytes.
|
544
|
-
# hwndTo:: Handle to the window that receives the DDE message.
|
545
|
-
# dwTime:: Specifies the Windows time at which the message was sent or posted. Windows time is the
|
546
|
-
# number of milliseconds that have elapsed since the system was booted.
|
547
|
-
# hTask:: Handle to the task (application instance) containing the window that receives the DDE message.
|
548
|
-
# wMsg:: Specifies the identifier of the DDE message.
|
549
|
-
# wParam:: Specifies the wParam parameter of the DDE message.
|
550
|
-
# lParam:: Specifies the lParam parameter of the DDE message.
|
551
|
-
# dmhd:: Specifies a DDEML_MSG_HOOK_DATA structure that contains additional information about the DDE message.
|
552
|
-
# ---
|
553
|
-
# Structure Information
|
554
|
-
# Header Declared in Ddeml.h, include Windows.h
|
555
|
-
#
|
556
|
-
class MonMsgStruct < FFI::Struct # :nodoc:
|
557
|
-
layout :cb, :uint,
|
558
|
-
:hwnd_to, :ulong,
|
559
|
-
:dw_time, :uint32,
|
560
|
-
:h_task, :ulong,
|
561
|
-
:w_msg, :uint,
|
562
|
-
:w_param, :uint,
|
563
|
-
:l_param, :long,
|
564
|
-
:dmhd, :pointer
|
565
|
-
end
|
566
|
-
|
567
|
-
# The DDEML_MSG_HOOK_DATA structure contains information about a Dynamic Data Exchange (DDE) message,
|
568
|
-
# and provides read access to the data referenced by the message. This structure is intended to be used
|
569
|
-
# by a Dynamic Data Exchange Management Library (DDEML) monitoring application.
|
570
|
-
#
|
571
|
-
# [*Typedef*] struct { UINT_PTR uiLo; UINT_PTR uiHi; DWORD cbData; DWORD Data } DDEML_MSG_HOOK_DATA;
|
572
|
-
#
|
573
|
-
# uiLo:: Specifies the unpacked low-order word of the lParam parameter associated with the DDE message.
|
574
|
-
# uiHi:: Specifies the unpacked high-order word of the lParam parameter associated with the DDE message.
|
575
|
-
# cbData:: Specifies the amount, in bytes, of data being passed with the message. This value can be > 32.
|
576
|
-
# Data:: Contains the first 32 bytes of data being passed with the message (8 * sizeof(DWORD)).
|
577
|
-
# ---
|
578
|
-
# Structure Information
|
579
|
-
# Header Declared in Ddeml.h, include Windows.h
|
580
|
-
#
|
581
|
-
class DdemlMsgHookData < FFI::Struct # :nodoc:
|
582
|
-
layout :ui_lo, :uint,
|
583
|
-
:ui_hi, :uint,
|
584
|
-
:cb_data, :uint32,
|
585
|
-
:data, :uint32
|
586
|
-
end
|
587
|
-
|
588
|
-
##
|
589
|
-
# The RegisterClipboardFormat function registers a new clipboard format.
|
590
|
-
# This format can then be used as a valid clipboard format.
|
591
|
-
#
|
592
|
-
# [*Syntax*] UINT RegisterClipboardFormat( LPCTSTR lpszFormat )
|
593
|
-
#
|
594
|
-
# lpszFormat:: [in] Pointer to a null-terminated string that names the new format.
|
595
|
-
#
|
596
|
-
# *Returns*:: :uint or nil. If the function succeeds, the return value identifies the registered clipboard format.
|
597
|
-
# If the function fails, the return value is *nil*(not zero). For error info, call GetLastError.
|
598
|
-
# ---
|
599
|
-
# *Remarks*:
|
600
|
-
# If a registered format with the specified name already exists, a new format is not registered and the
|
601
|
-
# return value identifies the existing format. This enables more than one application to copy and paste
|
602
|
-
# data using the same registered clipboard format. Note that the comparison is case-insensitive.
|
603
|
-
# Registered clipboard formats are identified by values in the range 0xC000 through 0xFFFF.
|
604
|
-
# When registered clipboard formats are placed on or retrieved from the clipboard, they must be in the
|
605
|
-
# form of an HGLOBAL value.
|
606
|
-
#
|
607
|
-
# :call-seq:
|
608
|
-
# format_id = register_clipboard_format( format_name )
|
609
|
-
#
|
610
|
-
function :RegisterClipboardFormat, [:pointer], :uint, zeronil: true
|
611
|
-
|
612
|
-
##
|
613
|
-
# The DdeCallback function is an application-defined callback function used with the Dynamic Data Exchange
|
614
|
-
# Management Library (DDEML) functions. It processes Dynamic Data Exchange (DDE) transactions. The PFNCALLBACK
|
615
|
-
# type defines a pointer to this callback function. DdeCallback is a placeholder for the application-defined
|
616
|
-
# function name.
|
617
|
-
#
|
618
|
-
# [*Syntax*] HDDEDATA CALLBACK DdeCallback( UINT uType, UINT uFmt, HCONV hconv, HDDEDATA hsz1, HDDEDATA hsz2,
|
619
|
-
# HDDEDATA hdata, HDDEDATA dwData1, HDDEDATA dwData2);
|
620
|
-
# uType:: [in] Specifies the type of the current transaction. This parameter consists of a combination of
|
621
|
-
# transaction class flags and transaction type flags. The following table describes each of the
|
622
|
-
# transaction classes and provides a list of the transaction types in each class. For information
|
623
|
-
# about a specific transaction type, see the individual description of that type.
|
624
|
-
# - XCLASS_BOOL - A DDE callback function should return TRUE or FALSE when it finishes processing a
|
625
|
-
# transaction that belongs to this class. The XCLASS_BOOL class consists of the following types:
|
626
|
-
# - XTYP_ADVSTART
|
627
|
-
# - *XTYP_CONNECT*: A client uses the XTYP_CONNECT transaction to establish a conversation.
|
628
|
-
# hsz1:: Handle to the topic name.
|
629
|
-
# hsz2:: Handle to the service name.
|
630
|
-
# dwData1:: Pointer to a CONVCONTEXT structure that contains context information for the conversation.
|
631
|
-
# If the client is not a Dynamic Data Exchange Management Library (DDEML) application,
|
632
|
-
# this parameter is 0.
|
633
|
-
# dwData2:: Specifies whether the client is the same application instance as the server. If the
|
634
|
-
# parameter is 1, the client is the same instance. If the parameter is 0, the client
|
635
|
-
# is a different instance.
|
636
|
-
# *Returns*:: A server callback function should return TRUE to allow the client to establish a
|
637
|
-
# conversation on the specified service name and topic name pair, or the function
|
638
|
-
# should return FALSE to deny the conversation. If the callback function returns TRUE
|
639
|
-
# and a conversation is successfully established, the system passes the conversation
|
640
|
-
# handle to the server by issuing an XTYP_CONNECT_CONFIRM transaction to the server's
|
641
|
-
# callback function (unless the server specified the CBF_SKIP_CONNECT_CONFIRMS flag
|
642
|
-
# in the DdeInitialize function).
|
643
|
-
# - XCLASS_DATA - A DDE callback function should return a DDE handle, the CBR_BLOCK return code, or
|
644
|
-
# NULL when it finishes processing a transaction that belongs to this class. The XCLASS_DATA
|
645
|
-
# transaction class consists of the following types:
|
646
|
-
# - XTYP_ADVREQ
|
647
|
-
# - XTYP_REQUEST
|
648
|
-
# - XTYP_WILDCONNECT
|
649
|
-
# - XCLASS_FLAGS - A DDE callback function should return DDE_FACK, DDE_FBUSY, or DDE_FNOTPROCESSED
|
650
|
-
# when it finishes processing a transaction that belongs to this class. The XCLASS_FLAGS transaction
|
651
|
-
# class consists of the following types:
|
652
|
-
# - XTYP_ADVDATA
|
653
|
-
# - XTYP_EXECUTE
|
654
|
-
# - *XTYP_POKE*: A client uses the XTYP_POKE transaction to send unsolicited data to the server.
|
655
|
-
# uFmt:: Specifies the format of the data sent from the server.
|
656
|
-
# hconv:: Handle to the conversation.
|
657
|
-
# hsz1:: Handle to the topic name.
|
658
|
-
# hsz2:: Handle to the item name.
|
659
|
-
# hdata:: Handle to the data that the client is sending to the server.
|
660
|
-
# *Returns*:: A server callback function should return the DDE_FACK flag if it processes this
|
661
|
-
# transaction, the DDE_FBUSY flag if it is too busy to process this transaction,
|
662
|
-
# or the DDE_FNOTPROCESSED flag if it rejects this transaction.
|
663
|
-
# - XCLASS_NOTIFICATION - The transaction types that belong to this class are for notification purposes
|
664
|
-
# only. The return value from the callback function is ignored. The XCLASS_NOTIFICATION transaction
|
665
|
-
# class consists of the following types:
|
666
|
-
# - XTYP_ADVSTOP
|
667
|
-
# - XTYP_CONNECT_CONFIRM
|
668
|
-
# - XTYP_DISCONNECT
|
669
|
-
# - XTYP_ERROR
|
670
|
-
# - XTYP_MONITOR
|
671
|
-
# - XTYP_REGISTER
|
672
|
-
# - XTYP_XACT_COMPLETE
|
673
|
-
# - XTYP_UNREGISTER
|
674
|
-
# uFmt:: [in] Specifies the format in which data is sent or received.
|
675
|
-
# hconv:: [in] Handle to the conversation associated with the current transaction.
|
676
|
-
# hsz1:: [in] Handle to a string. The meaning of this parameter depends on the type of the current transaction.
|
677
|
-
# For the meaning of this parameter, see the description of the transaction type.
|
678
|
-
# hsz2:: [in] Handle to a string. The meaning of this parameter depends on the type of the current transaction.
|
679
|
-
# For the meaning of this parameter, see the description of the transaction type.
|
680
|
-
# hdata:: [in] Handle to DDE data. The meaning of this parameter depends on the type of the current transaction.
|
681
|
-
# For the meaning of this parameter, see the description of the transaction type.
|
682
|
-
# dwData1:: [in] Specifies transaction-specific data. For the meaning, see the description of the transaction type.
|
683
|
-
# dwData2:: [in] Specifies transaction-specific data. For the meaning, see the description of the transaction type.
|
684
|
-
# *Returns*:: The return value depends on the transaction class. For more information about the return values,
|
685
|
-
# see descriptions of the individual transaction types.
|
686
|
-
# ---
|
687
|
-
# *Remarks*:
|
688
|
-
# - The callback function is called asynchronously for transactions that do not involve the creation or termination
|
689
|
-
# of conversations. An application that does not frequently accept incoming messages will have reduced DDE
|
690
|
-
# performance because the Dynamic Data Exchange Management Library (DDEML) uses messages to initiate transactions.
|
691
|
-
# - An application must register the callback function by specifying a pointer to the function in a call to the
|
692
|
-
# DdeInitialize function.
|
693
|
-
#
|
694
|
-
# :call-seq:
|
695
|
-
# DdeCallback block: {|type, format, hconv, hsz1, hsz2, hdata, data1, data2| your code }
|
696
|
-
#
|
697
|
-
callback :DdeCallback, [:uint, :uint, :HCONV, :HDDEDATA, :HDDEDATA, :HDDEDATA, :HDDEDATA, :HDDEDATA], :HDDEDATA
|
698
|
-
|
699
|
-
##
|
700
|
-
# The DdeInitialize function registers an application with the Dynamic Data Exchange Management Library (DDEML).
|
701
|
-
# An application must call this function before calling any other DDEML function.
|
702
|
-
#
|
703
|
-
# [*Syntax*] UINT DdeInitialize( LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd, DWORD ulRes );
|
704
|
-
#
|
705
|
-
# pidInst:: [in, out] Pointer to the application instance identifier.
|
706
|
-
# At initialization, this parameter should point to 0. If the function succeeds, this parameter points
|
707
|
-
# to the instance identifier for the application. This value should be passed as the idInst parameter
|
708
|
-
# in all other DDEML functions that require it. If an application uses multiple instances of the DDEML
|
709
|
-
# dynamic-link library (DLL), the application should provide a different callback function for each
|
710
|
-
# instance. If pidInst points to a nonzero value, reinitialization of the DDEML is implied. In this
|
711
|
-
# case, pidInst must point to a valid application-instance identifier.
|
712
|
-
# pfnCallback:: Pointer to the application-defined Dynamic Data Exchange DdeCallback function. This function
|
713
|
-
# processes DDE transactions sent by the system. For more information, see the DdeCallback.
|
714
|
-
# afCmd:: [in] Specifies a set of APPCMD_, CBF_, and MF_ flags. The APPCMD_ flags provide special
|
715
|
-
# instructions to DdeInitialize. The CBF_ flags specify filters that prevent specific types of transactions
|
716
|
-
# from reaching the callback function. The MF_ flags specify the types of DDE activity that a DDE monitoring
|
717
|
-
# application monitors. Using these flags enhances the performance of a DDE application by eliminating
|
718
|
-
# unnecessary calls to the callback function. This parameter can be one or more of the following values:
|
719
|
-
# APPCLASS_MONITOR, APPCLASS_STANDARD, APPCMD_CLIENTONLY, APPCMD_FILTERINITS;
|
720
|
-
# CBF_FAIL_ALLSVRXACTIONS, CBF_FAIL_ADVISES, CBF_FAIL_CONNECTIONS, CBF_FAIL_EXECUTES, CBF_FAIL_POKES
|
721
|
-
# CBF_FAIL_REQUESTS, CBF_FAIL_SELFCONNECTIONS, CBF_SKIP_ALLNOTIFICATIONS, CBF_SKIP_CONNECT_CONFIRMS
|
722
|
-
# CBF_SKIP_DISCONNECTS, CBF_SKIP_REGISTRATIONS, CBF_SKIP_UNREGISTRATIONS;
|
723
|
-
# MF_CALLBACKS, MF_CONV, MF_ERRORS, MF_HSZ_INFO, MF_LINKS, MF_POSTMSGS, MF_SENDMSGS
|
724
|
-
# ulRes:: Reserved; must be set to zero.
|
725
|
-
#
|
726
|
-
# *Returns*:: If the function succeeds, the return value is DMLERR_NO_ERROR. If the function fails, the return
|
727
|
-
# value is one of the following values:
|
728
|
-
# - DMLERR_DLL_USAGE
|
729
|
-
# - DMLERR_INVALIDPARAMETER
|
730
|
-
# - DMLERR_SYS_ERROR
|
731
|
-
# ---
|
732
|
-
# <b> Enhanced API accepts only 2 parameters (get rid of reserved hsz2):
|
733
|
-
# instance_id:: (optional) Application instance identifier. At initialization, this parameter should be 0, nil
|
734
|
-
# or omitted altogether. If it is nonzero/non-nil, reinitialization of the DDEML is implied.
|
735
|
-
# cmd(afCmd):: obligatory set of flags
|
736
|
-
# ---
|
737
|
-
# *Remarks*:
|
738
|
-
# - An application that uses multiple instances of the DDEML must not pass DDEML objects between instances.
|
739
|
-
# - A DDE monitoring application should not attempt to perform DDE operations (establish conversations,
|
740
|
-
# issue transactions, and so on) within the context of the same application instance.
|
741
|
-
# - A synchronous transaction fails with a DMLERR_REENTRANCY error if any instance of the same task has
|
742
|
-
# a synchronous transaction already in progress.
|
743
|
-
# - The CBF_FAIL_ALLSVRXACTIONS flag causes the DDEML to filter all server transactions and can be changed
|
744
|
-
# by a subsequent call to DdeInitialize. The APPCMD_CLIENTONLY flag prevents the DDEML from creating key
|
745
|
-
# resources for the server and cannot be changed by a subsequent call to DdeInitialize.
|
746
|
-
# - There is an ANSI version and a Unicode version of DdeInitialize. The version called determines the
|
747
|
-
# type of the window procedures used to control DDE conversations (ANSI or Unicode), and the default
|
748
|
-
# value for the iCodePage member of the CONVCONTEXT structure (CP_WINANSI or CP_WINUNICODE).
|
749
|
-
#
|
750
|
-
# :call-seq:
|
751
|
-
# instance_id, status = dde_initialize( [instance_id = 0], cmd )
|
752
|
-
# {|type, format, hconv, hsz1, hsz2, hdata, data1, data2| your dde_callback block}
|
753
|
-
#
|
754
|
-
function :DdeInitialize, [:pointer, :DdeCallback, :uint32, :uint32], :uint,
|
755
|
-
&->(api, old_id=0, cmd, &block){
|
756
|
-
raise ArgumentError, 'No callback block' unless block
|
757
|
-
old_id = 0 unless old_id
|
758
|
-
id = FFI::MemoryPointer.new(:uint32).put_uint32(0, old_id)
|
759
|
-
status = api.call(id, block, cmd, 0)
|
760
|
-
id = status == 0 ? id.get_uint32(0) : nil
|
761
|
-
[id, status] }
|
762
|
-
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
763
|
-
|
764
|
-
##
|
765
|
-
# The DdeUninitialize function frees all Dynamic Data Exchange Management Library (DDEML) resources associated
|
766
|
-
# with the calling application.
|
767
|
-
#
|
768
|
-
# [*Syntax*] BOOL DdeUninitialize( DWORD idInst);
|
769
|
-
#
|
770
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
771
|
-
# *Returns*:: If the function succeeds, the return value is nonzero.
|
772
|
-
# If the function fails, the return value is zero.
|
773
|
-
# ---
|
774
|
-
# *Remarks*
|
775
|
-
# DdeUninitialize terminates any conversations currently open for the application.
|
776
|
-
#
|
777
|
-
# :call-seq:
|
778
|
-
# success = dde_uninitialize( instance_id )
|
779
|
-
#
|
780
|
-
function :DdeUninitialize, [:uint32], :int, boolean: true
|
781
|
-
|
782
|
-
##
|
783
|
-
# The DdeCreateStringHandle function creates a handle that identifies the specified string.
|
784
|
-
# A Dynamic Data Exchange (DDE) client or server application can pass the string handle as a
|
785
|
-
# parameter to other Dynamic Data Exchange Management Library (DDEML) functions.
|
786
|
-
#
|
787
|
-
# [*Syntax*] HSZ DdeCreateStringHandle( DWORD idInst, LPTSTR psz, int iCodePage );
|
788
|
-
#
|
789
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the
|
790
|
-
# DdeInitialize function.
|
791
|
-
# psz:: [in] Pointer to a buffer that contains the null-terminated string for which a handle
|
792
|
-
# is to be created. This string can be up to 255 characters. The reason for this limit is that
|
793
|
-
# DDEML string management functions are implemented using global atoms.
|
794
|
-
# iCodePage:: [in] Specifies the code page used to render the string. This value should be either
|
795
|
-
# CP_WINANSI (the default code page) or CP_WINUNICODE, depending on whether the ANSI or Unicode
|
796
|
-
# version of DdeInitialize was called by the client application.
|
797
|
-
#
|
798
|
-
# *Returns*:: (L) or nil: If the function succeeds, the return value is a string handle.
|
799
|
-
# If the function fails, the return value is 0(changed to nil in enhanced version).
|
800
|
-
# The DdeGetLastError function can be used to get the error code, which can be one of the
|
801
|
-
# following values: DMLERR_NO_ERROR, DMLERR_INVALIDPARAMETER, DMLERR_SYS_ERROR
|
802
|
-
# ---
|
803
|
-
# <b> Enhanced (snake_case) API makes code_page param optional and returns *nil* if handle creation fails. </b>
|
804
|
-
# ---
|
805
|
-
# *Remarks*: The value of a string handle is not related to the case of the string it identifies.
|
806
|
-
# When an application either creates a string handle or receives one in the callback function
|
807
|
-
# and then uses the DdeKeepStringHandle function to keep it, the application must free that string
|
808
|
-
# handle when it is no longer needed. An instance-specific string handle cannot be mapped from string
|
809
|
-
# handle to string and back to string handle.
|
810
|
-
#
|
811
|
-
# :call-seq:
|
812
|
-
# string_handle = dde_create_string_handle( instance_id, string, code_page_id )
|
813
|
-
#
|
814
|
-
function :DdeCreateStringHandle, [:uint32, :pointer, :int], :ulong, zeronil: true,
|
815
|
-
&->(api, instance_id, string, code_page=CP_WINANSI){
|
816
|
-
string_pointer = FFI::MemoryPointer.from_string(string)
|
817
|
-
api.call(instance_id, string_pointer, code_page) }
|
818
|
-
|
819
|
-
##
|
820
|
-
# The DdeFreeStringHandle function frees a string handle in the calling application.
|
821
|
-
#
|
822
|
-
# [*Syntax*] BOOL DdeFreeStringHandle( DWORD idInst, HSZ hsz );
|
823
|
-
#
|
824
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
825
|
-
# hsz:: [in, out] Handle to the string handle to be freed. This handle must have been created by a previous call
|
826
|
-
# to the DdeCreateStringHandle function.
|
827
|
-
# *Returns*:: If the function succeeds, the return value is nonzero. If the function fails, it is zero.
|
828
|
-
# ---
|
829
|
-
# <b> Enhanced snake_case API returns boolean true/false as a success indicator. </b>
|
830
|
-
# ---
|
831
|
-
# *Remarks*:
|
832
|
-
# An application can free string handles it creates with DdeCreateStringHandle but should not free those that
|
833
|
-
# the system passed to the application's Dynamic Data Exchange (DDE) callback function or those returned in the
|
834
|
-
# CONVINFO structure by the DdeQueryConvInfo function.
|
835
|
-
#
|
836
|
-
# :call-seq:
|
837
|
-
# success = dde_free_string_handle( instance_id, string_handle )
|
838
|
-
#
|
839
|
-
function :DdeFreeStringHandle, [:uint32, :ulong], :int, boolean: true
|
840
|
-
|
841
|
-
##
|
842
|
-
# The DdeQueryString function copies text associated with a string handle into a buffer.
|
843
|
-
#
|
844
|
-
# [*Syntax*] DWORD DdeQueryString( DWORD idInst, HSZ hsz, LPTSTR psz, DWORD cchMax, int iCodePage);
|
845
|
-
#
|
846
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
847
|
-
# hsz:: [in] Handle to the string to copy. This handle must have been created by a previous call to the
|
848
|
-
# DdeCreateStringHandle function.
|
849
|
-
# psz:: [in, out] Pointer to a buffer that receives the string. To obtain the length of the string, this parameter
|
850
|
-
# should be set to NULL.
|
851
|
-
# cchMax:: [in] Specifies the length, in TCHARs, of the buffer pointed to by the psz parameter. For the ANSI
|
852
|
-
# version of the function, this is the number of bytes; for the Unicode version, this is the number of
|
853
|
-
# characters. If the string is longer than ( cchMax– 1), it will be truncated. If the psz parameter is
|
854
|
-
# set to NULL, this parameter is ignored.
|
855
|
-
# iCodePage:: [in] Code page used to render the string. This value should be either CP_WINANSI or CP_WINUNICODE.
|
856
|
-
#
|
857
|
-
# *Returns*:: If the psz parameter specified a valid pointer, the return value is the length, in TCHARs, of the
|
858
|
-
# returned text (not including the terminating null character). If the psz parameter specified a NULL
|
859
|
-
# pointer, the return value is the length of the text associated with the hsz parameter (not including
|
860
|
-
# the terminating null character). If an error occurs, the return value is 0L.
|
861
|
-
# ---
|
862
|
-
# <b> Enhanced (snake_case) API makes all args optional except for first (dde instance id), and returns nil if
|
863
|
-
# the function was unsuccessful.</b>
|
864
|
-
# ---
|
865
|
-
# *Remarks*
|
866
|
-
# - The string returned in the buffer is always null-terminated. If the string is longer than ( cchMax– 1),
|
867
|
-
# only the first ( cchMax– 1) characters of the string are copied.
|
868
|
-
# - If the psz parameter is NULL, the DdeQueryString function obtains the length, in bytes, of the string
|
869
|
-
# associated with the string handle. The length does not include the terminating null character.
|
870
|
-
#
|
871
|
-
# :call-seq:
|
872
|
-
# string = dde_query_string( instance_id, handle, [code_page = CP_WINANSI ] )
|
873
|
-
#
|
874
|
-
function :DdeQueryString, [:uint32, :ulong, :pointer, :uint32, :int], :uint32,
|
875
|
-
&->(api, instance_id, handle, code_page = CP_WINANSI){
|
876
|
-
buffer = FFI::MemoryPointer.new :char, 1024
|
877
|
-
num_chars = api.call(instance_id, handle, buffer, buffer.size, code_page)
|
878
|
-
num_chars == 0 ? nil : buffer.get_bytes(0, num_chars) }
|
879
|
-
|
880
|
-
##
|
881
|
-
# The DdeNameService function registers or unregisters the service names a Dynamic Data Exchange (DDE) server
|
882
|
-
# supports. This function causes the system to send XTYP_REGISTER or XTYP_UNREGISTER transactions to other running
|
883
|
-
# Dynamic Data Exchange Management Library (DDEML) client applications.
|
884
|
-
#
|
885
|
-
# [*Syntax*] HDDEDATA DdeNameService( DWORD idInst, UINT hsz1, UINT hsz2, UINT afCmd );
|
886
|
-
#
|
887
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
888
|
-
# hsz1:: [in] Handle to the string that specifies the service name the server is registering or unregistering.
|
889
|
-
# An application that is unregistering all of its service names should set this parameter to 0L.
|
890
|
-
# hsz2:: Reserved; should be set to 0L.
|
891
|
-
# afCmd:: [in] Specifies the service name options. This parameter can be one of the following values.
|
892
|
-
# DNS_REGISTER:: Registers the service name.
|
893
|
-
# DNS_UNREGISTER:: Unregisters the service name. If the hsz1 parameter is 0L,
|
894
|
-
# all service names registered by the server will be unregistered.
|
895
|
-
# DNS_FILTERON:: Turns on service name initiation filtering. The filter prevents a server from receiving
|
896
|
-
# XTYP_CONNECT transactions for service names it has not registered. This is the default
|
897
|
-
# setting for this filter. If a server application does not register any service names,
|
898
|
-
# the application cannot receive XTYP_WILDCONNECT transactions.
|
899
|
-
# DNS_FILTEROFF:: Turns off service name initiation filtering. If this flag is specified, the server
|
900
|
-
# receives an XTYP_CONNECT transaction whenever another DDE application calls the
|
901
|
-
# DdeConnect function, regardless of the service name.
|
902
|
-
# *Returns*:: If the function succeeds, it returns nonzero (*true* in snake_case method). For CamelCase, that
|
903
|
-
# value is not really HDDEDATA value, but merely a Boolean indicator of success. The function is
|
904
|
-
# typed HDDEDATA to allow for future expansion of the function and more sophisticated returns.
|
905
|
-
# If the function fails, the return value is 0L (*false* in snake_case method). The DdeGetLastError
|
906
|
-
# function can be used to get the error code, which can be one of the following:
|
907
|
-
# - DMLERR_DLL_NOT_INITIALIZED
|
908
|
-
# - DMLERR_DLL_USAGE
|
909
|
-
# - DMLERR_INVALIDPARAMETER
|
910
|
-
# - DMLERR_NO_ERROR
|
911
|
-
# ---
|
912
|
-
# <b> Enhanced API accepts only 3 parameters (get rid of reserved hsz2) and returns boolean true/false. </b>
|
913
|
-
# ---
|
914
|
-
# *Remarks*:
|
915
|
-
# The service name identified by the hsz1 parameter should be a base name (that is, the name should contain no
|
916
|
-
# instance-specific information). The system generates an instance-specific name and sends it along with the
|
917
|
-
# base name during the XTYP_REGISTER and XTYP_UNREGISTER transactions. The receiving applications can then
|
918
|
-
# connect to the specific application instance.
|
919
|
-
#
|
920
|
-
# :call-seq:
|
921
|
-
# success = dde_name_service( instance_id, string_handle, cmd )
|
922
|
-
#
|
923
|
-
function :DdeNameService, [:uint32, :ulong, :ulong, :uint], :ulong,
|
924
|
-
&->(api, id, string_handle, cmd){ api.call(id, string_handle, 0, cmd) != 0 }
|
925
|
-
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
926
|
-
|
927
|
-
##
|
928
|
-
# DdeConnect function establishes a conversation with a server application that supports the specified service
|
929
|
-
# name and topic name pair. If more than one such server exists, the system selects only one.
|
930
|
-
#
|
931
|
-
# [*Syntax*] HCONV DdeConnect( DWORD idInst, HSZ hszService, HSZ hszTopic, PCONVCONTEXT pCC );
|
932
|
-
#
|
933
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
934
|
-
# hszService:: [in] Handle to the string that specifies the service name of the server application with which
|
935
|
-
# a conversation is to be established. This handle must have been created by a previous call to
|
936
|
-
# the DdeCreateStringHandle function. If this parameter is 0L, a conversation is established with
|
937
|
-
# any available server.
|
938
|
-
# hszTopic:: [in] Handle to the string that specifies the name of the topic on which a conversation is to be
|
939
|
-
# established. This handle must have been created by a previous call to DdeCreateStringHandle.
|
940
|
-
# If this parameter is 0L, a conversation on any topic supported by the selected server is established.
|
941
|
-
# pCC:: [in] Pointer to the CONVCONTEXT structure that contains conversation context information. If this
|
942
|
-
# parameter is NULL, the server receives the default CONVCONTEXT structure during the XTYP_CONNECT
|
943
|
-
# or XTYP_WILDCONNECT transaction.
|
944
|
-
# *Returns*:: If the function succeeds, the return value is the handle to the established conversation.
|
945
|
-
# If the function fails, the return value is 0L. The DdeGetLastError function can be used to get
|
946
|
-
# the error code, which can be one of the following values:
|
947
|
-
# - DMLERR_DLL_NOT_INITIALIZED
|
948
|
-
# - DMLERR_INVALIDPARAMETER
|
949
|
-
# - DMLERR_NO_CONV_ESTABLISHED
|
950
|
-
# - DMLERR_NO_ERROR
|
951
|
-
# ---
|
952
|
-
# *Remarks*
|
953
|
-
# - The client application cannot make assumptions regarding the server selected. If an instance-specific name
|
954
|
-
# is specified in the hszService parameter, a conversation is established with only the specified instance.
|
955
|
-
# Instance-specific service names are passed to an application's Dynamic Data Exchange (DDE) callback function
|
956
|
-
# during the XTYP_REGISTER and XTYP_UNREGISTER transactions.
|
957
|
-
# - All members of the default CONVCONTEXT structure are set to zero except cb, which specifies the size of the
|
958
|
-
# structure, and iCodePage, which specifies CP_WINANSI (the default code page) or CP_WINUNICODE, depending on
|
959
|
-
# whether the ANSI or Unicode version of the DdeInitialize function was called by the client application.
|
960
|
-
# ---
|
961
|
-
# <b>Enhanced (snake_case) API makes all args optional except for first (dde instance id), and returns nil if
|
962
|
-
# the function was unsuccessful.</b>
|
963
|
-
#
|
964
|
-
# :call-seq:
|
965
|
-
# conversation_handle = dde_connect( instance_id, [service = 0, topic = 0, context = nil] )
|
966
|
-
#
|
967
|
-
function :DdeConnect, [:uint32, :ulong, :ulong, :pointer], :ulong, zeronil: true,
|
968
|
-
&->(api, instance_id, service = 0, topic = 0, context = nil){
|
969
|
-
api.call(instance_id, service, topic, context) }
|
970
|
-
|
971
|
-
##
|
972
|
-
# The DdeDisconnect function terminates a conversation started by either the DdeConnect or DdeConnectList function
|
973
|
-
# and invalidates the specified conversation handle.
|
974
|
-
#
|
975
|
-
# [*Syntax*] BOOL DdeDisconnect( HCONV hConv );
|
976
|
-
#
|
977
|
-
# hConv:: [in, out] Handle to the active conversation to be terminated.
|
978
|
-
#
|
979
|
-
# *Returns*:: If the function succeeds, the return value is nonzero, otherwise zero. The DdeGetLastError function
|
980
|
-
# can be used to get the error code, which can be one of the following values:
|
981
|
-
# - DMLERR_DLL_NOT_INITIALIZED
|
982
|
-
# - DMLERR_NO_CONV_ESTABLISHED
|
983
|
-
# - DMLERR_NO_ERROR
|
984
|
-
# ---
|
985
|
-
# *Remarks*:
|
986
|
-
# Any incomplete transactions started before calling DdeDisconnect are immediately abandoned. The XTYP_DISCONNECT
|
987
|
-
# transaction is sent to the Dynamic Data Exchange (DDE) callback function of the partner in the conversation.
|
988
|
-
# Generally, only client applications must terminate conversations.
|
989
|
-
# ---
|
990
|
-
# <b>Enhanced (snake_case) API returns *true/false* instead of nonzero/zero.</b>
|
991
|
-
#
|
992
|
-
# :call-seq:
|
993
|
-
# success = dde_disconnect(conversation_handle)
|
994
|
-
#
|
995
|
-
function :DdeDisconnect, [:ulong], :int, boolean: true
|
996
|
-
|
997
|
-
|
998
|
-
##
|
999
|
-
# The DdeGetLastError function retrieves the most recent error code set by the failure of a Dynamic Data Exchange
|
1000
|
-
# Management Library (DDEML) function and resets the error code to DMLERR_NO_ERROR.
|
1001
|
-
#
|
1002
|
-
# [*Syntax*] UINT DdeGetLastError( DWORD idInst );
|
1003
|
-
#
|
1004
|
-
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
1005
|
-
#
|
1006
|
-
# *Returns*:: If the function succeeds, the return value is the last error code, which can be one of the following:
|
1007
|
-
# DMLERR_ADVACKTIMEOUT, DMLERR_EXECACKTIMEOUT, DMLERR_INVALIDPARAMETER, DMLERR_LOW_MEMORY, DMLERR_MEMORY_ERROR,
|
1008
|
-
# DMLERR_NO_CONV_ESTABLISHED, DMLERR_NOTPROCESSED, DMLERR_POKEACKTIMEOUT, DMLERR_POSTMSG_FAILED, DMLERR_REENTRANCY,
|
1009
|
-
# DMLERR_SERVER_DIED, DMLERR_SYS_ERROR, DMLERR_UNADVACKTIMEOUT, DMLERR_UNFOUND_QUEUE_ID
|
1010
|
-
# ---
|
1011
|
-
# <b>Enhanced (snake_case) API returns *nil* if the function was unsuccessful (that is, no DDE errors raised).</b>
|
1012
|
-
# ---
|
1013
|
-
#
|
1014
|
-
# :call-seq:
|
1015
|
-
# string = dde_get_last_error( instance_id )
|
1016
|
-
#
|
1017
|
-
function :DdeGetLastError, [:uint32], :int, zeronil: true
|
1018
|
-
|
1019
|
-
##
|
1020
|
-
# The DdeClientTransaction function begins a data transaction between a client and a server. Only a
|
1021
|
-
# Dynamic Data Exchange (DDE) client application can call this function, and the application can use it
|
1022
|
-
# only after establishing a conversation with the server.
|
1023
|
-
#
|
1024
|
-
# [*Syntax*] HDDEDATA DdeClientTransaction( LPBYTE pData, DWORD cbData, HCONV hConv, HSZ hszItem, UINT
|
1025
|
-
# wFmt, UINT wType, DWORD dwTimeout, LPDWORD pdwResult );
|
1026
|
-
#
|
1027
|
-
# pData:: [in] Pointer to the beginning of the data the client must pass to the server.
|
1028
|
-
# Optionally, an application can specify the data handle (HDDEDATA) to pass to the server and in that
|
1029
|
-
# case the cbData parameter should be set to -1. This parameter is required only if the wType parameter
|
1030
|
-
# is XTYP_EXECUTE or XTYP_POKE. Otherwise, this parameter should be NULL.
|
1031
|
-
# For the optional usage of this parameter, XTYP_POKE transactions where pData is a data handle, the
|
1032
|
-
# handle must have been created by a previous call to the DdeCreateDataHandle function, employing the
|
1033
|
-
# same data format specified in the wFmt parameter.
|
1034
|
-
# cbData:: [in] Specifies the length, in bytes, of the data pointed to by the pData parameter, including
|
1035
|
-
# the terminating NULL, if the data is a string. A value of -1 indicates that pData is a data
|
1036
|
-
# handle that identifies the data being sent.
|
1037
|
-
# hConv:: [in] Handle to the conversation in which the transaction is to take place.
|
1038
|
-
# hszItem:: [in] Handle to the data item for which data is being exchanged during the transaction. This
|
1039
|
-
# handle must have been created by a previous call to the DdeCreateStringHandle function. This
|
1040
|
-
# parameter is ignored (and should be set to 0L) if the wType parameter is XTYP_EXECUTE.
|
1041
|
-
# wFmt:: [in] Specifies the standard clipboard format in which the data item is being submitted or
|
1042
|
-
# requested. If the transaction specified by the wType parameter does not pass data or is XTYP_EXECUTE,
|
1043
|
-
# this parameter should be zero.
|
1044
|
-
# If the transaction specified by the wType parameter references non-execute DDE data ( XTYP_POKE,
|
1045
|
-
# XTYP_ADVSTART, XTYP_ADVSTOP, XTYP_REQUEST), the wFmt value must be either a valid predefined (CF_) DDE
|
1046
|
-
# format or a valid registered clipboard format.
|
1047
|
-
# wType:: [in] Specifies the transaction type. This parameter can be one of the following values.
|
1048
|
-
# - XTYP_ADVSTART: Begins an advise loop. Any number of distinct advise loops can exist within a
|
1049
|
-
# conversation. An application can alter the advise loop type by combining the XTYP_ADVSTART
|
1050
|
-
# transaction type with one or more of the following flags: Flag Meaning
|
1051
|
-
# - XTYPF_NODATA Instructs the server to notify the client of any data changes without actually sending
|
1052
|
-
# the data. This flag gives the client the option of ignoring the notification or requesting the changed
|
1053
|
-
# data from the server.
|
1054
|
-
# - XTYPF_ACKREQ Instructs the server to wait until the client acknowledges that it received the previous
|
1055
|
-
# data item before sending the next data item. This flag prevents a fast server from sending data faster
|
1056
|
-
# than the client can process it.
|
1057
|
-
# - XTYP_ADVSTOP: Ends an advise loop.
|
1058
|
-
# - XTYP_EXECUTE: Begins an execute transaction.
|
1059
|
-
# - XTYP_POKE: Begins a poke transaction.
|
1060
|
-
# - XTYP_REQUEST: Begins a request transaction.
|
1061
|
-
# dwTimeout:: [in] Specifies the maximum amount of time, in milliseconds, that the client will wait for
|
1062
|
-
# a response from the server application in a synchronous transaction. This parameter should
|
1063
|
-
# be TIMEOUT_ASYNC for asynchronous transactions.
|
1064
|
-
# pdwResult:: [out] Pointer to a variable that receives the result of the transaction. An application
|
1065
|
-
# that does not check the result can use NULL for this value. For synchronous transactions,
|
1066
|
-
# the low-order word of this variable contains any applicable DDE_ flags resulting from the
|
1067
|
-
# transaction. This provides support for applications dependent on DDE_APPSTATUS bits. It
|
1068
|
-
# is, however, recommended that applications no longer use these bits because they may not
|
1069
|
-
# be supported in future versions of the Dynamic Data Exchange Management Library (DDEML).
|
1070
|
-
# For asynchronous transactions, this variable is filled with a unique transaction
|
1071
|
-
# identifier for use with the DdeAbandonTransaction function and the XTYP_XACT_COMPLETE
|
1072
|
-
# transaction.
|
1073
|
-
#
|
1074
|
-
# *Returns*:: If the function succeeds, the return value is a data handle that identifies the data for
|
1075
|
-
# successful synchronous transactions in which the client expects data from the server. The
|
1076
|
-
# return value is nonzero for successful asynchronous transactions and for synchronous
|
1077
|
-
# transactions in which the client does not expect data. The return value is zero for all
|
1078
|
-
# unsuccessful transactions.
|
1079
|
-
# The DdeGetLastError function can be used to get the error code, which can be one of the following values:
|
1080
|
-
# - DMLERR_ADVACKTIMEOUT
|
1081
|
-
# - DMLERR_BUSY
|
1082
|
-
# - DMLERR_DATAACKTIMEOUT
|
1083
|
-
# - DMLERR_DLL_NOT_INITIALIZED
|
1084
|
-
# - DMLERR_EXECACKTIMEOUT
|
1085
|
-
# - DMLERR_INVALIDPARAMETER
|
1086
|
-
# - DMLERR_MEMORY_ERROR
|
1087
|
-
# - DMLERR_NO_CONV_ESTABLISHED
|
1088
|
-
# - DMLERR_NO_ERROR
|
1089
|
-
# - DMLERR_NOTPROCESSED
|
1090
|
-
# - DMLERR_POKEACKTIMEOUT
|
1091
|
-
# - DMLERR_POSTMSG_FAILED
|
1092
|
-
# - DMLERR_REENTRANCY
|
1093
|
-
# - DMLERR_SERVER_DIED
|
1094
|
-
# - DMLERR_UNADVACKTIMEOUT
|
1095
|
-
# ---
|
1096
|
-
# *Remarks*:
|
1097
|
-
# When an application has finished using the data handle returned by DdeClientTransaction, the application should
|
1098
|
-
# free the handle by calling the DdeFreeDataHandle function.
|
1099
|
-
#
|
1100
|
-
#Transactions can be synchronous or asynchronous. During a synchronous transaction, DdeClientTransaction does not
|
1101
|
-
# return until the transaction either completes successfully or fails. Synchronous transactions cause a client to
|
1102
|
-
# enter a modal loop while waiting for various asynchronous events. Because of this, a client application can still
|
1103
|
-
# respond to user input while waiting on a synchronous transaction, but the application cannot begin a second
|
1104
|
-
# synchronous transaction because of the activity associated with the first. DdeClientTransaction fails if any
|
1105
|
-
# instance of the same task has a synchronous transaction already in progress.
|
1106
|
-
#
|
1107
|
-
# During an asynchronous transaction, DdeClientTransaction returns after the transaction has begun,
|
1108
|
-
# passing a transaction identifier for reference. When the server's DDE callback function finishes
|
1109
|
-
# processing an asynchronous transaction, the system sends an XTYP_XACT_COMPLETE transaction to the
|
1110
|
-
# client. This transaction provides the client with the results of the asynchronous transaction that it
|
1111
|
-
# initiated by calling DdeClientTransaction. A client application can choose to abandon an asynchronous
|
1112
|
-
# transaction by calling the DdeAbandonTransaction function.
|
1113
|
-
# ---
|
1114
|
-
# <b>Enhanced (snake_case) API: </b>
|
1115
|
-
#
|
1116
|
-
# :call-seq:
|
1117
|
-
# data_handle = dde_client_transaction(data_pointer, size, conv, item, format, type, timeout, result)
|
1118
|
-
#
|
1119
|
-
function :DdeClientTransaction, [:pointer, :uint32, :ulong, :ulong, :uint, :uint, :uint32, :pointer],
|
1120
|
-
:HDDEDATA, zeronil: true
|
1121
|
-
|
1122
|
-
##
|
1123
|
-
# The DdeGetData function copies data from the specified Dynamic Data Exchange (DDE) object to the specified
|
1124
|
-
# local buffer.
|
1125
|
-
#
|
1126
|
-
# [*Syntax*] DWORD DdeGetData( HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff );
|
1127
|
-
#
|
1128
|
-
# hData:: [in] Handle to the DDE object that contains the data to copy.
|
1129
|
-
# pDst:: [out] Pointer to the buffer that receives the data. If this parameter is NULL, the DdeGetData
|
1130
|
-
# function returns the amount of data, in bytes, that would be copied to the buffer.
|
1131
|
-
# cbMax:: [in] Specifies the maximum amount of data, in bytes, to copy to the buffer pointed to by the pDst
|
1132
|
-
# parameter. Typically, this parameter specifies the length of the buffer pointed to by pDst.
|
1133
|
-
# cbOff:: [in] Specifies an offset within the DDE object. Data is copied from the object beginning at this offset.
|
1134
|
-
#
|
1135
|
-
# *Returns*:: If the pDst parameter points to a buffer, return value is the size, in bytes, of the memory object
|
1136
|
-
# associated with the data handle or the size specified in the cbMax parameter, whichever is lower.
|
1137
|
-
# If the pDst parameter is NULL, the return value is the size, in bytes, of the memory object
|
1138
|
-
# associated with the data handle.
|
1139
|
-
# The DdeGetLastError function can be used to get the error code, which can be one of the following:
|
1140
|
-
# - DMLERR_DLL_NOT_INITIALIZED
|
1141
|
-
# - DMLERR_INVALIDPARAMETER
|
1142
|
-
# - DMLERR_NO_ERROR
|
1143
|
-
# ---
|
1144
|
-
# <b> Enhanced (snake_case) API accepts data handle, and optionally max and offset (no need to pre-allocate
|
1145
|
-
# buffer). It returns pointer to copied DDE data (FFI::MemoryPointer) and size of copied data in bytes.
|
1146
|
-
# In case of failure, it returns [nil, 0]. This API is the same as for enhanced dde_access_data.
|
1147
|
-
# No need to call function twice (first time with nil buffer just to determine length).</b>
|
1148
|
-
# ---
|
1149
|
-
#
|
1150
|
-
# :call-seq:
|
1151
|
-
# buffer, size = dde_get_data( data_handle, [max = infinite, offset = 0] )
|
1152
|
-
#
|
1153
|
-
function :DdeGetData, [:ulong, :pointer, :uint32, :uint32], :uint,
|
1154
|
-
&->(api, data_handle, max=1073741823, offset=0){ # max is maximum DWORD Fixnum
|
1155
|
-
size = api.call(data_handle, nil, 0, 0) # determining data set length
|
1156
|
-
if size == 0
|
1157
|
-
[nil, 0]
|
1158
|
-
else
|
1159
|
-
copy_size = size < max ? size : max
|
1160
|
-
buffer = FFI::MemoryPointer.new(:char, offset + copy_size)
|
1161
|
-
size = api.call(data_handle, buffer, copy_size, offset)
|
1162
|
-
[buffer, size]
|
1163
|
-
end }
|
1164
|
-
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
1165
|
-
|
1166
|
-
|
1167
|
-
##
|
1168
|
-
# The DdeAccessData function provides access to the data in the specified Dynamic Data Exchange (DDE)
|
1169
|
-
# object. An application must call the DdeUnaccessData function when it has finished accessing the data
|
1170
|
-
# in the object.
|
1171
|
-
#
|
1172
|
-
# [*Syntax*] LPBYTE DdeAccessData( HDDEDATA hData, LPDWORD pcbDataSize );
|
1173
|
-
#
|
1174
|
-
# hData:: [in] Handle to the DDE object to access.
|
1175
|
-
# pcbDataSize:: [out] Pointer to a variable that receives the size, in bytes, of the DDE object
|
1176
|
-
# identified by the hData parameter. If this parameter is NULL, no size information is
|
1177
|
-
# returned.
|
1178
|
-
#
|
1179
|
-
# *Returns*:: If the function succeeds, the return value is a pointer to the first byte of data in the
|
1180
|
-
# DDE object.
|
1181
|
-
# If the function fails, the return value is NULL.
|
1182
|
-
# The DdeGetLastError function can be used to get the error code, which can be one of the following
|
1183
|
-
# values:
|
1184
|
-
# DMLERR_DLL_NOT_INITIALIZED
|
1185
|
-
# DMLERR_INVALIDPARAMETER
|
1186
|
-
# DMLERR_NO_ERROR
|
1187
|
-
# ---
|
1188
|
-
# *Remarks*:
|
1189
|
-
# If the hData parameter has not been passed to a Dynamic Data Exchange Management Library (DDEML)
|
1190
|
-
# function, an application can use the pointer returned by DdeAccessData for read-write access to the
|
1191
|
-
# DDE object. If hData has already been passed to a DDEML function, the pointer should be used only for
|
1192
|
-
# read access to the memory object.
|
1193
|
-
#
|
1194
|
-
# ---
|
1195
|
-
# <b>Enhanced (snake_case) API accepts DDE data handle and returns FFI::MemoryPointer to raw data and
|
1196
|
-
# size of data set in bytes (same API as enhanced dde_get_data). Returns [nil, 0] in case of failure. </b>
|
1197
|
-
#
|
1198
|
-
# :call-seq:
|
1199
|
-
# data_pointer, size = dde_access_data( data_handle )
|
1200
|
-
#
|
1201
|
-
function :DdeAccessData, [:HDDEDATA, :pointer], :pointer,
|
1202
|
-
&->(api, data_handle){
|
1203
|
-
size_buffer = FFI::MemoryPointer.new(:uint32)
|
1204
|
-
buffer = api.call(data_handle, size_buffer)
|
1205
|
-
size = size_buffer.get_uint32(0)
|
1206
|
-
size == 0 ? [nil, 0] : [buffer, size] }
|
1207
|
-
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
1208
|
-
|
1209
|
-
##
|
1210
|
-
# The DdeUnaccessData function unaccesses a Dynamic Data Exchange (DDE) object. An application must call
|
1211
|
-
# this function after it has finished accessing the object.
|
1212
|
-
#
|
1213
|
-
# [*Syntax*] BOOL DdeUnaccessData( HDDEDATA hData );
|
1214
|
-
#
|
1215
|
-
# hData:: [in] Handle to the DDE object.
|
1216
|
-
#
|
1217
|
-
# *Returns*:: If the function succeeds, the return value is nonzero.
|
1218
|
-
# If the function fails, the return value is zero.
|
1219
|
-
# The DdeGetLastError function can be used to get the error code, which can be one of the following
|
1220
|
-
# values:
|
1221
|
-
# DMLERR_DLL_NOT_INITIALIZED
|
1222
|
-
# DMLERR_INVALIDPARAMETER
|
1223
|
-
# DMLERR_NO_ERROR
|
1224
|
-
#
|
1225
|
-
# ---
|
1226
|
-
# <b>Enhanced (snake_case) API returns true/false instead of nonzero/zero: </b>
|
1227
|
-
#
|
1228
|
-
# :call-seq:
|
1229
|
-
# success = dde_unaccess_data(data_handle)
|
1230
|
-
#
|
1231
|
-
function :DdeUnaccessData, [:HDDEDATA], :int8, boolean: true
|
1232
|
-
|
1233
|
-
end
|
1234
|
-
end
|
1
|
+
require 'win/library'
|
2
|
+
|
3
|
+
module Win
|
4
|
+
|
5
|
+
# Includes functions related to DDE exchange protocol in Windows
|
6
|
+
#
|
7
|
+
module Dde
|
8
|
+
include Win::Library
|
9
|
+
|
10
|
+
# Windows ANSI codepage:
|
11
|
+
CP_WINANSI = 1004
|
12
|
+
|
13
|
+
# DDE name service afCmd commands used by DdeNameService function:
|
14
|
+
|
15
|
+
# Registers the service name.
|
16
|
+
DNS_REGISTER = 1
|
17
|
+
# Unregisters the service name. When hsz1 == 0L, ALL service names registered by the server will be unregistered.
|
18
|
+
DNS_UNREGISTER = 2
|
19
|
+
# Turns on service name initiation filtering. The filter prevents a server from receiving
|
20
|
+
# XTYP_CONNECT transactions for service names it has not registered. This is the default
|
21
|
+
# setting for this filter. If a server application does not register any service names,
|
22
|
+
# the application cannot receive XTYP_WILDCONNECT transactions.
|
23
|
+
DNS_FILTERON = 4
|
24
|
+
# Turns off service name initiation filtering. If this flag is specified, the server
|
25
|
+
# receives an XTYP_CONNECT transaction whenever another DDE application calls the
|
26
|
+
# DdeConnect function, regardless of the service name.
|
27
|
+
DNS_FILTEROFF = 8
|
28
|
+
|
29
|
+
# Transaction confirmations:
|
30
|
+
|
31
|
+
# Transaction confirmation
|
32
|
+
DDE_FACK = 0x8000
|
33
|
+
# Server is too busy to process transaction
|
34
|
+
DDE_FBUSY = 0x4000
|
35
|
+
DDE_FDEFERUPD = 0x4000
|
36
|
+
DDE_FACKREQ = 0x8000
|
37
|
+
DDE_FRELEASE = 0x2000
|
38
|
+
DDE_FREQUESTED = 0x1000
|
39
|
+
DDE_FAPPSTATUS = 0x00ff
|
40
|
+
# Transaction rejected
|
41
|
+
DDE_FNOTPROCESSED = 0
|
42
|
+
|
43
|
+
# Transaction types:
|
44
|
+
|
45
|
+
XTYPF_NOBLOCK = 0x0002
|
46
|
+
XTYPF_NODATA = 0x0004
|
47
|
+
XTYPF_ACKREQ = 0x0008
|
48
|
+
|
49
|
+
XCLASS_MASK = 0xFC00
|
50
|
+
XCLASS_BOOL = 0x1000
|
51
|
+
XCLASS_DATA = 0x2000
|
52
|
+
XCLASS_FLAGS = 0x4000
|
53
|
+
XCLASS_NOTIFICATION = 0x8000
|
54
|
+
|
55
|
+
XTYP_ERROR = XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
56
|
+
XTYP_ADVDATA = 0x0010 | XCLASS_FLAGS
|
57
|
+
XTYP_ADVREQ = 0x0020 | XCLASS_DATA | XTYPF_NOBLOCK
|
58
|
+
XTYP_ADVSTART = 0x0030 | XCLASS_BOOL
|
59
|
+
XTYP_ADVSTOP = 0x0040 | XCLASS_NOTIFICATION
|
60
|
+
XTYP_EXECUTE = 0x0050 | XCLASS_FLAGS
|
61
|
+
# A client uses the XTYP_CONNECT transaction to establish a conversation. A DDE server callback function,
|
62
|
+
# DdeCallback, receives this transaction when a client specifies a service name that the server supports
|
63
|
+
# (and a topic name that is not NULL) in a call to the DdeConnect function.
|
64
|
+
XTYP_CONNECT = 0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK
|
65
|
+
XTYP_CONNECT_CONFIRM = 0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
66
|
+
XTYP_XACT_COMPLETE = 0x0080 | XCLASS_NOTIFICATION
|
67
|
+
# A client uses the XTYP_POKE transaction to send unsolicited data to the server. DDE server callback function,
|
68
|
+
# DdeCallback, receives this transaction when a client specifies XTYP_POKE in the DdeClientTransaction function.
|
69
|
+
XTYP_POKE = 0x0090 | XCLASS_FLAGS
|
70
|
+
XTYP_REGISTER = 0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
71
|
+
XTYP_REQUEST = 0x00B0 | XCLASS_DATA
|
72
|
+
XTYP_DISCONNECT = 0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
73
|
+
XTYP_UNREGISTER = 0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
74
|
+
XTYP_WILDCONNECT = 0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK
|
75
|
+
XTYP_MONITOR = 0X00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK
|
76
|
+
XTYP_MASK = 0x00F0
|
77
|
+
XTYP_SHIFT = 0x0004
|
78
|
+
|
79
|
+
# Types Hash {TRANSACTION_TYPE=>'Type description')}
|
80
|
+
TYPES = {
|
81
|
+
XTYPF_NOBLOCK => 'XTYPF_NOBLOCK',
|
82
|
+
XTYPF_NODATA => 'XTYPF_NODATA',
|
83
|
+
XTYPF_ACKREQ => 'XTYPF_ACKREQ',
|
84
|
+
XCLASS_MASK => 'XCLASS_MASK',
|
85
|
+
XCLASS_BOOL => 'XCLASS_BOOL',
|
86
|
+
XCLASS_DATA => 'XCLASS_DATA',
|
87
|
+
XCLASS_FLAGS => 'XCLASS_FLAGS',
|
88
|
+
XCLASS_NOTIFICATION => 'XCLASS_NOTIFICATION',
|
89
|
+
XTYP_ERROR => 'XTYP_ERROR',
|
90
|
+
XTYP_ADVDATA => 'XTYP_ADVDATA',
|
91
|
+
XTYP_ADVREQ => 'XTYP_ADVREQ',
|
92
|
+
XTYP_ADVSTART => 'XTYP_ADVSTART',
|
93
|
+
XTYP_ADVSTOP => 'XTYP_ADVSTOP',
|
94
|
+
XTYP_EXECUTE => 'XTYP_EXECUTE',
|
95
|
+
XTYP_CONNECT => 'XTYP_CONNECT',
|
96
|
+
XTYP_CONNECT_CONFIRM=> 'XTYP_CONNECT_CONFIRM',
|
97
|
+
XTYP_XACT_COMPLETE => 'XTYP_XACT_COMPLETE',
|
98
|
+
XTYP_POKE => 'XTYP_POKE',
|
99
|
+
XTYP_REGISTER => 'XTYP_REGISTER',
|
100
|
+
XTYP_REQUEST => 'XTYP_REQUEST',
|
101
|
+
XTYP_DISCONNECT => 'XTYP_DISCONNECT',
|
102
|
+
XTYP_UNREGISTER => 'XTYP_UNREGISTER',
|
103
|
+
XTYP_WILDCONNECT => 'XTYP_WILDCONNECT',
|
104
|
+
XTYP_MONITOR => 'XTYP_MONITOR',
|
105
|
+
XTYP_MASK => 'XTYP_MASK',
|
106
|
+
XTYP_SHIFT => 'XTYP_SHIFT'
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
# DdeInitialize afCmd flaggs:
|
111
|
+
|
112
|
+
# Registers the application as a standard (nonmonitoring) DDEML application.
|
113
|
+
APPCLASS_STANDARD = 0
|
114
|
+
# Makes it possible for the application to monitor DDE activity in the system.
|
115
|
+
# This flag is for use by DDE monitoring applications. The application specifies the types of DDE
|
116
|
+
# activity to monitor by combining one or more monitor flags with the APPCLASS_MONITOR flag.
|
117
|
+
APPCLASS_MONITOR = 0x00000001
|
118
|
+
# ?
|
119
|
+
APPCLASS_MASK = 0x0000000F
|
120
|
+
# Prevents the application from becoming a server in a DDE conversation. The application can only be a client.
|
121
|
+
# This flag reduces consumption of resources by the DDEML. It includes the CBF_FAIL_ALLSVRXACTIONS flag.
|
122
|
+
APPCMD_CLIENTONLY = 0x00000010
|
123
|
+
# Prevents the DDEML from sending XTYP_CONNECT and XTYP_WILDCONNECT transactions to the application until
|
124
|
+
# the application has created its string handles and registered its service names or has turned off filtering
|
125
|
+
# by a subsequent call to the DdeNameService or DdeInitialize function. This flag is always in effect when an
|
126
|
+
# application calls DdeInitialize for the first time, regardless of whether the application specifies the flag.
|
127
|
+
# On subsequent calls to DdeInitialize, not specifying this flag turns off the application's service-name
|
128
|
+
# filters, but specifying it turns on the application's service name filters.
|
129
|
+
APPCMD_FILTERINITS = 0x00000020
|
130
|
+
# ?
|
131
|
+
APPCMD_MASK = 0x00000FF0
|
132
|
+
# Prevents the callback function from receiving XTYP_CONNECT transactions from the application's own instance.
|
133
|
+
# This flag prevents an application from establishing a DDE conversation with its own instance. An application
|
134
|
+
# should use this flag if it needs to communicate with other instances of itself but not with itself.
|
135
|
+
CBF_FAIL_SELFCONNECTIONS = 0x00001000
|
136
|
+
# Prevents the callback function from receiving XTYP_CONNECT and XTYP_WILDCONNECT.
|
137
|
+
CBF_FAIL_CONNECTIONS = 0x00002000
|
138
|
+
# Prevents the callback function from receiving XTYP_ADVSTART and XTYP_ADVSTOP transactions. The system returns
|
139
|
+
# DDE_FNOTPROCESSED to each client that sends an XTYP_ADVSTART or XTYP_ADVSTOP transaction to the server.
|
140
|
+
CBF_FAIL_ADVISES = 0x00004000
|
141
|
+
# Prevents the callback function from receiving XTYP_EXECUTE transactions. The system returns DDE_FNOTPROCESSED
|
142
|
+
# to a client that sends an XTYP_EXECUTE transaction to the server.
|
143
|
+
CBF_FAIL_EXECUTES = 0x00008000
|
144
|
+
# Prevents the callback function from receiving XTYP_POKE transactions. The system returns DDE_FNOTPROCESSED
|
145
|
+
# to a client that sends an XTYP_POKE transaction to the server.
|
146
|
+
CBF_FAIL_POKES = 0x00010000
|
147
|
+
# Prevents the callback function from receiving XTYP_REQUEST transactions. The system returns DDE_FNOTPROCESSED
|
148
|
+
# to a client that sends an XTYP_REQUEST transaction to the server.
|
149
|
+
CBF_FAIL_REQUESTS = 0x00020000
|
150
|
+
# Prevents the callback function from receiving server transactions. The system returns DDE_FNOTPROCESSED to each
|
151
|
+
# client that sends a transaction to this application. This flag is equivalent to combining all CBF_FAIL_ flags.
|
152
|
+
CBF_FAIL_ALLSVRXACTIONS = 0x0003f000
|
153
|
+
# Prevents the callback function from receiving XTYP_CONNECT_CONFIRM.
|
154
|
+
CBF_SKIP_CONNECT_CONFIRMS = 0x00040000
|
155
|
+
# Prevents the callback function from receiving XTYP_REGISTER notifications.
|
156
|
+
CBF_SKIP_REGISTRATIONS = 0x00080000
|
157
|
+
# Prevents the callback function from receiving XTYP_UNREGISTER notifications.
|
158
|
+
CBF_SKIP_UNREGISTRATIONS = 0x00100000
|
159
|
+
# Prevents the callback function from receiving XTYP_DISCONNECT notifications.
|
160
|
+
CBF_SKIP_DISCONNECTS = 0x00200000
|
161
|
+
# Prevents the callback function from receiving any notifications. Equivalent to combining all CBF_SKIP_ flags.
|
162
|
+
CBF_SKIP_ALLNOTIFICATIONS = 0x003c0000
|
163
|
+
# Notifies the callback function whenever a DDE application creates, frees, or increments the usage count of
|
164
|
+
# a string handle or whenever a string handle is freed as a result of a call to the DdeUninitialize function.
|
165
|
+
MF_HSZ_INFO = 0x01000000
|
166
|
+
# Notifies the callback function whenever the system or an application sends a DDE message.
|
167
|
+
MF_SENDMSGS = 0x02000000
|
168
|
+
# Notifies the callback function whenever the system or an application posts a DDE message.
|
169
|
+
MF_POSTMSGS = 0x04000000
|
170
|
+
# Notifies the callback function whenever a transaction is sent to any DDE callback function in the system.
|
171
|
+
MF_CALLBACKS = 0x08000000
|
172
|
+
# Notifies the callback function whenever a DDE error occurs.
|
173
|
+
MF_ERRORS = 0x10000000
|
174
|
+
# Notifies the callback function whenever an advise loop is started or ended.
|
175
|
+
MF_LINKS = 0x20000000
|
176
|
+
# Notifies the callback function whenever a conversation is established or terminated.
|
177
|
+
MF_CONV = 0x40000000
|
178
|
+
# ?
|
179
|
+
MF_MASK = 0xFF000000
|
180
|
+
|
181
|
+
# Flags Hash {FLAG=>'Flag description')}
|
182
|
+
FLAGS = {
|
183
|
+
APPCLASS_STANDARD => 'APPCLASS_STANDARD',
|
184
|
+
APPCLASS_MONITOR => 'APPCLASS_MONITOR',
|
185
|
+
APPCLASS_MASK => 'APPCLASS_MASK',
|
186
|
+
APPCMD_CLIENTONLY => 'APPCMD_CLIENTONLY',
|
187
|
+
APPCMD_FILTERINITS => 'APPCMD_FILTERINITS',
|
188
|
+
APPCMD_MASK => 'APPCMD_MASK',
|
189
|
+
CBF_FAIL_SELFCONNECTIONS => 'CBF_FAIL_SELFCONNECTIONS',
|
190
|
+
CBF_FAIL_CONNECTIONS => 'CBF_FAIL_CONNECTIONS',
|
191
|
+
CBF_FAIL_ADVISES => 'CBF_FAIL_ADVISES',
|
192
|
+
CBF_FAIL_EXECUTES => 'CBF_FAIL_EXECUTES',
|
193
|
+
CBF_FAIL_POKES => 'CBF_FAIL_POKES',
|
194
|
+
CBF_FAIL_REQUESTS => 'CBF_FAIL_REQUESTS',
|
195
|
+
CBF_FAIL_ALLSVRXACTIONS => 'CBF_FAIL_ALLSVRXACTIONS',
|
196
|
+
CBF_SKIP_CONNECT_CONFIRMS => 'CBF_SKIP_CONNECT_CONFIRMS',
|
197
|
+
CBF_SKIP_REGISTRATIONS => 'CBF_SKIP_REGISTRATIONS',
|
198
|
+
CBF_SKIP_UNREGISTRATIONS => 'CBF_SKIP_UNREGISTRATIONS',
|
199
|
+
CBF_SKIP_DISCONNECTS => 'CBF_SKIP_DISCONNECTS',
|
200
|
+
CBF_SKIP_ALLNOTIFICATIONS => 'CBF_SKIP_ALLNOTIFICATIONS',
|
201
|
+
MF_HSZ_INFO => 'MF_HSZ_INFO',
|
202
|
+
MF_SENDMSGS => 'MF_SENDMSGS',
|
203
|
+
MF_POSTMSGS => 'MF_POSTMSGS',
|
204
|
+
MF_CALLBACKS => 'MF_CALLBACKS',
|
205
|
+
MF_ERRORS => 'MF_ERRORS',
|
206
|
+
MF_LINKS => 'MF_LINKS',
|
207
|
+
MF_CONV => 'MF_CONV',
|
208
|
+
MF_MASK => 'MF_MASK'
|
209
|
+
}
|
210
|
+
|
211
|
+
# Error codes:
|
212
|
+
|
213
|
+
# Returned if DDE Init successful
|
214
|
+
DMLERR_NO_ERROR = 0x00
|
215
|
+
# First (lowest) error code
|
216
|
+
DMLERR_FIRST = 0x4000
|
217
|
+
# A request for a synchronous advise transaction has timed out.
|
218
|
+
DMLERR_ADVACKTIMEOUT = DMLERR_FIRST
|
219
|
+
# The response to the transaction caused the DDE_FBUSY flag to be set
|
220
|
+
DMLERR_BUSY = 0x4001
|
221
|
+
# A request for a synchronous data transaction has timed out.
|
222
|
+
DMLERR_DATAACKTIMEOUT = 0x4002
|
223
|
+
# A DDEML function was called without first calling the DdeInitialize function, or an invalid instance
|
224
|
+
# identifier was passed to a DDEML function.
|
225
|
+
DMLERR_DLL_NOT_INITIALIZED = 0x4003
|
226
|
+
# An application initialized as APPCLASS_MONITOR has attempted to perform a Dynamic Data Exchange (DDE) transaction,
|
227
|
+
# or an application initialized as APPCMD_CLIENTONLY has attempted to perform server transactions.
|
228
|
+
DMLERR_DLL_USAGE = 0x4004
|
229
|
+
# A request for a synchronous execute transaction has timed out.
|
230
|
+
DMLERR_EXECACKTIMEOUT = 0x4005
|
231
|
+
# A parameter failed to be validated by the DDEML. Some of the possible causes follow:
|
232
|
+
# - The application used a data handle initialized with a different item name handle than was required by the
|
233
|
+
# transaction.
|
234
|
+
# - The application used a data handle that was initialized with a different clipboard data format than was
|
235
|
+
# required by the transaction.
|
236
|
+
# - The application used a client-side conversation handle with a server-side function or vice versa.
|
237
|
+
# - The application used a freed data handle or string handle.
|
238
|
+
# - More than one instance of the application used the same object.
|
239
|
+
DMLERR_INVALIDPARAMETER = 0x4006
|
240
|
+
# A DDEML application has created a prolonged race condition (in which the server application
|
241
|
+
# outruns the client), causing large amounts of memory to be consumed.
|
242
|
+
DMLERR_LOW_MEMORY = 0x4007
|
243
|
+
# A memory allocation has failed.
|
244
|
+
DMLERR_MEMORY_ERROR = 0x4008
|
245
|
+
# A transaction has failed.
|
246
|
+
DMLERR_NOTPROCESSED = 0x4009
|
247
|
+
# A client's attempt to establish a conversation has failed.
|
248
|
+
DMLERR_NO_CONV_ESTABLISHED = 0x400a
|
249
|
+
# A request for a synchronous poke transaction has timed out.
|
250
|
+
DMLERR_POKEACKTIMEOUT = 0x400b
|
251
|
+
# An internal call to the PostMessage function has failed.
|
252
|
+
DMLERR_POSTMSG_FAILED = 0x400c
|
253
|
+
# An application instance with a synchronous transaction already in progress attempted to initiate another
|
254
|
+
# synchronous transaction, or the DdeEnableCallback function was called from within a DDEML callback function.
|
255
|
+
DMLERR_REENTRANCY = 0x400d
|
256
|
+
# A server-side transaction was attempted on a conversation terminated by the client, or the server terminated
|
257
|
+
# before completing a transaction.
|
258
|
+
DMLERR_SERVER_DIED = 0x400e
|
259
|
+
# An internal error has occurred in the DDEML.
|
260
|
+
DMLERR_SYS_ERROR = 0x400f
|
261
|
+
# A request to end an advise transaction has timed out.
|
262
|
+
DMLERR_UNADVACKTIMEOUT = 0x4010
|
263
|
+
# An invalid transaction identifier was passed to a DDEML function. Once the application has returned from an
|
264
|
+
# XTYP_XACT_COMPLETE callback, the transaction identifier for that callback function is no longer valid.
|
265
|
+
DMLERR_UNFOUND_QUEUE_ID = 0x4011
|
266
|
+
# Last (highest) error code
|
267
|
+
DMLERR_LAST = DMLERR_UNFOUND_QUEUE_ID
|
268
|
+
|
269
|
+
# Errors Hash {ERROR_CODE=>'Error description')}
|
270
|
+
ERRORS = {
|
271
|
+
nil => 'No DDEML error',
|
272
|
+
DMLERR_NO_ERROR => 'No DDEML error',
|
273
|
+
DMLERR_ADVACKTIMEOUT => 'A request for a synchronous advise transaction has timed out.',
|
274
|
+
DMLERR_BUSY => 'The response to the transaction caused the DDE_FBUSY flag to be set.',
|
275
|
+
DMLERR_DATAACKTIMEOUT => 'A request for a synchronous data transaction has timed out.',
|
276
|
+
DMLERR_DLL_NOT_INITIALIZED => 'A DDEML function was called without first calling the DdeInitialize ' +
|
277
|
+
'function, or an invalid instance identifier was passed to a DDEML function.',
|
278
|
+
DMLERR_DLL_USAGE => 'An application initialized as APPCLASS_MONITOR has attempted to perform a DDE ' +
|
279
|
+
'transaction, or an application initialized as APPCMD_CLIENTONLY has attempted to perform ' +
|
280
|
+
'server transactions.',
|
281
|
+
DMLERR_EXECACKTIMEOUT => 'A request for a synchronous execute transaction has timed out.',
|
282
|
+
DMLERR_INVALIDPARAMETER => 'A parameter failed to be validated by the DDEML. Possible causes: ' +
|
283
|
+
'Application used a data handle initialized with a different item name handle than was required ' +
|
284
|
+
'by the transaction. ' +
|
285
|
+
'The application used a data handle that was initialized with a different clipboard data format ' +
|
286
|
+
'than was required by the transaction. ' +
|
287
|
+
'The application used a client-side conversation handle with server-side function or vice versa. ' +
|
288
|
+
'The application used a freed data handle or string handle. ' +
|
289
|
+
'More than one instance of the application used the same object.',
|
290
|
+
DMLERR_LOW_MEMORY => 'A DDEML application has created a prolonged race condition (in which the server ' +
|
291
|
+
'application outruns the client), causing large amounts of memory to be consumed.',
|
292
|
+
DMLERR_MEMORY_ERROR => 'A memory allocation has failed.',
|
293
|
+
DMLERR_NO_CONV_ESTABLISHED => 'A client`s attempt to establish a conversation has failed.',
|
294
|
+
DMLERR_NOTPROCESSED => 'A transaction has failed.',
|
295
|
+
DMLERR_POKEACKTIMEOUT => 'A request for a synchronous poke transaction has timed out.',
|
296
|
+
DMLERR_POSTMSG_FAILED => 'An internal call to the PostMessage function has failed.',
|
297
|
+
DMLERR_REENTRANCY => 'An application instance with a synchronous transaction already in progress ' +
|
298
|
+
'attempted to initiate another synchronous transaction, or the DdeEnableCallback function ' +
|
299
|
+
'was called from within a DDEML callback function.',
|
300
|
+
DMLERR_SERVER_DIED => 'A server-side transaction was attempted on a conversation terminated by the ' +
|
301
|
+
'client, or the server terminated before completing a transaction.',
|
302
|
+
DMLERR_SYS_ERROR => 'An internal error has occurred in the DDEML.',
|
303
|
+
DMLERR_UNADVACKTIMEOUT => 'A request to end an advise transaction has timed out.',
|
304
|
+
DMLERR_UNFOUND_QUEUE_ID => 'An invalid transaction identifier was passed to a DDEML function. Once the ' +
|
305
|
+
'application has returned from an XTYP_XACT_COMPLETE callback, the transaction identifier for ' +
|
306
|
+
'that callback function is no longer valid.'
|
307
|
+
}
|
308
|
+
|
309
|
+
# Predefined Clipboard Formats:
|
310
|
+
|
311
|
+
# The simplest form of Clipboard data. It is a null-terminated string containing a carriage return
|
312
|
+
# and linefeed at the end of each line.
|
313
|
+
CF_TEXT = 1
|
314
|
+
# A Windows version 2.x-compatible bitmap
|
315
|
+
CF_BITMAP = 2
|
316
|
+
# A metafile picture structure. See docs for Microsoft Windows Software Development Kit.
|
317
|
+
CF_METAFILEPICT = 3
|
318
|
+
# Microsoft symbolic link (SYLK) format. Microsoft Excel for the Apple Macintosh was originally designed to use
|
319
|
+
# SYLK format, and this format is now supported by Microsoft Excel on both the Windows and Macintosh platforms
|
320
|
+
CF_SYLK = 4
|
321
|
+
# An ASCII format used by the VisiCalc spreadsheet program
|
322
|
+
CF_DIF = 5
|
323
|
+
CF_TIFF = 6
|
324
|
+
CF_OEMTEXT = 7
|
325
|
+
CF_DIB = 8
|
326
|
+
CF_PALETTE = 9
|
327
|
+
CF_PENDATA = 10
|
328
|
+
CF_RIFF = 11
|
329
|
+
CF_WAVE = 12
|
330
|
+
CF_UNICODETEXT = 13
|
331
|
+
CF_ENHMETAFILE = 14
|
332
|
+
# Filename copied to clipboard
|
333
|
+
CF_HDROP = 15
|
334
|
+
CF_LOCALE = 16
|
335
|
+
CF_MAX = 17
|
336
|
+
|
337
|
+
# DdeClientTransaction timeout value indicating async transaction
|
338
|
+
TIMEOUT_ASYNC = 0xFFFFFFFF
|
339
|
+
|
340
|
+
# The MONCBSTRUCT structure contains information about the current Dynamic Data Exchange (DDE)
|
341
|
+
# transaction. A DDE debugging application can use this structure when monitoring transactions that the
|
342
|
+
# system passes to the DDE callback functions of other applications.
|
343
|
+
#
|
344
|
+
# [*Typedef*] struct { UINT cb; DWORD dwTime; HANDLE hTask; DWORD dwRet; UINT wType; UINT wFmt; HCONV
|
345
|
+
# hConv; HSZ hsz1; HSZ hsz2; HDDEDATA hData; ULONG_PTR dwData1; ULONG_PTR dwData2;
|
346
|
+
# CONVCONTEXT cc; DWORD cbData; DWORD Data[8] } MONCBSTRUCT;
|
347
|
+
#
|
348
|
+
# cb:: Specifies the structure's size, in bytes.
|
349
|
+
# dwTime:: Specifies the Windows time at which the transaction occurred. Windows time is the number of
|
350
|
+
# milliseconds that have elapsed since the system was booted.
|
351
|
+
# hTask:: Handle to the task (app instance) containing the DDE callback function that received the transaction.
|
352
|
+
# dwRet:: Specifies the value returned by the DDE callback function that processed the transaction.
|
353
|
+
# wType:: Specifies the transaction type.
|
354
|
+
# wFmt:: Specifies the format of the data exchanged (if any) during the transaction.
|
355
|
+
# hConv:: Handle to the conversation in which the transaction took place.
|
356
|
+
# hsz1:: Handle to a string.
|
357
|
+
# hsz2:: Handle to a string.
|
358
|
+
# hData:: Handle to the data exchanged (if any) during the transaction.
|
359
|
+
# dwData1:: Specifies additional data.
|
360
|
+
# dwData2:: Specifies additional data.
|
361
|
+
# cc:: Specifies a CONVCONTEXT structure containing language information used to share data in different languages.
|
362
|
+
# cbData:: Specifies the amount, in bytes, of data being passed with the transaction. This value can be
|
363
|
+
# more than 32 bytes.
|
364
|
+
# Data:: Contains the first 32 bytes of data being passed with the transaction (8 * sizeof(DWORD)).
|
365
|
+
# ---
|
366
|
+
# *Information*:
|
367
|
+
# Header Declared in Ddeml.h, include Windows.h
|
368
|
+
|
369
|
+
class MonCbStruct < FFI::Struct # :nodoc:
|
370
|
+
layout :cb, :uint,
|
371
|
+
:dw_time, :uint32,
|
372
|
+
:h_task, :ulong,
|
373
|
+
:dw_ret, :uint32,
|
374
|
+
:w_type, :uint,
|
375
|
+
:w_fmt, :uint,
|
376
|
+
:h_conv, :ulong,
|
377
|
+
:hsz1, :ulong,
|
378
|
+
:hsz2, :ulong,
|
379
|
+
:h_data, :pointer,
|
380
|
+
:dw_data1, :pointer,
|
381
|
+
:dw_data2, :pointer,
|
382
|
+
:cc, :pointer,
|
383
|
+
:cb_data, :uint32,
|
384
|
+
:data, [:uint32, 8]
|
385
|
+
end
|
386
|
+
|
387
|
+
# The MONCONVSTRUCT structure contains information about a Dynamic Data Exchange (DDE) conversation. A
|
388
|
+
# DDE monitoring application can use this structure to obtain information about a conversation that has
|
389
|
+
# been established or has terminated.
|
390
|
+
#
|
391
|
+
# [*Typedef*] struct { UINT cb; BOOL fConnect; DWORD dwTime; HANDLE hTask; HSZ hszSvc; HSZ hszTopic;
|
392
|
+
# HCONV hConvClient; HCONV hConvServer } MONCONVSTRUCT;
|
393
|
+
#
|
394
|
+
# cb:: Specifies the structure's size, in bytes.
|
395
|
+
# fConnect:: Indicates whether the conversation is currently established. A value of TRUE indicates the
|
396
|
+
# conversation is established; FALSE indicates it is not.
|
397
|
+
# dwTime:: Specifies the Windows time at which the conversation was established or terminated. Windows
|
398
|
+
# time is the number of milliseconds that have elapsed since the system was booted.
|
399
|
+
# hTask:: Handle to a task (application instance) that is a partner in the conversation.
|
400
|
+
# hszSvc:: Handle to the service name on which the conversation is established.
|
401
|
+
# hszTopic:: Handle to the topic name on which the conversation is established.
|
402
|
+
# hConvClient:: Handle to the client conversation.
|
403
|
+
# hConvServer:: Handle to the server conversation.
|
404
|
+
# ---
|
405
|
+
# *Remarks*:
|
406
|
+
#
|
407
|
+
# Because string handles are local to the process, the hszSvc and hszTopic members are global atoms.
|
408
|
+
# Similarly, conversation handles are local to the instance; therefore, the hConvClient and hConvServer
|
409
|
+
# members are window handles.
|
410
|
+
# The hConvClient and hConvServer members of the MONCONVSTRUCT structure do not hold the same value as
|
411
|
+
# would be seen by the applications engaged in the conversation. Instead, they hold a globally unique
|
412
|
+
# pair of values that identify the conversation.
|
413
|
+
# ---
|
414
|
+
# Structure Information:
|
415
|
+
# Header Declared in Ddeml.h, include Windows.h
|
416
|
+
#
|
417
|
+
class MonConvStruct < FFI::Struct # :nodoc:
|
418
|
+
layout :cb, :uint,
|
419
|
+
:f_connect, :uchar,
|
420
|
+
:dw_time, :uint32,
|
421
|
+
:h_task, :ulong,
|
422
|
+
:hsz_svc, :ulong,
|
423
|
+
:hsz_topic, :ulong,
|
424
|
+
:h_conv_client, :ulong,
|
425
|
+
:h_conv_server, :ulong
|
426
|
+
end
|
427
|
+
|
428
|
+
# The MONERRSTRUCT structure contains information about the current Dynamic Data Exchange (DDE) error. A
|
429
|
+
# DDE monitoring application can use this structure to monitor errors returned by DDE Management Library
|
430
|
+
# functions.
|
431
|
+
#
|
432
|
+
# [*Typedef*] struct { UINT cb; UINT wLastError; DWORD dwTime; HANDLE hTask } MONERRSTRUCT;
|
433
|
+
#
|
434
|
+
# cb:: Specifies the structure's size, in bytes.
|
435
|
+
# wLastError:: Specifies the current error.
|
436
|
+
# dwTime:: Specifies the Windows time at which the error occurred. Windows time is the number of
|
437
|
+
# milliseconds that have elapsed since the system was booted.
|
438
|
+
# hTask:: Handle to the task (application instance) that called the DDE function that caused the error.
|
439
|
+
# ---
|
440
|
+
# Structure Information:
|
441
|
+
# Header Declared in Ddeml.h, include Windows.h
|
442
|
+
#
|
443
|
+
class MonErrStruct < FFI::Struct # :nodoc:
|
444
|
+
layout :cb, :uint,
|
445
|
+
:w_last_error, :uint,
|
446
|
+
:dw_time, :uint32,
|
447
|
+
:h_task, :ulong
|
448
|
+
end
|
449
|
+
|
450
|
+
MH_CREATE = 1
|
451
|
+
MH_KEEP = 2
|
452
|
+
MH_DELETE = 3
|
453
|
+
MH_CLEANUP = 4
|
454
|
+
|
455
|
+
# The MONHSZSTRUCT structure contains information about a Dynamic Data Exchange (DDE) string handle. A
|
456
|
+
# DDE monitoring application can use this structure when monitoring the activity of the string manager
|
457
|
+
# component of the DDE Management Library.
|
458
|
+
#
|
459
|
+
# [*Typedef*] struct { UINT cb; BOOL fsAction; DWORD dwTime; HSZ hsz; HANDLE hTask; TCHAR str[1] } MONHSZSTRUCT;
|
460
|
+
#
|
461
|
+
# cb:: Specifies the structure's size, in bytes.
|
462
|
+
# fsAction:: Specifies the action being performed on the string identified by the hsz member.
|
463
|
+
# MH_CLEANUP:: An application is freeing its DDE resources, causing the system to delete string handles
|
464
|
+
# the application had created. (The application called the DdeUninitialize function.)
|
465
|
+
# MH_CREATE:: An application is creating a string handle. (The app called the DdeCreateStringHandle)
|
466
|
+
# MH_DELETE:: An application is deleting a string handle. (The app called the DdeFreeStringHandle)
|
467
|
+
# MH_KEEP:: An application is increasing the usage count of a string handle. (The application called the
|
468
|
+
# DdeKeepStringHandle function.)
|
469
|
+
# dwTime:: Specifies the Windows time at which the action specified by the fsAction member takes place.
|
470
|
+
# Windows time is the number of milliseconds that have elapsed since the system was booted.
|
471
|
+
# hsz:: Handle to the string. Because string handles are local to the process, this member is a global atom.
|
472
|
+
# hTask:: Handle to the task (application instance) performing the action on the string handle.
|
473
|
+
# str:: Pointer to the string identified by the hsz member.
|
474
|
+
# ---
|
475
|
+
# Structure Information
|
476
|
+
# Header Declared in Ddeml.h, include Windows.h
|
477
|
+
#
|
478
|
+
class MonHszStruct < FFI::Struct # :nodoc:
|
479
|
+
layout :cb, :uint,
|
480
|
+
:fs_action, :uchar,
|
481
|
+
:dw_time, :uint32,
|
482
|
+
:hsz, :ulong,
|
483
|
+
:h_task, :ulong,
|
484
|
+
:str, :pointer
|
485
|
+
end
|
486
|
+
|
487
|
+
# The MONLINKSTRUCT structure contains information about a Dynamic Data Exchange (DDE) advise loop. A
|
488
|
+
# DDE monitoring application can use this structure to obtain information about an advise loop that has
|
489
|
+
# started or ended.
|
490
|
+
#
|
491
|
+
# [*Typedef*] struct { UINT cb; DWORD dwTime; HANDLE hTask; BOOL fEstablished; BOOL fNoData; HSZ hszSvc;
|
492
|
+
# HSZ hszTopic; HSZ hszItem; UINT wFmt; BOOL fServer; HCONV hConvServer; HCONV hConvClient }
|
493
|
+
# MONLINKSTRUCT;
|
494
|
+
#
|
495
|
+
# cb:: Specifies the structure's size, in bytes.
|
496
|
+
# dwTime:: Specifies the Windows time at which the advise loop was started or ended. Windows time is the
|
497
|
+
# number of milliseconds that have elapsed since the system was booted.
|
498
|
+
# hTask:: Handle to a task (application instance) that is a partner in the advise loop.
|
499
|
+
# fEstablished:: Indicates whether an advise loop was successfully established. A value of TRUE
|
500
|
+
# indicates an advise loop was established; FALSE indicates it was not.
|
501
|
+
# fNoData:: Indicates whether the XTYPF_NODATA flag is set for the advise loop. A value of TRUE
|
502
|
+
# indicates the flag is set; FALSE indicates it is not.
|
503
|
+
# hszSvc:: Handle to the service name of the server in the advise loop.
|
504
|
+
# hszTopic:: Handle to the topic name on which the advise loop is established.
|
505
|
+
# hszItem:: Handle to the item name that is the subject of the advise loop.
|
506
|
+
# wFmt:: Specifies the format of the data exchanged (if any) during the advise loop.
|
507
|
+
# fServer:: Indicates whether the link notification came from the server. A value of TRUE indicates the
|
508
|
+
# notification came from the server; FALSE indicates otherwise.
|
509
|
+
# hConvServer:: Handle to the server conversation.
|
510
|
+
# hConvClient:: Handle to the client conversation.
|
511
|
+
# ---
|
512
|
+
# *Remarks*:
|
513
|
+
# Because string handles are local to the process, the hszSvc, hszTopic, and hszItem members are global atoms.
|
514
|
+
# The hConvClient and hConvServer members of the MONLINKSTRUCT structure do not hold the same value as
|
515
|
+
# would be seen by the applications engaged in the conversation. Instead, they hold a globally unique
|
516
|
+
# pair of values that identify the conversation.
|
517
|
+
# ---
|
518
|
+
# Structure Information
|
519
|
+
# Header Declared in Ddeml.h, include Windows.h
|
520
|
+
#
|
521
|
+
class MonLinkStruct < FFI::Struct # :nodoc:
|
522
|
+
layout :cb, :uint,
|
523
|
+
:dw_time, :uint32,
|
524
|
+
:h_task, :ulong,
|
525
|
+
:f_established, :uchar,
|
526
|
+
:f_no_data, :uchar,
|
527
|
+
:hsz_svc, :ulong,
|
528
|
+
:hsz_topic, :ulong,
|
529
|
+
:hsz_item, :ulong,
|
530
|
+
:w_fmt, :uint,
|
531
|
+
:f_server, :uchar,
|
532
|
+
:h_conv_server, :ulong,
|
533
|
+
:h_conv_client, :ulong
|
534
|
+
end
|
535
|
+
|
536
|
+
# The MONMSGSTRUCT structure contains information about a Dynamic Data Exchange (DDE) message. A DDE
|
537
|
+
# monitoring application can use this structure to obtain information about a DDE message that was sent
|
538
|
+
# or posted.
|
539
|
+
#
|
540
|
+
# [*Typedef*] struct { UINT cb; HWND hwndTo; DWORD dwTime; HANDLE hTask; UINT wMsg; WPARAM wParam;
|
541
|
+
# LPARAM lParam; DDEML_MSG_HOOK_DATA dmhd } MONMSGSTRUCT;
|
542
|
+
#
|
543
|
+
# cb:: Specifies the structure's size, in bytes.
|
544
|
+
# hwndTo:: Handle to the window that receives the DDE message.
|
545
|
+
# dwTime:: Specifies the Windows time at which the message was sent or posted. Windows time is the
|
546
|
+
# number of milliseconds that have elapsed since the system was booted.
|
547
|
+
# hTask:: Handle to the task (application instance) containing the window that receives the DDE message.
|
548
|
+
# wMsg:: Specifies the identifier of the DDE message.
|
549
|
+
# wParam:: Specifies the wParam parameter of the DDE message.
|
550
|
+
# lParam:: Specifies the lParam parameter of the DDE message.
|
551
|
+
# dmhd:: Specifies a DDEML_MSG_HOOK_DATA structure that contains additional information about the DDE message.
|
552
|
+
# ---
|
553
|
+
# Structure Information
|
554
|
+
# Header Declared in Ddeml.h, include Windows.h
|
555
|
+
#
|
556
|
+
class MonMsgStruct < FFI::Struct # :nodoc:
|
557
|
+
layout :cb, :uint,
|
558
|
+
:hwnd_to, :ulong,
|
559
|
+
:dw_time, :uint32,
|
560
|
+
:h_task, :ulong,
|
561
|
+
:w_msg, :uint,
|
562
|
+
:w_param, :uint,
|
563
|
+
:l_param, :long,
|
564
|
+
:dmhd, :pointer
|
565
|
+
end
|
566
|
+
|
567
|
+
# The DDEML_MSG_HOOK_DATA structure contains information about a Dynamic Data Exchange (DDE) message,
|
568
|
+
# and provides read access to the data referenced by the message. This structure is intended to be used
|
569
|
+
# by a Dynamic Data Exchange Management Library (DDEML) monitoring application.
|
570
|
+
#
|
571
|
+
# [*Typedef*] struct { UINT_PTR uiLo; UINT_PTR uiHi; DWORD cbData; DWORD Data } DDEML_MSG_HOOK_DATA;
|
572
|
+
#
|
573
|
+
# uiLo:: Specifies the unpacked low-order word of the lParam parameter associated with the DDE message.
|
574
|
+
# uiHi:: Specifies the unpacked high-order word of the lParam parameter associated with the DDE message.
|
575
|
+
# cbData:: Specifies the amount, in bytes, of data being passed with the message. This value can be > 32.
|
576
|
+
# Data:: Contains the first 32 bytes of data being passed with the message (8 * sizeof(DWORD)).
|
577
|
+
# ---
|
578
|
+
# Structure Information
|
579
|
+
# Header Declared in Ddeml.h, include Windows.h
|
580
|
+
#
|
581
|
+
class DdemlMsgHookData < FFI::Struct # :nodoc:
|
582
|
+
layout :ui_lo, :uint,
|
583
|
+
:ui_hi, :uint,
|
584
|
+
:cb_data, :uint32,
|
585
|
+
:data, :uint32
|
586
|
+
end
|
587
|
+
|
588
|
+
##
|
589
|
+
# The RegisterClipboardFormat function registers a new clipboard format.
|
590
|
+
# This format can then be used as a valid clipboard format.
|
591
|
+
#
|
592
|
+
# [*Syntax*] UINT RegisterClipboardFormat( LPCTSTR lpszFormat )
|
593
|
+
#
|
594
|
+
# lpszFormat:: [in] Pointer to a null-terminated string that names the new format.
|
595
|
+
#
|
596
|
+
# *Returns*:: :uint or nil. If the function succeeds, the return value identifies the registered clipboard format.
|
597
|
+
# If the function fails, the return value is *nil*(not zero). For error info, call GetLastError.
|
598
|
+
# ---
|
599
|
+
# *Remarks*:
|
600
|
+
# If a registered format with the specified name already exists, a new format is not registered and the
|
601
|
+
# return value identifies the existing format. This enables more than one application to copy and paste
|
602
|
+
# data using the same registered clipboard format. Note that the comparison is case-insensitive.
|
603
|
+
# Registered clipboard formats are identified by values in the range 0xC000 through 0xFFFF.
|
604
|
+
# When registered clipboard formats are placed on or retrieved from the clipboard, they must be in the
|
605
|
+
# form of an HGLOBAL value.
|
606
|
+
#
|
607
|
+
# :call-seq:
|
608
|
+
# format_id = register_clipboard_format( format_name )
|
609
|
+
#
|
610
|
+
function :RegisterClipboardFormat, [:pointer], :uint, zeronil: true
|
611
|
+
|
612
|
+
##
|
613
|
+
# The DdeCallback function is an application-defined callback function used with the Dynamic Data Exchange
|
614
|
+
# Management Library (DDEML) functions. It processes Dynamic Data Exchange (DDE) transactions. The PFNCALLBACK
|
615
|
+
# type defines a pointer to this callback function. DdeCallback is a placeholder for the application-defined
|
616
|
+
# function name.
|
617
|
+
#
|
618
|
+
# [*Syntax*] HDDEDATA CALLBACK DdeCallback( UINT uType, UINT uFmt, HCONV hconv, HDDEDATA hsz1, HDDEDATA hsz2,
|
619
|
+
# HDDEDATA hdata, HDDEDATA dwData1, HDDEDATA dwData2);
|
620
|
+
# uType:: [in] Specifies the type of the current transaction. This parameter consists of a combination of
|
621
|
+
# transaction class flags and transaction type flags. The following table describes each of the
|
622
|
+
# transaction classes and provides a list of the transaction types in each class. For information
|
623
|
+
# about a specific transaction type, see the individual description of that type.
|
624
|
+
# - XCLASS_BOOL - A DDE callback function should return TRUE or FALSE when it finishes processing a
|
625
|
+
# transaction that belongs to this class. The XCLASS_BOOL class consists of the following types:
|
626
|
+
# - XTYP_ADVSTART
|
627
|
+
# - *XTYP_CONNECT*: A client uses the XTYP_CONNECT transaction to establish a conversation.
|
628
|
+
# hsz1:: Handle to the topic name.
|
629
|
+
# hsz2:: Handle to the service name.
|
630
|
+
# dwData1:: Pointer to a CONVCONTEXT structure that contains context information for the conversation.
|
631
|
+
# If the client is not a Dynamic Data Exchange Management Library (DDEML) application,
|
632
|
+
# this parameter is 0.
|
633
|
+
# dwData2:: Specifies whether the client is the same application instance as the server. If the
|
634
|
+
# parameter is 1, the client is the same instance. If the parameter is 0, the client
|
635
|
+
# is a different instance.
|
636
|
+
# *Returns*:: A server callback function should return TRUE to allow the client to establish a
|
637
|
+
# conversation on the specified service name and topic name pair, or the function
|
638
|
+
# should return FALSE to deny the conversation. If the callback function returns TRUE
|
639
|
+
# and a conversation is successfully established, the system passes the conversation
|
640
|
+
# handle to the server by issuing an XTYP_CONNECT_CONFIRM transaction to the server's
|
641
|
+
# callback function (unless the server specified the CBF_SKIP_CONNECT_CONFIRMS flag
|
642
|
+
# in the DdeInitialize function).
|
643
|
+
# - XCLASS_DATA - A DDE callback function should return a DDE handle, the CBR_BLOCK return code, or
|
644
|
+
# NULL when it finishes processing a transaction that belongs to this class. The XCLASS_DATA
|
645
|
+
# transaction class consists of the following types:
|
646
|
+
# - XTYP_ADVREQ
|
647
|
+
# - XTYP_REQUEST
|
648
|
+
# - XTYP_WILDCONNECT
|
649
|
+
# - XCLASS_FLAGS - A DDE callback function should return DDE_FACK, DDE_FBUSY, or DDE_FNOTPROCESSED
|
650
|
+
# when it finishes processing a transaction that belongs to this class. The XCLASS_FLAGS transaction
|
651
|
+
# class consists of the following types:
|
652
|
+
# - XTYP_ADVDATA
|
653
|
+
# - XTYP_EXECUTE
|
654
|
+
# - *XTYP_POKE*: A client uses the XTYP_POKE transaction to send unsolicited data to the server.
|
655
|
+
# uFmt:: Specifies the format of the data sent from the server.
|
656
|
+
# hconv:: Handle to the conversation.
|
657
|
+
# hsz1:: Handle to the topic name.
|
658
|
+
# hsz2:: Handle to the item name.
|
659
|
+
# hdata:: Handle to the data that the client is sending to the server.
|
660
|
+
# *Returns*:: A server callback function should return the DDE_FACK flag if it processes this
|
661
|
+
# transaction, the DDE_FBUSY flag if it is too busy to process this transaction,
|
662
|
+
# or the DDE_FNOTPROCESSED flag if it rejects this transaction.
|
663
|
+
# - XCLASS_NOTIFICATION - The transaction types that belong to this class are for notification purposes
|
664
|
+
# only. The return value from the callback function is ignored. The XCLASS_NOTIFICATION transaction
|
665
|
+
# class consists of the following types:
|
666
|
+
# - XTYP_ADVSTOP
|
667
|
+
# - XTYP_CONNECT_CONFIRM
|
668
|
+
# - XTYP_DISCONNECT
|
669
|
+
# - XTYP_ERROR
|
670
|
+
# - XTYP_MONITOR
|
671
|
+
# - XTYP_REGISTER
|
672
|
+
# - XTYP_XACT_COMPLETE
|
673
|
+
# - XTYP_UNREGISTER
|
674
|
+
# uFmt:: [in] Specifies the format in which data is sent or received.
|
675
|
+
# hconv:: [in] Handle to the conversation associated with the current transaction.
|
676
|
+
# hsz1:: [in] Handle to a string. The meaning of this parameter depends on the type of the current transaction.
|
677
|
+
# For the meaning of this parameter, see the description of the transaction type.
|
678
|
+
# hsz2:: [in] Handle to a string. The meaning of this parameter depends on the type of the current transaction.
|
679
|
+
# For the meaning of this parameter, see the description of the transaction type.
|
680
|
+
# hdata:: [in] Handle to DDE data. The meaning of this parameter depends on the type of the current transaction.
|
681
|
+
# For the meaning of this parameter, see the description of the transaction type.
|
682
|
+
# dwData1:: [in] Specifies transaction-specific data. For the meaning, see the description of the transaction type.
|
683
|
+
# dwData2:: [in] Specifies transaction-specific data. For the meaning, see the description of the transaction type.
|
684
|
+
# *Returns*:: The return value depends on the transaction class. For more information about the return values,
|
685
|
+
# see descriptions of the individual transaction types.
|
686
|
+
# ---
|
687
|
+
# *Remarks*:
|
688
|
+
# - The callback function is called asynchronously for transactions that do not involve the creation or termination
|
689
|
+
# of conversations. An application that does not frequently accept incoming messages will have reduced DDE
|
690
|
+
# performance because the Dynamic Data Exchange Management Library (DDEML) uses messages to initiate transactions.
|
691
|
+
# - An application must register the callback function by specifying a pointer to the function in a call to the
|
692
|
+
# DdeInitialize function.
|
693
|
+
#
|
694
|
+
# :call-seq:
|
695
|
+
# DdeCallback block: {|type, format, hconv, hsz1, hsz2, hdata, data1, data2| your code }
|
696
|
+
#
|
697
|
+
callback :DdeCallback, [:uint, :uint, :HCONV, :HDDEDATA, :HDDEDATA, :HDDEDATA, :HDDEDATA, :HDDEDATA], :HDDEDATA
|
698
|
+
|
699
|
+
##
|
700
|
+
# The DdeInitialize function registers an application with the Dynamic Data Exchange Management Library (DDEML).
|
701
|
+
# An application must call this function before calling any other DDEML function.
|
702
|
+
#
|
703
|
+
# [*Syntax*] UINT DdeInitialize( LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd, DWORD ulRes );
|
704
|
+
#
|
705
|
+
# pidInst:: [in, out] Pointer to the application instance identifier.
|
706
|
+
# At initialization, this parameter should point to 0. If the function succeeds, this parameter points
|
707
|
+
# to the instance identifier for the application. This value should be passed as the idInst parameter
|
708
|
+
# in all other DDEML functions that require it. If an application uses multiple instances of the DDEML
|
709
|
+
# dynamic-link library (DLL), the application should provide a different callback function for each
|
710
|
+
# instance. If pidInst points to a nonzero value, reinitialization of the DDEML is implied. In this
|
711
|
+
# case, pidInst must point to a valid application-instance identifier.
|
712
|
+
# pfnCallback:: Pointer to the application-defined Dynamic Data Exchange DdeCallback function. This function
|
713
|
+
# processes DDE transactions sent by the system. For more information, see the DdeCallback.
|
714
|
+
# afCmd:: [in] Specifies a set of APPCMD_, CBF_, and MF_ flags. The APPCMD_ flags provide special
|
715
|
+
# instructions to DdeInitialize. The CBF_ flags specify filters that prevent specific types of transactions
|
716
|
+
# from reaching the callback function. The MF_ flags specify the types of DDE activity that a DDE monitoring
|
717
|
+
# application monitors. Using these flags enhances the performance of a DDE application by eliminating
|
718
|
+
# unnecessary calls to the callback function. This parameter can be one or more of the following values:
|
719
|
+
# APPCLASS_MONITOR, APPCLASS_STANDARD, APPCMD_CLIENTONLY, APPCMD_FILTERINITS;
|
720
|
+
# CBF_FAIL_ALLSVRXACTIONS, CBF_FAIL_ADVISES, CBF_FAIL_CONNECTIONS, CBF_FAIL_EXECUTES, CBF_FAIL_POKES
|
721
|
+
# CBF_FAIL_REQUESTS, CBF_FAIL_SELFCONNECTIONS, CBF_SKIP_ALLNOTIFICATIONS, CBF_SKIP_CONNECT_CONFIRMS
|
722
|
+
# CBF_SKIP_DISCONNECTS, CBF_SKIP_REGISTRATIONS, CBF_SKIP_UNREGISTRATIONS;
|
723
|
+
# MF_CALLBACKS, MF_CONV, MF_ERRORS, MF_HSZ_INFO, MF_LINKS, MF_POSTMSGS, MF_SENDMSGS
|
724
|
+
# ulRes:: Reserved; must be set to zero.
|
725
|
+
#
|
726
|
+
# *Returns*:: If the function succeeds, the return value is DMLERR_NO_ERROR. If the function fails, the return
|
727
|
+
# value is one of the following values:
|
728
|
+
# - DMLERR_DLL_USAGE
|
729
|
+
# - DMLERR_INVALIDPARAMETER
|
730
|
+
# - DMLERR_SYS_ERROR
|
731
|
+
# ---
|
732
|
+
# <b> Enhanced API accepts only 2 parameters (get rid of reserved hsz2):
|
733
|
+
# instance_id:: (optional) Application instance identifier. At initialization, this parameter should be 0, nil
|
734
|
+
# or omitted altogether. If it is nonzero/non-nil, reinitialization of the DDEML is implied.
|
735
|
+
# cmd(afCmd):: obligatory set of flags
|
736
|
+
# ---
|
737
|
+
# *Remarks*:
|
738
|
+
# - An application that uses multiple instances of the DDEML must not pass DDEML objects between instances.
|
739
|
+
# - A DDE monitoring application should not attempt to perform DDE operations (establish conversations,
|
740
|
+
# issue transactions, and so on) within the context of the same application instance.
|
741
|
+
# - A synchronous transaction fails with a DMLERR_REENTRANCY error if any instance of the same task has
|
742
|
+
# a synchronous transaction already in progress.
|
743
|
+
# - The CBF_FAIL_ALLSVRXACTIONS flag causes the DDEML to filter all server transactions and can be changed
|
744
|
+
# by a subsequent call to DdeInitialize. The APPCMD_CLIENTONLY flag prevents the DDEML from creating key
|
745
|
+
# resources for the server and cannot be changed by a subsequent call to DdeInitialize.
|
746
|
+
# - There is an ANSI version and a Unicode version of DdeInitialize. The version called determines the
|
747
|
+
# type of the window procedures used to control DDE conversations (ANSI or Unicode), and the default
|
748
|
+
# value for the iCodePage member of the CONVCONTEXT structure (CP_WINANSI or CP_WINUNICODE).
|
749
|
+
#
|
750
|
+
# :call-seq:
|
751
|
+
# instance_id, status = dde_initialize( [instance_id = 0], cmd )
|
752
|
+
# {|type, format, hconv, hsz1, hsz2, hdata, data1, data2| your dde_callback block}
|
753
|
+
#
|
754
|
+
function :DdeInitialize, [:pointer, :DdeCallback, :uint32, :uint32], :uint,
|
755
|
+
&->(api, old_id=0, cmd, &block){
|
756
|
+
raise ArgumentError, 'No callback block' unless block
|
757
|
+
old_id = 0 unless old_id
|
758
|
+
id = FFI::MemoryPointer.new(:uint32).put_uint32(0, old_id)
|
759
|
+
status = api.call(id, block, cmd, 0)
|
760
|
+
id = status == 0 ? id.get_uint32(0) : nil
|
761
|
+
[id, status] }
|
762
|
+
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
763
|
+
|
764
|
+
##
|
765
|
+
# The DdeUninitialize function frees all Dynamic Data Exchange Management Library (DDEML) resources associated
|
766
|
+
# with the calling application.
|
767
|
+
#
|
768
|
+
# [*Syntax*] BOOL DdeUninitialize( DWORD idInst);
|
769
|
+
#
|
770
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
771
|
+
# *Returns*:: If the function succeeds, the return value is nonzero.
|
772
|
+
# If the function fails, the return value is zero.
|
773
|
+
# ---
|
774
|
+
# *Remarks*
|
775
|
+
# DdeUninitialize terminates any conversations currently open for the application.
|
776
|
+
#
|
777
|
+
# :call-seq:
|
778
|
+
# success = dde_uninitialize( instance_id )
|
779
|
+
#
|
780
|
+
function :DdeUninitialize, [:uint32], :int, boolean: true
|
781
|
+
|
782
|
+
##
|
783
|
+
# The DdeCreateStringHandle function creates a handle that identifies the specified string.
|
784
|
+
# A Dynamic Data Exchange (DDE) client or server application can pass the string handle as a
|
785
|
+
# parameter to other Dynamic Data Exchange Management Library (DDEML) functions.
|
786
|
+
#
|
787
|
+
# [*Syntax*] HSZ DdeCreateStringHandle( DWORD idInst, LPTSTR psz, int iCodePage );
|
788
|
+
#
|
789
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the
|
790
|
+
# DdeInitialize function.
|
791
|
+
# psz:: [in] Pointer to a buffer that contains the null-terminated string for which a handle
|
792
|
+
# is to be created. This string can be up to 255 characters. The reason for this limit is that
|
793
|
+
# DDEML string management functions are implemented using global atoms.
|
794
|
+
# iCodePage:: [in] Specifies the code page used to render the string. This value should be either
|
795
|
+
# CP_WINANSI (the default code page) or CP_WINUNICODE, depending on whether the ANSI or Unicode
|
796
|
+
# version of DdeInitialize was called by the client application.
|
797
|
+
#
|
798
|
+
# *Returns*:: (L) or nil: If the function succeeds, the return value is a string handle.
|
799
|
+
# If the function fails, the return value is 0(changed to nil in enhanced version).
|
800
|
+
# The DdeGetLastError function can be used to get the error code, which can be one of the
|
801
|
+
# following values: DMLERR_NO_ERROR, DMLERR_INVALIDPARAMETER, DMLERR_SYS_ERROR
|
802
|
+
# ---
|
803
|
+
# <b> Enhanced (snake_case) API makes code_page param optional and returns *nil* if handle creation fails. </b>
|
804
|
+
# ---
|
805
|
+
# *Remarks*: The value of a string handle is not related to the case of the string it identifies.
|
806
|
+
# When an application either creates a string handle or receives one in the callback function
|
807
|
+
# and then uses the DdeKeepStringHandle function to keep it, the application must free that string
|
808
|
+
# handle when it is no longer needed. An instance-specific string handle cannot be mapped from string
|
809
|
+
# handle to string and back to string handle.
|
810
|
+
#
|
811
|
+
# :call-seq:
|
812
|
+
# string_handle = dde_create_string_handle( instance_id, string, code_page_id )
|
813
|
+
#
|
814
|
+
function :DdeCreateStringHandle, [:uint32, :pointer, :int], :ulong, zeronil: true,
|
815
|
+
&->(api, instance_id, string, code_page=CP_WINANSI){
|
816
|
+
string_pointer = FFI::MemoryPointer.from_string(string)
|
817
|
+
api.call(instance_id, string_pointer, code_page) }
|
818
|
+
|
819
|
+
##
|
820
|
+
# The DdeFreeStringHandle function frees a string handle in the calling application.
|
821
|
+
#
|
822
|
+
# [*Syntax*] BOOL DdeFreeStringHandle( DWORD idInst, HSZ hsz );
|
823
|
+
#
|
824
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
825
|
+
# hsz:: [in, out] Handle to the string handle to be freed. This handle must have been created by a previous call
|
826
|
+
# to the DdeCreateStringHandle function.
|
827
|
+
# *Returns*:: If the function succeeds, the return value is nonzero. If the function fails, it is zero.
|
828
|
+
# ---
|
829
|
+
# <b> Enhanced snake_case API returns boolean true/false as a success indicator. </b>
|
830
|
+
# ---
|
831
|
+
# *Remarks*:
|
832
|
+
# An application can free string handles it creates with DdeCreateStringHandle but should not free those that
|
833
|
+
# the system passed to the application's Dynamic Data Exchange (DDE) callback function or those returned in the
|
834
|
+
# CONVINFO structure by the DdeQueryConvInfo function.
|
835
|
+
#
|
836
|
+
# :call-seq:
|
837
|
+
# success = dde_free_string_handle( instance_id, string_handle )
|
838
|
+
#
|
839
|
+
function :DdeFreeStringHandle, [:uint32, :ulong], :int, boolean: true
|
840
|
+
|
841
|
+
##
|
842
|
+
# The DdeQueryString function copies text associated with a string handle into a buffer.
|
843
|
+
#
|
844
|
+
# [*Syntax*] DWORD DdeQueryString( DWORD idInst, HSZ hsz, LPTSTR psz, DWORD cchMax, int iCodePage);
|
845
|
+
#
|
846
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
847
|
+
# hsz:: [in] Handle to the string to copy. This handle must have been created by a previous call to the
|
848
|
+
# DdeCreateStringHandle function.
|
849
|
+
# psz:: [in, out] Pointer to a buffer that receives the string. To obtain the length of the string, this parameter
|
850
|
+
# should be set to NULL.
|
851
|
+
# cchMax:: [in] Specifies the length, in TCHARs, of the buffer pointed to by the psz parameter. For the ANSI
|
852
|
+
# version of the function, this is the number of bytes; for the Unicode version, this is the number of
|
853
|
+
# characters. If the string is longer than ( cchMax– 1), it will be truncated. If the psz parameter is
|
854
|
+
# set to NULL, this parameter is ignored.
|
855
|
+
# iCodePage:: [in] Code page used to render the string. This value should be either CP_WINANSI or CP_WINUNICODE.
|
856
|
+
#
|
857
|
+
# *Returns*:: If the psz parameter specified a valid pointer, the return value is the length, in TCHARs, of the
|
858
|
+
# returned text (not including the terminating null character). If the psz parameter specified a NULL
|
859
|
+
# pointer, the return value is the length of the text associated with the hsz parameter (not including
|
860
|
+
# the terminating null character). If an error occurs, the return value is 0L.
|
861
|
+
# ---
|
862
|
+
# <b> Enhanced (snake_case) API makes all args optional except for first (dde instance id), and returns nil if
|
863
|
+
# the function was unsuccessful.</b>
|
864
|
+
# ---
|
865
|
+
# *Remarks*
|
866
|
+
# - The string returned in the buffer is always null-terminated. If the string is longer than ( cchMax– 1),
|
867
|
+
# only the first ( cchMax– 1) characters of the string are copied.
|
868
|
+
# - If the psz parameter is NULL, the DdeQueryString function obtains the length, in bytes, of the string
|
869
|
+
# associated with the string handle. The length does not include the terminating null character.
|
870
|
+
#
|
871
|
+
# :call-seq:
|
872
|
+
# string = dde_query_string( instance_id, handle, [code_page = CP_WINANSI ] )
|
873
|
+
#
|
874
|
+
function :DdeQueryString, [:uint32, :ulong, :pointer, :uint32, :int], :uint32,
|
875
|
+
&->(api, instance_id, handle, code_page = CP_WINANSI){
|
876
|
+
buffer = FFI::MemoryPointer.new :char, 1024
|
877
|
+
num_chars = api.call(instance_id, handle, buffer, buffer.size, code_page)
|
878
|
+
num_chars == 0 ? nil : buffer.get_bytes(0, num_chars) }
|
879
|
+
|
880
|
+
##
|
881
|
+
# The DdeNameService function registers or unregisters the service names a Dynamic Data Exchange (DDE) server
|
882
|
+
# supports. This function causes the system to send XTYP_REGISTER or XTYP_UNREGISTER transactions to other running
|
883
|
+
# Dynamic Data Exchange Management Library (DDEML) client applications.
|
884
|
+
#
|
885
|
+
# [*Syntax*] HDDEDATA DdeNameService( DWORD idInst, UINT hsz1, UINT hsz2, UINT afCmd );
|
886
|
+
#
|
887
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
888
|
+
# hsz1:: [in] Handle to the string that specifies the service name the server is registering or unregistering.
|
889
|
+
# An application that is unregistering all of its service names should set this parameter to 0L.
|
890
|
+
# hsz2:: Reserved; should be set to 0L.
|
891
|
+
# afCmd:: [in] Specifies the service name options. This parameter can be one of the following values.
|
892
|
+
# DNS_REGISTER:: Registers the service name.
|
893
|
+
# DNS_UNREGISTER:: Unregisters the service name. If the hsz1 parameter is 0L,
|
894
|
+
# all service names registered by the server will be unregistered.
|
895
|
+
# DNS_FILTERON:: Turns on service name initiation filtering. The filter prevents a server from receiving
|
896
|
+
# XTYP_CONNECT transactions for service names it has not registered. This is the default
|
897
|
+
# setting for this filter. If a server application does not register any service names,
|
898
|
+
# the application cannot receive XTYP_WILDCONNECT transactions.
|
899
|
+
# DNS_FILTEROFF:: Turns off service name initiation filtering. If this flag is specified, the server
|
900
|
+
# receives an XTYP_CONNECT transaction whenever another DDE application calls the
|
901
|
+
# DdeConnect function, regardless of the service name.
|
902
|
+
# *Returns*:: If the function succeeds, it returns nonzero (*true* in snake_case method). For CamelCase, that
|
903
|
+
# value is not really HDDEDATA value, but merely a Boolean indicator of success. The function is
|
904
|
+
# typed HDDEDATA to allow for future expansion of the function and more sophisticated returns.
|
905
|
+
# If the function fails, the return value is 0L (*false* in snake_case method). The DdeGetLastError
|
906
|
+
# function can be used to get the error code, which can be one of the following:
|
907
|
+
# - DMLERR_DLL_NOT_INITIALIZED
|
908
|
+
# - DMLERR_DLL_USAGE
|
909
|
+
# - DMLERR_INVALIDPARAMETER
|
910
|
+
# - DMLERR_NO_ERROR
|
911
|
+
# ---
|
912
|
+
# <b> Enhanced API accepts only 3 parameters (get rid of reserved hsz2) and returns boolean true/false. </b>
|
913
|
+
# ---
|
914
|
+
# *Remarks*:
|
915
|
+
# The service name identified by the hsz1 parameter should be a base name (that is, the name should contain no
|
916
|
+
# instance-specific information). The system generates an instance-specific name and sends it along with the
|
917
|
+
# base name during the XTYP_REGISTER and XTYP_UNREGISTER transactions. The receiving applications can then
|
918
|
+
# connect to the specific application instance.
|
919
|
+
#
|
920
|
+
# :call-seq:
|
921
|
+
# success = dde_name_service( instance_id, string_handle, cmd )
|
922
|
+
#
|
923
|
+
function :DdeNameService, [:uint32, :ulong, :ulong, :uint], :ulong,
|
924
|
+
&->(api, id, string_handle, cmd){ api.call(id, string_handle, 0, cmd) != 0 }
|
925
|
+
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
926
|
+
|
927
|
+
##
|
928
|
+
# DdeConnect function establishes a conversation with a server application that supports the specified service
|
929
|
+
# name and topic name pair. If more than one such server exists, the system selects only one.
|
930
|
+
#
|
931
|
+
# [*Syntax*] HCONV DdeConnect( DWORD idInst, HSZ hszService, HSZ hszTopic, PCONVCONTEXT pCC );
|
932
|
+
#
|
933
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
934
|
+
# hszService:: [in] Handle to the string that specifies the service name of the server application with which
|
935
|
+
# a conversation is to be established. This handle must have been created by a previous call to
|
936
|
+
# the DdeCreateStringHandle function. If this parameter is 0L, a conversation is established with
|
937
|
+
# any available server.
|
938
|
+
# hszTopic:: [in] Handle to the string that specifies the name of the topic on which a conversation is to be
|
939
|
+
# established. This handle must have been created by a previous call to DdeCreateStringHandle.
|
940
|
+
# If this parameter is 0L, a conversation on any topic supported by the selected server is established.
|
941
|
+
# pCC:: [in] Pointer to the CONVCONTEXT structure that contains conversation context information. If this
|
942
|
+
# parameter is NULL, the server receives the default CONVCONTEXT structure during the XTYP_CONNECT
|
943
|
+
# or XTYP_WILDCONNECT transaction.
|
944
|
+
# *Returns*:: If the function succeeds, the return value is the handle to the established conversation.
|
945
|
+
# If the function fails, the return value is 0L. The DdeGetLastError function can be used to get
|
946
|
+
# the error code, which can be one of the following values:
|
947
|
+
# - DMLERR_DLL_NOT_INITIALIZED
|
948
|
+
# - DMLERR_INVALIDPARAMETER
|
949
|
+
# - DMLERR_NO_CONV_ESTABLISHED
|
950
|
+
# - DMLERR_NO_ERROR
|
951
|
+
# ---
|
952
|
+
# *Remarks*
|
953
|
+
# - The client application cannot make assumptions regarding the server selected. If an instance-specific name
|
954
|
+
# is specified in the hszService parameter, a conversation is established with only the specified instance.
|
955
|
+
# Instance-specific service names are passed to an application's Dynamic Data Exchange (DDE) callback function
|
956
|
+
# during the XTYP_REGISTER and XTYP_UNREGISTER transactions.
|
957
|
+
# - All members of the default CONVCONTEXT structure are set to zero except cb, which specifies the size of the
|
958
|
+
# structure, and iCodePage, which specifies CP_WINANSI (the default code page) or CP_WINUNICODE, depending on
|
959
|
+
# whether the ANSI or Unicode version of the DdeInitialize function was called by the client application.
|
960
|
+
# ---
|
961
|
+
# <b>Enhanced (snake_case) API makes all args optional except for first (dde instance id), and returns nil if
|
962
|
+
# the function was unsuccessful.</b>
|
963
|
+
#
|
964
|
+
# :call-seq:
|
965
|
+
# conversation_handle = dde_connect( instance_id, [service = 0, topic = 0, context = nil] )
|
966
|
+
#
|
967
|
+
function :DdeConnect, [:uint32, :ulong, :ulong, :pointer], :ulong, zeronil: true,
|
968
|
+
&->(api, instance_id, service = 0, topic = 0, context = nil){
|
969
|
+
api.call(instance_id, service, topic, context) }
|
970
|
+
|
971
|
+
##
|
972
|
+
# The DdeDisconnect function terminates a conversation started by either the DdeConnect or DdeConnectList function
|
973
|
+
# and invalidates the specified conversation handle.
|
974
|
+
#
|
975
|
+
# [*Syntax*] BOOL DdeDisconnect( HCONV hConv );
|
976
|
+
#
|
977
|
+
# hConv:: [in, out] Handle to the active conversation to be terminated.
|
978
|
+
#
|
979
|
+
# *Returns*:: If the function succeeds, the return value is nonzero, otherwise zero. The DdeGetLastError function
|
980
|
+
# can be used to get the error code, which can be one of the following values:
|
981
|
+
# - DMLERR_DLL_NOT_INITIALIZED
|
982
|
+
# - DMLERR_NO_CONV_ESTABLISHED
|
983
|
+
# - DMLERR_NO_ERROR
|
984
|
+
# ---
|
985
|
+
# *Remarks*:
|
986
|
+
# Any incomplete transactions started before calling DdeDisconnect are immediately abandoned. The XTYP_DISCONNECT
|
987
|
+
# transaction is sent to the Dynamic Data Exchange (DDE) callback function of the partner in the conversation.
|
988
|
+
# Generally, only client applications must terminate conversations.
|
989
|
+
# ---
|
990
|
+
# <b>Enhanced (snake_case) API returns *true/false* instead of nonzero/zero.</b>
|
991
|
+
#
|
992
|
+
# :call-seq:
|
993
|
+
# success = dde_disconnect(conversation_handle)
|
994
|
+
#
|
995
|
+
function :DdeDisconnect, [:ulong], :int, boolean: true
|
996
|
+
|
997
|
+
|
998
|
+
##
|
999
|
+
# The DdeGetLastError function retrieves the most recent error code set by the failure of a Dynamic Data Exchange
|
1000
|
+
# Management Library (DDEML) function and resets the error code to DMLERR_NO_ERROR.
|
1001
|
+
#
|
1002
|
+
# [*Syntax*] UINT DdeGetLastError( DWORD idInst );
|
1003
|
+
#
|
1004
|
+
# idInst:: [in] Specifies the application instance identifier obtained by a previous call to the DdeInitialize.
|
1005
|
+
#
|
1006
|
+
# *Returns*:: If the function succeeds, the return value is the last error code, which can be one of the following:
|
1007
|
+
# DMLERR_ADVACKTIMEOUT, DMLERR_EXECACKTIMEOUT, DMLERR_INVALIDPARAMETER, DMLERR_LOW_MEMORY, DMLERR_MEMORY_ERROR,
|
1008
|
+
# DMLERR_NO_CONV_ESTABLISHED, DMLERR_NOTPROCESSED, DMLERR_POKEACKTIMEOUT, DMLERR_POSTMSG_FAILED, DMLERR_REENTRANCY,
|
1009
|
+
# DMLERR_SERVER_DIED, DMLERR_SYS_ERROR, DMLERR_UNADVACKTIMEOUT, DMLERR_UNFOUND_QUEUE_ID
|
1010
|
+
# ---
|
1011
|
+
# <b>Enhanced (snake_case) API returns *nil* if the function was unsuccessful (that is, no DDE errors raised).</b>
|
1012
|
+
# ---
|
1013
|
+
#
|
1014
|
+
# :call-seq:
|
1015
|
+
# string = dde_get_last_error( instance_id )
|
1016
|
+
#
|
1017
|
+
function :DdeGetLastError, [:uint32], :int, zeronil: true
|
1018
|
+
|
1019
|
+
##
|
1020
|
+
# The DdeClientTransaction function begins a data transaction between a client and a server. Only a
|
1021
|
+
# Dynamic Data Exchange (DDE) client application can call this function, and the application can use it
|
1022
|
+
# only after establishing a conversation with the server.
|
1023
|
+
#
|
1024
|
+
# [*Syntax*] HDDEDATA DdeClientTransaction( LPBYTE pData, DWORD cbData, HCONV hConv, HSZ hszItem, UINT
|
1025
|
+
# wFmt, UINT wType, DWORD dwTimeout, LPDWORD pdwResult );
|
1026
|
+
#
|
1027
|
+
# pData:: [in] Pointer to the beginning of the data the client must pass to the server.
|
1028
|
+
# Optionally, an application can specify the data handle (HDDEDATA) to pass to the server and in that
|
1029
|
+
# case the cbData parameter should be set to -1. This parameter is required only if the wType parameter
|
1030
|
+
# is XTYP_EXECUTE or XTYP_POKE. Otherwise, this parameter should be NULL.
|
1031
|
+
# For the optional usage of this parameter, XTYP_POKE transactions where pData is a data handle, the
|
1032
|
+
# handle must have been created by a previous call to the DdeCreateDataHandle function, employing the
|
1033
|
+
# same data format specified in the wFmt parameter.
|
1034
|
+
# cbData:: [in] Specifies the length, in bytes, of the data pointed to by the pData parameter, including
|
1035
|
+
# the terminating NULL, if the data is a string. A value of -1 indicates that pData is a data
|
1036
|
+
# handle that identifies the data being sent.
|
1037
|
+
# hConv:: [in] Handle to the conversation in which the transaction is to take place.
|
1038
|
+
# hszItem:: [in] Handle to the data item for which data is being exchanged during the transaction. This
|
1039
|
+
# handle must have been created by a previous call to the DdeCreateStringHandle function. This
|
1040
|
+
# parameter is ignored (and should be set to 0L) if the wType parameter is XTYP_EXECUTE.
|
1041
|
+
# wFmt:: [in] Specifies the standard clipboard format in which the data item is being submitted or
|
1042
|
+
# requested. If the transaction specified by the wType parameter does not pass data or is XTYP_EXECUTE,
|
1043
|
+
# this parameter should be zero.
|
1044
|
+
# If the transaction specified by the wType parameter references non-execute DDE data ( XTYP_POKE,
|
1045
|
+
# XTYP_ADVSTART, XTYP_ADVSTOP, XTYP_REQUEST), the wFmt value must be either a valid predefined (CF_) DDE
|
1046
|
+
# format or a valid registered clipboard format.
|
1047
|
+
# wType:: [in] Specifies the transaction type. This parameter can be one of the following values.
|
1048
|
+
# - XTYP_ADVSTART: Begins an advise loop. Any number of distinct advise loops can exist within a
|
1049
|
+
# conversation. An application can alter the advise loop type by combining the XTYP_ADVSTART
|
1050
|
+
# transaction type with one or more of the following flags: Flag Meaning
|
1051
|
+
# - XTYPF_NODATA Instructs the server to notify the client of any data changes without actually sending
|
1052
|
+
# the data. This flag gives the client the option of ignoring the notification or requesting the changed
|
1053
|
+
# data from the server.
|
1054
|
+
# - XTYPF_ACKREQ Instructs the server to wait until the client acknowledges that it received the previous
|
1055
|
+
# data item before sending the next data item. This flag prevents a fast server from sending data faster
|
1056
|
+
# than the client can process it.
|
1057
|
+
# - XTYP_ADVSTOP: Ends an advise loop.
|
1058
|
+
# - XTYP_EXECUTE: Begins an execute transaction.
|
1059
|
+
# - XTYP_POKE: Begins a poke transaction.
|
1060
|
+
# - XTYP_REQUEST: Begins a request transaction.
|
1061
|
+
# dwTimeout:: [in] Specifies the maximum amount of time, in milliseconds, that the client will wait for
|
1062
|
+
# a response from the server application in a synchronous transaction. This parameter should
|
1063
|
+
# be TIMEOUT_ASYNC for asynchronous transactions.
|
1064
|
+
# pdwResult:: [out] Pointer to a variable that receives the result of the transaction. An application
|
1065
|
+
# that does not check the result can use NULL for this value. For synchronous transactions,
|
1066
|
+
# the low-order word of this variable contains any applicable DDE_ flags resulting from the
|
1067
|
+
# transaction. This provides support for applications dependent on DDE_APPSTATUS bits. It
|
1068
|
+
# is, however, recommended that applications no longer use these bits because they may not
|
1069
|
+
# be supported in future versions of the Dynamic Data Exchange Management Library (DDEML).
|
1070
|
+
# For asynchronous transactions, this variable is filled with a unique transaction
|
1071
|
+
# identifier for use with the DdeAbandonTransaction function and the XTYP_XACT_COMPLETE
|
1072
|
+
# transaction.
|
1073
|
+
#
|
1074
|
+
# *Returns*:: If the function succeeds, the return value is a data handle that identifies the data for
|
1075
|
+
# successful synchronous transactions in which the client expects data from the server. The
|
1076
|
+
# return value is nonzero for successful asynchronous transactions and for synchronous
|
1077
|
+
# transactions in which the client does not expect data. The return value is zero for all
|
1078
|
+
# unsuccessful transactions.
|
1079
|
+
# The DdeGetLastError function can be used to get the error code, which can be one of the following values:
|
1080
|
+
# - DMLERR_ADVACKTIMEOUT
|
1081
|
+
# - DMLERR_BUSY
|
1082
|
+
# - DMLERR_DATAACKTIMEOUT
|
1083
|
+
# - DMLERR_DLL_NOT_INITIALIZED
|
1084
|
+
# - DMLERR_EXECACKTIMEOUT
|
1085
|
+
# - DMLERR_INVALIDPARAMETER
|
1086
|
+
# - DMLERR_MEMORY_ERROR
|
1087
|
+
# - DMLERR_NO_CONV_ESTABLISHED
|
1088
|
+
# - DMLERR_NO_ERROR
|
1089
|
+
# - DMLERR_NOTPROCESSED
|
1090
|
+
# - DMLERR_POKEACKTIMEOUT
|
1091
|
+
# - DMLERR_POSTMSG_FAILED
|
1092
|
+
# - DMLERR_REENTRANCY
|
1093
|
+
# - DMLERR_SERVER_DIED
|
1094
|
+
# - DMLERR_UNADVACKTIMEOUT
|
1095
|
+
# ---
|
1096
|
+
# *Remarks*:
|
1097
|
+
# When an application has finished using the data handle returned by DdeClientTransaction, the application should
|
1098
|
+
# free the handle by calling the DdeFreeDataHandle function.
|
1099
|
+
#
|
1100
|
+
#Transactions can be synchronous or asynchronous. During a synchronous transaction, DdeClientTransaction does not
|
1101
|
+
# return until the transaction either completes successfully or fails. Synchronous transactions cause a client to
|
1102
|
+
# enter a modal loop while waiting for various asynchronous events. Because of this, a client application can still
|
1103
|
+
# respond to user input while waiting on a synchronous transaction, but the application cannot begin a second
|
1104
|
+
# synchronous transaction because of the activity associated with the first. DdeClientTransaction fails if any
|
1105
|
+
# instance of the same task has a synchronous transaction already in progress.
|
1106
|
+
#
|
1107
|
+
# During an asynchronous transaction, DdeClientTransaction returns after the transaction has begun,
|
1108
|
+
# passing a transaction identifier for reference. When the server's DDE callback function finishes
|
1109
|
+
# processing an asynchronous transaction, the system sends an XTYP_XACT_COMPLETE transaction to the
|
1110
|
+
# client. This transaction provides the client with the results of the asynchronous transaction that it
|
1111
|
+
# initiated by calling DdeClientTransaction. A client application can choose to abandon an asynchronous
|
1112
|
+
# transaction by calling the DdeAbandonTransaction function.
|
1113
|
+
# ---
|
1114
|
+
# <b>Enhanced (snake_case) API: </b>
|
1115
|
+
#
|
1116
|
+
# :call-seq:
|
1117
|
+
# data_handle = dde_client_transaction(data_pointer, size, conv, item, format, type, timeout, result)
|
1118
|
+
#
|
1119
|
+
function :DdeClientTransaction, [:pointer, :uint32, :ulong, :ulong, :uint, :uint, :uint32, :pointer],
|
1120
|
+
:HDDEDATA, zeronil: true
|
1121
|
+
|
1122
|
+
##
|
1123
|
+
# The DdeGetData function copies data from the specified Dynamic Data Exchange (DDE) object to the specified
|
1124
|
+
# local buffer.
|
1125
|
+
#
|
1126
|
+
# [*Syntax*] DWORD DdeGetData( HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff );
|
1127
|
+
#
|
1128
|
+
# hData:: [in] Handle to the DDE object that contains the data to copy.
|
1129
|
+
# pDst:: [out] Pointer to the buffer that receives the data. If this parameter is NULL, the DdeGetData
|
1130
|
+
# function returns the amount of data, in bytes, that would be copied to the buffer.
|
1131
|
+
# cbMax:: [in] Specifies the maximum amount of data, in bytes, to copy to the buffer pointed to by the pDst
|
1132
|
+
# parameter. Typically, this parameter specifies the length of the buffer pointed to by pDst.
|
1133
|
+
# cbOff:: [in] Specifies an offset within the DDE object. Data is copied from the object beginning at this offset.
|
1134
|
+
#
|
1135
|
+
# *Returns*:: If the pDst parameter points to a buffer, return value is the size, in bytes, of the memory object
|
1136
|
+
# associated with the data handle or the size specified in the cbMax parameter, whichever is lower.
|
1137
|
+
# If the pDst parameter is NULL, the return value is the size, in bytes, of the memory object
|
1138
|
+
# associated with the data handle.
|
1139
|
+
# The DdeGetLastError function can be used to get the error code, which can be one of the following:
|
1140
|
+
# - DMLERR_DLL_NOT_INITIALIZED
|
1141
|
+
# - DMLERR_INVALIDPARAMETER
|
1142
|
+
# - DMLERR_NO_ERROR
|
1143
|
+
# ---
|
1144
|
+
# <b> Enhanced (snake_case) API accepts data handle, and optionally max and offset (no need to pre-allocate
|
1145
|
+
# buffer). It returns pointer to copied DDE data (FFI::MemoryPointer) and size of copied data in bytes.
|
1146
|
+
# In case of failure, it returns [nil, 0]. This API is the same as for enhanced dde_access_data.
|
1147
|
+
# No need to call function twice (first time with nil buffer just to determine length).</b>
|
1148
|
+
# ---
|
1149
|
+
#
|
1150
|
+
# :call-seq:
|
1151
|
+
# buffer, size = dde_get_data( data_handle, [max = infinite, offset = 0] )
|
1152
|
+
#
|
1153
|
+
function :DdeGetData, [:ulong, :pointer, :uint32, :uint32], :uint,
|
1154
|
+
&->(api, data_handle, max=1073741823, offset=0){ # max is maximum DWORD Fixnum
|
1155
|
+
size = api.call(data_handle, nil, 0, 0) # determining data set length
|
1156
|
+
if size == 0
|
1157
|
+
[nil, 0]
|
1158
|
+
else
|
1159
|
+
copy_size = size < max ? size : max
|
1160
|
+
buffer = FFI::MemoryPointer.new(:char, offset + copy_size)
|
1161
|
+
size = api.call(data_handle, buffer, copy_size, offset)
|
1162
|
+
[buffer, size]
|
1163
|
+
end }
|
1164
|
+
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
1165
|
+
|
1166
|
+
|
1167
|
+
##
|
1168
|
+
# The DdeAccessData function provides access to the data in the specified Dynamic Data Exchange (DDE)
|
1169
|
+
# object. An application must call the DdeUnaccessData function when it has finished accessing the data
|
1170
|
+
# in the object.
|
1171
|
+
#
|
1172
|
+
# [*Syntax*] LPBYTE DdeAccessData( HDDEDATA hData, LPDWORD pcbDataSize );
|
1173
|
+
#
|
1174
|
+
# hData:: [in] Handle to the DDE object to access.
|
1175
|
+
# pcbDataSize:: [out] Pointer to a variable that receives the size, in bytes, of the DDE object
|
1176
|
+
# identified by the hData parameter. If this parameter is NULL, no size information is
|
1177
|
+
# returned.
|
1178
|
+
#
|
1179
|
+
# *Returns*:: If the function succeeds, the return value is a pointer to the first byte of data in the
|
1180
|
+
# DDE object.
|
1181
|
+
# If the function fails, the return value is NULL.
|
1182
|
+
# The DdeGetLastError function can be used to get the error code, which can be one of the following
|
1183
|
+
# values:
|
1184
|
+
# DMLERR_DLL_NOT_INITIALIZED
|
1185
|
+
# DMLERR_INVALIDPARAMETER
|
1186
|
+
# DMLERR_NO_ERROR
|
1187
|
+
# ---
|
1188
|
+
# *Remarks*:
|
1189
|
+
# If the hData parameter has not been passed to a Dynamic Data Exchange Management Library (DDEML)
|
1190
|
+
# function, an application can use the pointer returned by DdeAccessData for read-write access to the
|
1191
|
+
# DDE object. If hData has already been passed to a DDEML function, the pointer should be used only for
|
1192
|
+
# read access to the memory object.
|
1193
|
+
#
|
1194
|
+
# ---
|
1195
|
+
# <b>Enhanced (snake_case) API accepts DDE data handle and returns FFI::MemoryPointer to raw data and
|
1196
|
+
# size of data set in bytes (same API as enhanced dde_get_data). Returns [nil, 0] in case of failure. </b>
|
1197
|
+
#
|
1198
|
+
# :call-seq:
|
1199
|
+
# data_pointer, size = dde_access_data( data_handle )
|
1200
|
+
#
|
1201
|
+
function :DdeAccessData, [:HDDEDATA, :pointer], :pointer,
|
1202
|
+
&->(api, data_handle){
|
1203
|
+
size_buffer = FFI::MemoryPointer.new(:uint32)
|
1204
|
+
buffer = api.call(data_handle, size_buffer)
|
1205
|
+
size = size_buffer.get_uint32(0)
|
1206
|
+
size == 0 ? [nil, 0] : [buffer, size] }
|
1207
|
+
# weird lambda literal instead of block is needed because RDoc goes crazy if block is attached to meta-definition
|
1208
|
+
|
1209
|
+
##
|
1210
|
+
# The DdeUnaccessData function unaccesses a Dynamic Data Exchange (DDE) object. An application must call
|
1211
|
+
# this function after it has finished accessing the object.
|
1212
|
+
#
|
1213
|
+
# [*Syntax*] BOOL DdeUnaccessData( HDDEDATA hData );
|
1214
|
+
#
|
1215
|
+
# hData:: [in] Handle to the DDE object.
|
1216
|
+
#
|
1217
|
+
# *Returns*:: If the function succeeds, the return value is nonzero.
|
1218
|
+
# If the function fails, the return value is zero.
|
1219
|
+
# The DdeGetLastError function can be used to get the error code, which can be one of the following
|
1220
|
+
# values:
|
1221
|
+
# DMLERR_DLL_NOT_INITIALIZED
|
1222
|
+
# DMLERR_INVALIDPARAMETER
|
1223
|
+
# DMLERR_NO_ERROR
|
1224
|
+
#
|
1225
|
+
# ---
|
1226
|
+
# <b>Enhanced (snake_case) API returns true/false instead of nonzero/zero: </b>
|
1227
|
+
#
|
1228
|
+
# :call-seq:
|
1229
|
+
# success = dde_unaccess_data(data_handle)
|
1230
|
+
#
|
1231
|
+
function :DdeUnaccessData, [:HDDEDATA], :int8, boolean: true
|
1232
|
+
|
1233
|
+
end
|
1234
|
+
end
|