dde 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/doc/ddeml.d.txt ADDED
@@ -0,0 +1,374 @@
1
+ /***********************************************************************\
2
+ * ddeml.d *
3
+ * *
4
+ * Windows API header module *
5
+ * *
6
+ * Translated from MinGW Windows headers *
7
+ * by Stewart Gordon *
8
+ * *
9
+ * Placed into public domain *
10
+ \***********************************************************************/
11
+ module win32.ddeml;
12
+ pragma(lib, "user32.lib");
13
+
14
+ private import win32.basetsd, win32.windef, win32.winnt;
15
+
16
+ enum : int {
17
+ CP_WINANSI = 1004,
18
+ CP_WINUNICODE = 1200
19
+ }
20
+
21
+ enum : UINT {
22
+ XTYPF_NOBLOCK = 2,
23
+ XTYPF_NODATA = 4,
24
+ XTYPF_ACKREQ = 8
25
+ }
26
+
27
+ enum : UINT {
28
+ XCLASS_MASK = 0xFC00,
29
+ XCLASS_BOOL = 0x1000,
30
+ XCLASS_DATA = 0x2000,
31
+ XCLASS_FLAGS = 0x4000,
32
+ XCLASS_NOTIFICATION = 0x8000
33
+ }
34
+
35
+ enum : UINT {
36
+ XST_NULL,
37
+ XST_INCOMPLETE,
38
+ XST_CONNECTED,
39
+ XST_INIT1,
40
+ XST_INIT2,
41
+ XST_REQSENT,
42
+ XST_DATARCVD,
43
+ XST_POKESENT,
44
+ XST_POKEACKRCVD,
45
+ XST_EXECSENT,
46
+ XST_EXECACKRCVD,
47
+ XST_ADVSENT,
48
+ XST_UNADVSENT,
49
+ XST_ADVACKRCVD,
50
+ XST_UNADVACKRCVD,
51
+ XST_ADVDATASENT,
52
+ XST_ADVDATAACKRCVD // = 16
53
+ }
54
+
55
+ enum : UINT {
56
+ XTYP_ERROR = XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
57
+ XTYP_ADVDATA = 0x0010 | XCLASS_FLAGS,
58
+ XTYP_ADVREQ = 0x0020 | XCLASS_DATA | XTYPF_NOBLOCK,
59
+ XTYP_ADVSTART = 0x0030 | XCLASS_BOOL,
60
+ XTYP_ADVSTOP = 0x0040 | XCLASS_NOTIFICATION,
61
+ XTYP_EXECUTE = 0x0050 | XCLASS_FLAGS,
62
+ XTYP_CONNECT = 0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK,
63
+ XTYP_CONNECT_CONFIRM = 0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
64
+ XTYP_XACT_COMPLETE = 0x0080 | XCLASS_NOTIFICATION,
65
+ XTYP_POKE = 0x0090 | XCLASS_FLAGS,
66
+ XTYP_REGISTER = 0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
67
+ XTYP_REQUEST = 0x00B0 | XCLASS_DATA,
68
+ XTYP_DISCONNECT = 0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
69
+ XTYP_UNREGISTER = 0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
70
+ XTYP_WILDCONNECT = 0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK,
71
+ XTYP_MONITOR = 0X00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
72
+ XTYP_MASK = 0x00F0,
73
+ XTYP_SHIFT = 4
74
+ }
75
+
76
+ /+
77
+ #define TIMEOUT_ASYNC 0xFFFFFFFF
78
+ #define QID_SYNC 0xFFFFFFFF
79
+ +/
80
+
81
+ enum : UINT {
82
+ ST_CONNECTED = 1,
83
+ ST_ADVISE = 2,
84
+ ST_ISLOCAL = 4,
85
+ ST_BLOCKED = 8,
86
+ ST_CLIENT = 16,
87
+ ST_TERMINATED = 32,
88
+ ST_INLIST = 64,
89
+ ST_BLOCKNEXT = 128,
90
+ ST_ISSELF = 256
91
+ }
92
+
93
+ /+
94
+ #define CADV_LATEACK 0xFFFF
95
+ +/
96
+
97
+ enum : UINT {
98
+ DMLERR_NO_ERROR = 0,
99
+ DMLERR_FIRST = 0x4000,
100
+ DMLERR_ADVACKTIMEOUT = DMLERR_FIRST,
101
+ DMLERR_BUSY,
102
+ DMLERR_DATAACKTIMEOUT,
103
+ DMLERR_DLL_NOT_INITIALIZED,
104
+ DMLERR_DLL_USAGE,
105
+ DMLERR_EXECACKTIMEOUT,
106
+ DMLERR_INVALIDPARAMETER,
107
+ DMLERR_LOW_MEMORY,
108
+ DMLERR_MEMORY_ERROR,
109
+ DMLERR_NOTPROCESSED,
110
+ DMLERR_NO_CONV_ESTABLISHED,
111
+ DMLERR_POKEACKTIMEOUT,
112
+ DMLERR_POSTMSG_FAILED,
113
+ DMLERR_REENTRANCY,
114
+ DMLERR_SERVER_DIED,
115
+ DMLERR_SYS_ERROR,
116
+ DMLERR_UNADVACKTIMEOUT,
117
+ DMLERR_UNFOUND_QUEUE_ID, // = 0x4011
118
+ DMLERR_LAST = DMLERR_UNFOUND_QUEUE_ID
119
+ }
120
+
121
+ /+
122
+ #define DDE_FACK 0x8000
123
+ #define DDE_FBUSY 0x4000
124
+ #define DDE_FDEFERUPD 0x4000
125
+ #define DDE_FACKREQ 0x8000
126
+ #define DDE_FRELEASE 0x2000
127
+ #define DDE_FREQUESTED 0x1000
128
+ #define DDE_FAPPSTATUS 0x00ff
129
+ #define DDE_FNOTPROCESSED 0
130
+ #define DDE_FACKRESERVED (~(DDE_FACK|DDE_FBUSY|DDE_FAPPSTATUS))
131
+ #define DDE_FADVRESERVED (~(DDE_FACKREQ|DDE_FDEFERUPD))
132
+ #define DDE_FDATRESERVED (~(DDE_FACKREQ|DDE_FRELEASE|DDE_FREQUESTED))
133
+ #define DDE_FPOKRESERVED (~DDE_FRELEASE)
134
+ #define MSGF_DDEMGR 0x8001
135
+ #define CBR_BLOCK ((HDDEDATA)0xffffffff)
136
+ +/
137
+
138
+ const DWORD
139
+ APPCLASS_STANDARD = 0,
140
+ APPCLASS_MONITOR = 0x00000001,
141
+ APPCLASS_MASK = 0x0000000F,
142
+ APPCMD_CLIENTONLY = 0x00000010,
143
+ APPCMD_FILTERINITS = 0x00000020,
144
+ APPCMD_MASK = 0x00000FF0,
145
+ CBF_FAIL_SELFCONNECTIONS = 0x00001000,
146
+ CBF_FAIL_CONNECTIONS = 0x00002000,
147
+ CBF_FAIL_ADVISES = 0x00004000,
148
+ CBF_FAIL_EXECUTES = 0x00008000,
149
+ CBF_FAIL_POKES = 0x00010000,
150
+ CBF_FAIL_REQUESTS = 0x00020000,
151
+ CBF_FAIL_ALLSVRXACTIONS = 0x0003f000,
152
+ CBF_SKIP_CONNECT_CONFIRMS = 0x00040000,
153
+ CBF_SKIP_REGISTRATIONS = 0x00080000,
154
+ CBF_SKIP_UNREGISTRATIONS = 0x00100000,
155
+ CBF_SKIP_DISCONNECTS = 0x00200000,
156
+ CBF_SKIP_ALLNOTIFICATIONS = 0x003c0000,
157
+ MF_HSZ_INFO = 0x01000000,
158
+ MF_SENDMSGS = 0x02000000,
159
+ MF_POSTMSGS = 0x04000000,
160
+ MF_CALLBACKS = 0x08000000,
161
+ MF_ERRORS = 0x10000000,
162
+ MF_LINKS = 0x20000000,
163
+ MF_CONV = 0x40000000,
164
+ MF_MASK = 0xFF000000;
165
+
166
+ enum : UINT {
167
+ EC_ENABLEALL = 0,
168
+ EC_ENABLEONE = ST_BLOCKNEXT,
169
+ EC_DISABLE = ST_BLOCKED,
170
+ EC_QUERYWAITING = 2
171
+ }
172
+
173
+ enum : UINT {
174
+ DNS_REGISTER = 1,
175
+ DNS_UNREGISTER = 2,
176
+ DNS_FILTERON = 4,
177
+ DNS_FILTEROFF = 8
178
+ }
179
+
180
+ /+
181
+ #define HDATA_APPOWNED 1
182
+ #define MAX_MONITORS 4
183
+ +/
184
+
185
+ enum : int {
186
+ MH_CREATE = 1,
187
+ MH_KEEP = 2,
188
+ MH_DELETE = 3,
189
+ MH_CLEANUP = 4
190
+ }
191
+
192
+ alias HANDLE HCONVLIST, HCONV, HSZ, HDDEDATA;
193
+
194
+ extern (Windows) alias HDDEDATA
195
+ function(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD) PFNCALLBACK;
196
+
197
+ struct HSZPAIR {
198
+ HSZ hszSvc;
199
+ HSZ hszTopic;
200
+ }
201
+ alias HSZPAIR* PHSZPAIR;
202
+
203
+ struct CONVCONTEXT {
204
+ UINT cb = CONVCONTEXT.sizeof;
205
+ UINT wFlags;
206
+ UINT wCountryID;
207
+ int iCodePage;
208
+ DWORD dwLangID;
209
+ DWORD dwSecurity;
210
+ SECURITY_QUALITY_OF_SERVICE qos;
211
+ }
212
+ alias CONVCONTEXT* PCONVCONTEXT;
213
+
214
+ struct CONVINFO {
215
+ DWORD cb = CONVINFO.sizeof;
216
+ DWORD hUser;
217
+ HCONV hConvPartner;
218
+ HSZ hszSvcPartner;
219
+ HSZ hszServiceReq;
220
+ HSZ hszTopic;
221
+ HSZ hszItem;
222
+ UINT wFmt;
223
+ UINT wType;
224
+ UINT wStatus;
225
+ UINT wConvst;
226
+ UINT wLastError;
227
+ HCONVLIST hConvList;
228
+ CONVCONTEXT ConvCtxt;
229
+ HWND hwnd;
230
+ HWND hwndPartner;
231
+ }
232
+ alias CONVINFO* PCONVINFO;
233
+
234
+ struct DDEML_MSG_HOOK_DATA {
235
+ UINT uiLo;
236
+ UINT uiHi;
237
+ DWORD cbData;
238
+ DWORD[8] Data;
239
+ }
240
+
241
+ struct MONHSZSTRUCT {
242
+ UINT cb = MONHSZSTRUCT.sizeof;
243
+ int fsAction;
244
+ DWORD dwTime;
245
+ HSZ hsz;
246
+ HANDLE hTask;
247
+ TCHAR[1] _str;
248
+
249
+ TCHAR* str() { return _str.ptr; }
250
+ }
251
+ alias MONHSZSTRUCT* PMONHSZSTRUCT;
252
+
253
+ struct MONLINKSTRUCT {
254
+ UINT cb = MONLINKSTRUCT.sizeof;
255
+ DWORD dwTime;
256
+ HANDLE hTask;
257
+ BOOL fEstablished;
258
+ BOOL fNoData;
259
+ HSZ hszSvc;
260
+ HSZ hszTopic;
261
+ HSZ hszItem;
262
+ UINT wFmt;
263
+ BOOL fServer;
264
+ HCONV hConvServer;
265
+ HCONV hConvClient;
266
+ }
267
+ alias MONLINKSTRUCT* PMONLINKSTRUCT;
268
+
269
+ struct MONCONVSTRUCT {
270
+ UINT cb = MONCONVSTRUCT.sizeof;
271
+ BOOL fConnect;
272
+ DWORD dwTime;
273
+ HANDLE hTask;
274
+ HSZ hszSvc;
275
+ HSZ hszTopic;
276
+ HCONV hConvClient;
277
+ HCONV hConvServer;
278
+ }
279
+ alias MONCONVSTRUCT* PMONCONVSTRUCT;
280
+
281
+ struct MONCBSTRUCT {
282
+ UINT cb = MONCBSTRUCT.sizeof;
283
+ DWORD dwTime;
284
+ HANDLE hTask;
285
+ DWORD dwRet;
286
+ UINT wType;
287
+ UINT wFmt;
288
+ HCONV hConv;
289
+ HSZ hsz1;
290
+ HSZ hsz2;
291
+ HDDEDATA hData;
292
+ ULONG_PTR dwData1;
293
+ ULONG_PTR dwData2;
294
+ CONVCONTEXT cc;
295
+ DWORD cbData;
296
+ DWORD[8] Data;
297
+ }
298
+ alias MONCBSTRUCT* PMONCBSTRUCT;
299
+
300
+ struct MONERRSTRUCT {
301
+ UINT cb = MONERRSTRUCT.sizeof;
302
+ UINT wLastError;
303
+ DWORD dwTime;
304
+ HANDLE hTask;
305
+ }
306
+ alias MONERRSTRUCT* PMONERRSTRUCT;
307
+
308
+ struct MONMSGSTRUCT {
309
+ UINT cb = MONMSGSTRUCT.sizeof;
310
+ HWND hwndTo;
311
+ DWORD dwTime;
312
+ HANDLE hTask;
313
+ UINT wMsg;
314
+ WPARAM wParam;
315
+ LPARAM lParam;
316
+ DDEML_MSG_HOOK_DATA dmhd;
317
+ }
318
+ alias MONMSGSTRUCT* PMONMSGSTRUCT;
319
+
320
+ extern (Windows) {
321
+ BOOL DdeAbandonTransaction(DWORD, HCONV, DWORD);
322
+ PBYTE DdeAccessData(HDDEDATA, PDWORD);
323
+ HDDEDATA DdeAddData(HDDEDATA, PBYTE, DWORD, DWORD);
324
+ HDDEDATA DdeClientTransaction(PBYTE, DWORD, HCONV, HSZ, UINT, UINT,
325
+ DWORD, PDWORD);
326
+ int DdeCmpStringHandles(HSZ, HSZ);
327
+ HCONV DdeConnect(DWORD, HSZ, HSZ, PCONVCONTEXT);
328
+ HCONVLIST DdeConnectList(DWORD, HSZ, HSZ, HCONVLIST, PCONVCONTEXT);
329
+ HDDEDATA DdeCreateDataHandle(DWORD, PBYTE, DWORD, DWORD, HSZ, UINT,
330
+ UINT);
331
+ HSZ DdeCreateStringHandleA(DWORD, LPSTR, int);
332
+ HSZ DdeCreateStringHandleW(DWORD, LPWSTR, int);
333
+ BOOL DdeDisconnect(HCONV);
334
+ BOOL DdeDisconnectList(HCONVLIST);
335
+ BOOL DdeEnableCallback(DWORD, HCONV, UINT);
336
+ BOOL DdeFreeDataHandle(HDDEDATA);
337
+ BOOL DdeFreeStringHandle(DWORD, HSZ);
338
+ DWORD DdeGetData(HDDEDATA, PBYTE, DWORD, DWORD);
339
+ UINT DdeGetLastError(DWORD);
340
+ BOOL DdeImpersonateClient(HCONV);
341
+ UINT DdeInitializeA(PDWORD, PFNCALLBACK, DWORD, DWORD);
342
+ UINT DdeInitializeW(PDWORD, PFNCALLBACK, DWORD, DWORD);
343
+ BOOL DdeKeepStringHandle(DWORD, HSZ);
344
+ HDDEDATA DdeNameService(DWORD, HSZ, HSZ, UINT);
345
+ BOOL DdePostAdvise(DWORD, HSZ, HSZ);
346
+ UINT DdeQueryConvInfo(HCONV, DWORD, PCONVINFO);
347
+ HCONV DdeQueryNextServer(HCONVLIST, HCONV);
348
+ DWORD DdeQueryStringA(DWORD, HSZ, LPSTR, DWORD, int);
349
+ DWORD DdeQueryStringW(DWORD, HSZ, LPWSTR, DWORD, int);
350
+ HCONV DdeReconnect(HCONV);
351
+ BOOL DdeSetUserHandle(HCONV, DWORD, DWORD);
352
+ BOOL DdeUnaccessData(HDDEDATA);
353
+ BOOL DdeUninitialize(DWORD);
354
+ }
355
+
356
+ const TCHAR[]
357
+ SZDDESYS_TOPIC = "System",
358
+ SZDDESYS_ITEM_TOPICS = "Topics",
359
+ SZDDESYS_ITEM_SYSITEMS = "SysItems",
360
+ SZDDESYS_ITEM_RTNMSG = "ReturnMessage",
361
+ SZDDESYS_ITEM_STATUS = "Status",
362
+ SZDDESYS_ITEM_FORMATS = "Formats",
363
+ SZDDESYS_ITEM_HELP = "Help",
364
+ SZDDE_ITEM_ITEMLIST = "TopicItemList";
365
+
366
+ version (Unicode) {
367
+ alias DdeCreateStringHandleW DdeCreateStringHandle;
368
+ alias DdeInitializeW DdeInitialize;
369
+ alias DdeQueryStringW DdeQueryString;
370
+ } else {
371
+ alias DdeCreateStringHandleA DdeCreateStringHandle;
372
+ alias DdeInitializeA DdeInitialize;
373
+ alias DdeQueryStringA DdeQueryString;
374
+ }
data/doc/types.txt ADDED
@@ -0,0 +1,159 @@
1
+ == Parameters ( win32-api )
2
+ Long: 'L'
3
+ Integer: 'I'
4
+ Pointer: 'P'
5
+ Void: 'V'
6
+ String: 'S'
7
+ Callback: 'K' # win32-api only
8
+
9
+ == Windows Data Types
10
+ BOOL => 'I' (or 'B', win32-api only)
11
+ DWORD => 'L'
12
+ HANDLE => 'L'
13
+ LPDWORD => 'P' (or 'L')
14
+ LPTSTR => 'P'
15
+ LPCTSTR => 'S'
16
+ UINT => 'L'
17
+ VOID => 'V'
18
+ WORD => 'I'
19
+ LPVOID => 'L' (or 'P')
20
+ CALLBACK => 'K'
21
+
22
+ == C Data Types
23
+ void => 'V'
24
+ void* => 'P'
25
+ char* => 'P'
26
+ const char* => 'L'
27
+ int => 'I'
28
+ long => 'L'
29
+ struct => 'P'
30
+ struct* => 'P'
31
+
32
+ == Notes
33
+ In practice most LPVOID types should be designated as 'L' because this
34
+ usually means the function is looking for an address. Check the documentation
35
+ for details.
36
+
37
+ If using the windows-api library, you can use 'B' instead of 'I' for the return
38
+ type for functions that return a BOOL.
39
+
40
+ ===== Definitions from windows-api (api.rb)
41
+ # Verbose data types that can be used instead of single letters
42
+ DATA_TYPES = {
43
+ 'ATOM' => 'I',
44
+ 'BOOL' => 'B',
45
+ 'BOOLEAN' => 'B',
46
+ 'BYTE' => 'I',
47
+ 'CALLBACK' => 'K',
48
+ 'CHAR' => 'I',
49
+ 'COLORREF' => 'L',
50
+ 'DWORD' => 'L',
51
+ 'DWORDLONG' => 'L',
52
+ 'DWORD_PTR' => 'P',
53
+ 'DWORD32' => 'I',
54
+ 'DWORD64' => 'L',
55
+ 'HACCEL' => 'L',
56
+ 'HANDLE' => 'L',
57
+ 'HBITMAP' => 'L',
58
+ 'HBRUSH' => 'L',
59
+ 'HCOLORSPACE' => 'L',
60
+ 'HCONV' => 'L',
61
+ 'HDC' => 'L',
62
+ 'HFILE' => 'I',
63
+ 'HKEY' => 'L',
64
+ 'HFONT' => 'L',
65
+ 'HINSTANCE' => 'L',
66
+ 'HKEY' => 'L',
67
+ 'HLOCAL' => 'L',
68
+ 'HMENU' => 'L',
69
+ 'HMODULE' => 'L',
70
+ 'HRESULT' => 'L',
71
+ 'HWND' => 'L',
72
+ 'INT' => 'I',
73
+ 'INT_PTR' => 'P',
74
+ 'INT32' => 'I',
75
+ 'INT64' => 'L',
76
+ 'LANGID' => 'I',
77
+ 'LCID' => 'L',
78
+ 'LCTYPE' => 'L',
79
+ 'LONG' => 'L',
80
+ 'LONGLONG' => 'L',
81
+ 'LONG_PTR' => 'P',
82
+ 'LONG32' => 'L',
83
+ 'LONG64' => 'L',
84
+ 'LPARAM' => 'P',
85
+ 'LPBOOL' => 'P',
86
+ 'LPBYTE' => 'P',
87
+ 'LPCOLORREF' => 'P',
88
+ 'LPCSTR' => 'P',
89
+ 'LPCTSTR' => 'P',
90
+ 'LPCVOID' => 'L',
91
+ 'LPCWSTR' => 'P',
92
+ 'LPDWORD' => 'P',
93
+ 'LPHANDLE' => 'P',
94
+ 'LPINT' => 'P',
95
+ 'LPLONG' => 'P',
96
+ 'LPSTR' => 'P',
97
+ 'LPTSTR' => 'P',
98
+ 'LPVOID' => 'L',
99
+ 'LPWORD' => 'P',
100
+ 'LPWSTR' => 'P',
101
+ 'LRESULT' => 'P',
102
+ 'PBOOL' => 'P',
103
+ 'PBOOLEAN' => 'P',
104
+ 'PBYTE' => 'P',
105
+ 'PHKEY' => 'P',
106
+ 'SC_HANDLE' => 'L',
107
+ 'SC_LOCK' => 'L',
108
+ 'SERVICE_STATUS_HANDLE' => 'L',
109
+ 'SHORT' => 'I',
110
+ 'SIZE_T' => 'P',
111
+ 'TCHAR' => 'L',
112
+ 'UINT' => 'I',
113
+ 'UINT_PTR' => 'P',
114
+ 'UINT32' => 'I',
115
+ 'UINT64' => 'L',
116
+ 'ULONG' => 'L',
117
+ 'ULONGLONG' => 'L',
118
+ 'ULONG_PTR' => 'P',
119
+ 'ULONG32' => 'L',
120
+ 'ULONG64' => 'L',
121
+ 'USHORT' => 'I',
122
+ 'USN' => 'L',
123
+ 'WINAPI' => 'L',
124
+ 'WORD' => 'I'
125
+ }
126
+
127
+ Win::Library shortcuts (Mostly in line with Array#pack)
128
+ TYPES = {
129
+ V: :void, # For functions that return nothing (return type void).
130
+ v: :void, # For functions that return nothing (return type void).
131
+ C: :uchar, #– 8-bit unsigned character (byte)
132
+ c: :char, # 8-bit character (byte)
133
+ # :int8 – 8-bit signed integer
134
+ # :uint8 – 8-bit unsigned integer
135
+ S: :ushort, # – 16-bit unsigned integer (Win32API: used for string)
136
+ s: :short, # – 16-bit signed integer
137
+ # :uint16 – 16-bit unsigned integer
138
+ # :int16 – 16-bit signed integer
139
+ I: :uint, # 32-bit unsigned integer
140
+ i: :int, # 32-bit signed integer
141
+ # :uint32 – 32-bit unsigned integer
142
+ # :int32 – 32-bit signed integer
143
+ L: :ulong, # unsigned long int – platform-specific size
144
+ l: :long, # long int – platform-specific size (http://groups.google.com/group/ruby-ffi/browse_thread/thread/4762fc77130339b1)
145
+ # :int64 – 64-bit signed integer
146
+ # :uint64 – 64-bit unsigned integer
147
+ # :long_long – 64-bit signed integer
148
+ # :ulong_long – 64-bit unsigned integer
149
+ F: :float, # 32-bit floating point
150
+ D: :double, # 64-bit floating point (double-precision)
151
+ P: :pointer, # pointer – platform-specific size
152
+ p: :string, # C-style (NULL-terminated) character string (Win32API: S)
153
+ B: :bool # (?? 1 byte in C++)
154
+ #For function argument type only:
155
+ # :buffer_in – Similar to :pointer, but optimized for Buffers that the function can only read (not write).
156
+ # :buffer_out – Similar to :pointer, but optimized for Buffers that the function can only write (not read).
157
+ # :buffer_inout – Similar to :pointer, but may be optimized for Buffers.
158
+ # :varargs – Variable arguments
159
+ }
Binary file
Binary file
@@ -0,0 +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
File without changes
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'dde'
3
+
4
+ require 'spec/expectations'
data/lib/dde/app.rb ADDED
@@ -0,0 +1,85 @@
1
+ module DDE
2
+
3
+ module Errors # :nodoc:
4
+ def self.[](error_code)
5
+ Win::DDE::ERRORS[error_code]
6
+ end
7
+
8
+ class InitError < RuntimeError # :nodoc:
9
+ end
10
+ class FormatError < RuntimeError # :nodoc:
11
+ end
12
+ class StringError < RuntimeError # :nodoc:
13
+ end
14
+ class ServiceError < RuntimeError # :nodoc:
15
+ end
16
+ class ClientError < RuntimeError # :nodoc:
17
+ end
18
+ end
19
+
20
+ # Class encapsulates DDE application. DDE::App serves as a base for more specific types,
21
+ # such as DDE::Server or DDE:: Client.
22
+ class App
23
+ include Win::DDE
24
+
25
+ attr_reader :id, :init_flags
26
+
27
+ # Creates new DDE application and starts DDE instance
28
+ # if dde_callback block is attached
29
+ def initialize( init_flags=nil, &dde_callback )
30
+ @init_flags = init_flags
31
+
32
+ start_dde init_flags, &dde_callback if dde_callback
33
+
34
+ # todo: Destructor to ensure Dde instance is uninitialized and string handles freed (is it even working?)
35
+ #ObjectSpace.define_finalizer self, ->(id) { stop_dde }
36
+ end
37
+
38
+ # (Re)Initialize application with DDEML library, providing attached dde callback
39
+ # either preserved @init_flags or init_flags argument are used
40
+ def start_dde( init_flags=nil, &dde_callback )
41
+ @init_flags = init_flags || @init_flags || APPCLASS_STANDARD
42
+
43
+ try "Starting DDE" do
44
+ @id, status = dde_initialize @id, @init_flags, &dde_callback
45
+ error(status) unless @id && status == DMLERR_NO_ERROR
46
+ end
47
+ end
48
+
49
+ # (Re)Initialize application with DDEML library, providing attached dde callback
50
+ def stop_dde
51
+ try "Stopping DDE" do
52
+ error unless @id && dde_uninitialize(@id) # Uninitialize app with DDEML library
53
+ @id = nil # Clear instance id if uninitialization successful
54
+ end
55
+ end
56
+
57
+ # Expects a block, yields to it inside a rescue block, raises given error_type with extended fail message.
58
+ # Returns self in case of success (to enable method chaining).
59
+ def try( action, error_type=DDE::Errors::InitError )
60
+ begin
61
+ yield
62
+ rescue => e
63
+ raise error_type, action + " failed with: #{e}"
64
+ end
65
+ self
66
+ end
67
+
68
+ # Raises Runtime error with message based on given message (DdeGetLastError message if no message given)
69
+ def error( message = nil )
70
+ raise case message
71
+ when Integer
72
+ DDE::Errors[message]
73
+ when nil
74
+ DDE::Errors[dde_get_last_error(@id)]
75
+ else
76
+ message
77
+ end
78
+ end
79
+
80
+ def dde_active?
81
+ !!@id
82
+ end
83
+
84
+ end
85
+ end
data/lib/dde/client.rb ADDED
@@ -0,0 +1,53 @@
1
+ module DDE
2
+
3
+ # Class encapsulates DDE Client that requests connection with DDE server and exchanges data with it via DDE
4
+ class Client < App
5
+
6
+ attr_reader :conversation, # active DDE conversation that client is engaged in
7
+ :service, #service that the client is connected to
8
+ :topic, # active DDE conversation topic
9
+ :item # active DDE conversation item
10
+
11
+ # # Creates new DDE client instance
12
+ # def initialize(init_flags = nil, &dde_callback )
13
+ # super init_flags, &dde_callback
14
+ # end
15
+
16
+ # establish a conversation with a server application that supports the specified service
17
+ # name and topic name pair.
18
+ def start_conversation( service=nil, topic=nil )
19
+ try "Starting conversation #{service} #{topic}", DDE::Errors::ClientError do
20
+ error "DDE is not initialized" unless dde_active?
21
+ error "Another conversation already established" if conversation_active?
22
+
23
+ # Create DDE strings for service and topic unless they are omitted
24
+ @service = DDE::DdeString.new(@id, service) if service
25
+ @topic = DDE::DdeString.new(@id, topic) if topic
26
+
27
+ # Initiate new DDE conversation, returns conversation handle or nil
28
+ error unless @conversation = dde_connect(@id, @service.handle, @topic.handle)
29
+ end
30
+ end
31
+
32
+ def stop_conversation
33
+ try "Stopping conversation", DDE::Errors::ClientError do
34
+ error "DDE not started" unless dde_active?
35
+ error "Conversation not started" unless conversation_active?
36
+
37
+ error unless dde_disconnect(@conversation) && # Stop DDE conversation
38
+ dde_free_string_handle(@id, @service.handle) && # Free string handles for service name
39
+ dde_free_string_handle(@id, @topic.handle) # Free string handles for topic name
40
+
41
+ # Unset attributes for conversation, service and topic
42
+ @conversation = nil
43
+ @service = nil
44
+ @topic = nil
45
+ end
46
+ end
47
+
48
+ def conversation_active?
49
+ !!@conversation
50
+ end
51
+
52
+ end
53
+ end