1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC src/core/sys/windows/_ddeml.d)
9  */
10 module core.sys.windows.ddeml;
version(Windows)11 version (Windows):
12 @system:
13 
14 version (ANSI) {} else version = Unicode;
15 pragma(lib, "user32");
16 
17 import core.sys.windows.basetsd, core.sys.windows.windef, core.sys.windows.winnt;
18 
19 enum : int {
20     CP_WINANSI    = 1004,
21     CP_WINUNICODE = 1200
22 }
23 
24 enum : UINT {
25     XTYPF_NOBLOCK = 2,
26     XTYPF_NODATA  = 4,
27     XTYPF_ACKREQ  = 8
28 }
29 
30 enum : UINT {
31     XCLASS_MASK         = 0xFC00,
32     XCLASS_BOOL         = 0x1000,
33     XCLASS_DATA         = 0x2000,
34     XCLASS_FLAGS        = 0x4000,
35     XCLASS_NOTIFICATION = 0x8000
36 }
37 
38 enum : UINT {
39     XST_NULL,
40     XST_INCOMPLETE,
41     XST_CONNECTED,
42     XST_INIT1,
43     XST_INIT2,
44     XST_REQSENT,
45     XST_DATARCVD,
46     XST_POKESENT,
47     XST_POKEACKRCVD,
48     XST_EXECSENT,
49     XST_EXECACKRCVD,
50     XST_ADVSENT,
51     XST_UNADVSENT,
52     XST_ADVACKRCVD,
53     XST_UNADVACKRCVD,
54     XST_ADVDATASENT,
55     XST_ADVDATAACKRCVD // = 16
56 }
57 
58 enum : UINT {
59     XTYP_ERROR           = XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
60     XTYP_ADVDATA         = 0x0010 | XCLASS_FLAGS,
61     XTYP_ADVREQ          = 0x0020 | XCLASS_DATA | XTYPF_NOBLOCK,
62     XTYP_ADVSTART        = 0x0030 | XCLASS_BOOL,
63     XTYP_ADVSTOP         = 0x0040 | XCLASS_NOTIFICATION,
64     XTYP_EXECUTE         = 0x0050 | XCLASS_FLAGS,
65     XTYP_CONNECT         = 0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK,
66     XTYP_CONNECT_CONFIRM = 0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
67     XTYP_XACT_COMPLETE   = 0x0080 | XCLASS_NOTIFICATION,
68     XTYP_POKE            = 0x0090 | XCLASS_FLAGS,
69     XTYP_REGISTER        = 0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
70     XTYP_REQUEST         = 0x00B0 | XCLASS_DATA,
71     XTYP_DISCONNECT      = 0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
72     XTYP_UNREGISTER      = 0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
73     XTYP_WILDCONNECT     = 0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK,
74     XTYP_MONITOR         = 0X00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
75     XTYP_MASK            = 0x00F0,
76     XTYP_SHIFT           = 4
77 }
78 
79 /+
80 #define TIMEOUT_ASYNC  0xFFFFFFFF
81 #define QID_SYNC       0xFFFFFFFF
82 +/
83 
84 enum : UINT {
85     ST_CONNECTED  =   1,
86     ST_ADVISE     =   2,
87     ST_ISLOCAL    =   4,
88     ST_BLOCKED    =   8,
89     ST_CLIENT     =  16,
90     ST_TERMINATED =  32,
91     ST_INLIST     =  64,
92     ST_BLOCKNEXT  = 128,
93     ST_ISSELF     = 256
94 }
95 
96 /+
97 #define CADV_LATEACK 0xFFFF
98 +/
99 
100 enum : UINT {
101     DMLERR_NO_ERROR      = 0,
102     DMLERR_FIRST         = 0x4000,
103     DMLERR_ADVACKTIMEOUT = DMLERR_FIRST,
104     DMLERR_BUSY,
105     DMLERR_DATAACKTIMEOUT,
106     DMLERR_DLL_NOT_INITIALIZED,
107     DMLERR_DLL_USAGE,
108     DMLERR_EXECACKTIMEOUT,
109     DMLERR_INVALIDPARAMETER,
110     DMLERR_LOW_MEMORY,
111     DMLERR_MEMORY_ERROR,
112     DMLERR_NOTPROCESSED,
113     DMLERR_NO_CONV_ESTABLISHED,
114     DMLERR_POKEACKTIMEOUT,
115     DMLERR_POSTMSG_FAILED,
116     DMLERR_REENTRANCY,
117     DMLERR_SERVER_DIED,
118     DMLERR_SYS_ERROR,
119     DMLERR_UNADVACKTIMEOUT,
120     DMLERR_UNFOUND_QUEUE_ID, // = 0x4011
121     DMLERR_LAST          = DMLERR_UNFOUND_QUEUE_ID
122 }
123 
124 /+
125 #define DDE_FACK    0x8000
126 #define DDE_FBUSY   0x4000
127 #define DDE_FDEFERUPD   0x4000
128 #define DDE_FACKREQ 0x8000
129 #define DDE_FRELEASE    0x2000
130 #define DDE_FREQUESTED  0x1000
131 #define DDE_FAPPSTATUS  0x00ff
132 #define DDE_FNOTPROCESSED   0
133 #define DDE_FACKRESERVED    (~(DDE_FACK|DDE_FBUSY|DDE_FAPPSTATUS))
134 #define DDE_FADVRESERVED    (~(DDE_FACKREQ|DDE_FDEFERUPD))
135 #define DDE_FDATRESERVED    (~(DDE_FACKREQ|DDE_FRELEASE|DDE_FREQUESTED))
136 #define DDE_FPOKRESERVED    (~DDE_FRELEASE)
137 #define MSGF_DDEMGR 0x8001
138 #define CBR_BLOCK   ((HDDEDATA)0xffffffff)
139 +/
140 
141 enum DWORD
142     APPCLASS_STANDARD         = 0,
143     APPCLASS_MONITOR          = 0x00000001,
144     APPCLASS_MASK             = 0x0000000F,
145     APPCMD_CLIENTONLY         = 0x00000010,
146     APPCMD_FILTERINITS        = 0x00000020,
147     APPCMD_MASK               = 0x00000FF0,
148     CBF_FAIL_SELFCONNECTIONS  = 0x00001000,
149     CBF_FAIL_CONNECTIONS      = 0x00002000,
150     CBF_FAIL_ADVISES          = 0x00004000,
151     CBF_FAIL_EXECUTES         = 0x00008000,
152     CBF_FAIL_POKES            = 0x00010000,
153     CBF_FAIL_REQUESTS         = 0x00020000,
154     CBF_FAIL_ALLSVRXACTIONS   = 0x0003f000,
155     CBF_SKIP_CONNECT_CONFIRMS = 0x00040000,
156     CBF_SKIP_REGISTRATIONS    = 0x00080000,
157     CBF_SKIP_UNREGISTRATIONS  = 0x00100000,
158     CBF_SKIP_DISCONNECTS      = 0x00200000,
159     CBF_SKIP_ALLNOTIFICATIONS = 0x003c0000,
160     MF_HSZ_INFO               = 0x01000000,
161     MF_SENDMSGS               = 0x02000000,
162     MF_POSTMSGS               = 0x04000000,
163     MF_CALLBACKS              = 0x08000000,
164     MF_ERRORS                 = 0x10000000,
165     MF_LINKS                  = 0x20000000,
166     MF_CONV                   = 0x40000000,
167     MF_MASK                   = 0xFF000000;
168 
169 enum : UINT {
170     EC_ENABLEALL    = 0,
171     EC_ENABLEONE    = ST_BLOCKNEXT,
172     EC_DISABLE      = ST_BLOCKED,
173     EC_QUERYWAITING = 2
174 }
175 
176 enum : UINT {
177     DNS_REGISTER   = 1,
178     DNS_UNREGISTER = 2,
179     DNS_FILTERON   = 4,
180     DNS_FILTEROFF  = 8
181 }
182 
183 /+
184 #define HDATA_APPOWNED  1
185 #define MAX_MONITORS    4
186 +/
187 
188 enum : int {
189     MH_CREATE  = 1,
190     MH_KEEP    = 2,
191     MH_DELETE  = 3,
192     MH_CLEANUP = 4
193 }
194 
195 mixin DECLARE_HANDLE!("HCONVLIST");
196 mixin DECLARE_HANDLE!("HCONV");
197 mixin DECLARE_HANDLE!("HSZ");
198 mixin DECLARE_HANDLE!("HDDEDATA");
199 
200 extern (Windows) alias HDDEDATA
201   function(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, ULONG_PTR, ULONG_PTR) PFNCALLBACK;
202 
203 struct HSZPAIR {
204     HSZ hszSvc;
205     HSZ hszTopic;
206 }
207 alias HSZPAIR* PHSZPAIR;
208 
209 struct CONVCONTEXT {
210     UINT                        cb = CONVCONTEXT.sizeof;
211     UINT                        wFlags;
212     UINT                        wCountryID;
213     int                         iCodePage;
214     DWORD                       dwLangID;
215     DWORD                       dwSecurity;
216     SECURITY_QUALITY_OF_SERVICE qos;
217 }
218 alias CONVCONTEXT* PCONVCONTEXT;
219 
220 struct CONVINFO {
221     DWORD       cb = CONVINFO.sizeof;
222     DWORD_PTR   hUser;
223     HCONV       hConvPartner;
224     HSZ         hszSvcPartner;
225     HSZ         hszServiceReq;
226     HSZ         hszTopic;
227     HSZ         hszItem;
228     UINT        wFmt;
229     UINT        wType;
230     UINT        wStatus;
231     UINT        wConvst;
232     UINT        wLastError;
233     HCONVLIST   hConvList;
234     CONVCONTEXT ConvCtxt;
235     HWND        hwnd;
236     HWND        hwndPartner;
237 }
238 alias CONVINFO* PCONVINFO;
239 
240 struct DDEML_MSG_HOOK_DATA {
241     UINT_PTR uiLo;
242     UINT_PTR uiHi;
243     DWORD    cbData;
244     DWORD[8] Data;
245 }
246 
247 struct MONHSZSTRUCT {
248     UINT     cb = MONHSZSTRUCT.sizeof;
249     int      fsAction;
250     DWORD    dwTime;
251     HSZ      hsz;
252     HANDLE   hTask;
253     TCHAR[1] _str = 0;
254 
255     TCHAR* str() return { return _str.ptr; }
256 }
257 alias MONHSZSTRUCT* PMONHSZSTRUCT;
258 
259 struct MONLINKSTRUCT {
260     UINT   cb = MONLINKSTRUCT.sizeof;
261     DWORD  dwTime;
262     HANDLE hTask;
263     BOOL   fEstablished;
264     BOOL   fNoData;
265     HSZ    hszSvc;
266     HSZ    hszTopic;
267     HSZ    hszItem;
268     UINT   wFmt;
269     BOOL   fServer;
270     HCONV  hConvServer;
271     HCONV  hConvClient;
272 }
273 alias MONLINKSTRUCT* PMONLINKSTRUCT;
274 
275 struct MONCONVSTRUCT {
276     UINT   cb = MONCONVSTRUCT.sizeof;
277     BOOL   fConnect;
278     DWORD  dwTime;
279     HANDLE hTask;
280     HSZ    hszSvc;
281     HSZ    hszTopic;
282     HCONV  hConvClient;
283     HCONV  hConvServer;
284 }
285 alias MONCONVSTRUCT* PMONCONVSTRUCT;
286 
287 struct MONCBSTRUCT {
288     UINT        cb = MONCBSTRUCT.sizeof;
289     DWORD       dwTime;
290     HANDLE      hTask;
291     DWORD       dwRet;
292     UINT        wType;
293     UINT        wFmt;
294     HCONV       hConv;
295     HSZ         hsz1;
296     HSZ         hsz2;
297     HDDEDATA    hData;
298     ULONG_PTR   dwData1;
299     ULONG_PTR   dwData2;
300     CONVCONTEXT cc;
301     DWORD       cbData;
302     DWORD[8]    Data;
303 }
304 alias MONCBSTRUCT* PMONCBSTRUCT;
305 
306 struct MONERRSTRUCT {
307     UINT   cb = MONERRSTRUCT.sizeof;
308     UINT   wLastError;
309     DWORD  dwTime;
310     HANDLE hTask;
311 }
312 alias MONERRSTRUCT* PMONERRSTRUCT;
313 
314 struct MONMSGSTRUCT {
315     UINT   cb = MONMSGSTRUCT.sizeof;
316     HWND   hwndTo;
317     DWORD  dwTime;
318     HANDLE hTask;
319     UINT   wMsg;
320     WPARAM wParam;
321     LPARAM lParam;
322     DDEML_MSG_HOOK_DATA dmhd;
323 }
324 alias MONMSGSTRUCT* PMONMSGSTRUCT;
325 
326 extern (Windows) {
327     BOOL DdeAbandonTransaction(DWORD, HCONV, DWORD);
328     PBYTE DdeAccessData(HDDEDATA, PDWORD);
329     HDDEDATA DdeAddData(HDDEDATA, PBYTE, DWORD, DWORD);
330     HDDEDATA DdeClientTransaction(PBYTE, DWORD, HCONV, HSZ, UINT, UINT,
331       DWORD, PDWORD);
332     int DdeCmpStringHandles(HSZ, HSZ);
333     HCONV DdeConnect(DWORD, HSZ, HSZ, PCONVCONTEXT);
334     HCONVLIST DdeConnectList(DWORD, HSZ, HSZ, HCONVLIST, PCONVCONTEXT);
335     HDDEDATA DdeCreateDataHandle(DWORD, PBYTE, DWORD, DWORD, HSZ, UINT,
336       UINT);
337     HSZ DdeCreateStringHandleA(DWORD, LPSTR, int);
338     HSZ DdeCreateStringHandleW(DWORD, LPWSTR, int);
339     BOOL DdeDisconnect(HCONV);
340     BOOL DdeDisconnectList(HCONVLIST);
341     BOOL DdeEnableCallback(DWORD, HCONV, UINT);
342     BOOL DdeFreeDataHandle(HDDEDATA);
343     BOOL DdeFreeStringHandle(DWORD, HSZ);
344     DWORD DdeGetData(HDDEDATA, PBYTE, DWORD, DWORD);
345     UINT DdeGetLastError(DWORD);
346     BOOL DdeImpersonateClient(HCONV);
347     UINT DdeInitializeA(PDWORD, PFNCALLBACK, DWORD, DWORD);
348     UINT DdeInitializeW(PDWORD, PFNCALLBACK, DWORD, DWORD);
349     BOOL DdeKeepStringHandle(DWORD, HSZ);
350     HDDEDATA DdeNameService(DWORD, HSZ, HSZ, UINT);
351     BOOL DdePostAdvise(DWORD, HSZ, HSZ);
352     UINT DdeQueryConvInfo(HCONV, DWORD, PCONVINFO);
353     HCONV DdeQueryNextServer(HCONVLIST, HCONV);
354     DWORD DdeQueryStringA(DWORD, HSZ, LPSTR, DWORD, int);
355     DWORD DdeQueryStringW(DWORD, HSZ, LPWSTR, DWORD, int);
356     HCONV DdeReconnect(HCONV);
357     BOOL DdeSetUserHandle(HCONV, DWORD, DWORD_PTR);
358     BOOL DdeUnaccessData(HDDEDATA);
359     BOOL DdeUninitialize(DWORD);
360 }
361 
362 const TCHAR[]
363     SZDDESYS_TOPIC         = "System",
364     SZDDESYS_ITEM_TOPICS   = "Topics",
365     SZDDESYS_ITEM_SYSITEMS = "SysItems",
366     SZDDESYS_ITEM_RTNMSG   = "ReturnMessage",
367     SZDDESYS_ITEM_STATUS   = "Status",
368     SZDDESYS_ITEM_FORMATS  = "Formats",
369     SZDDESYS_ITEM_HELP     = "Help",
370     SZDDE_ITEM_ITEMLIST    = "TopicItemList";
371 
372 version (Unicode) {
373     alias DdeCreateStringHandleW DdeCreateStringHandle;
374     alias DdeInitializeW DdeInitialize;
375     alias DdeQueryStringW DdeQueryString;
376 } else {
377     alias DdeCreateStringHandleA DdeCreateStringHandle;
378     alias DdeInitializeA DdeInitialize;
379     alias DdeQueryStringA DdeQueryString;
380 }
381