blob: be8c993a7178a1b5a335cfed8bf632191c36aa71 [file] [log] [blame]
Douglas Ridgway692389d1998-11-22 16:56:44 +00001This document should help new developers get started. Like all of Wine, it
2is a work in progress.
Alexandre Julliarddba420a1994-02-02 06:48:31 +00003
Klaas van Gend0a7aa161999-06-05 11:52:46 +00004
Alexandre Julliard889f7421997-04-15 17:19:52 +00005SOURCE TREE STRUCTURE
6=====================
7
Douglas Ridgway692389d1998-11-22 16:56:44 +00008The Wine source tree is loosely based on the original Windows modules.
9Most of the source is concerned with implementing the Wine API, although
10there are also various tools, documentation, sample Winelib code, and
11code specific to the binary loader.
Alexandre Julliard889f7421997-04-15 17:19:52 +000012
Alexandre Julliardc513a302002-09-18 23:11:19 +000013DLLs:
14-----
15 dlls/ - All the DLLs implemented by Wine
Alexandre Julliard889f7421997-04-15 17:19:52 +000016
Klaas van Gend0a7aa161999-06-05 11:52:46 +000017 advapi32/ - crypto, systeminfo, security, eventlogging
Sylvain Petreolle20281102002-05-06 20:08:43 +000018 avicap32/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000019 avifil32/ - COM object to play AVI files
20 comctl32/ - common controls
21 commdlg/ - common dialog boxes (both 16 & 32 bit)
Jon Griffiths1db20bf2001-01-10 23:59:25 +000022 crtdll/ - Old C runtime library
Sylvain Petreolle20281102002-05-06 20:08:43 +000023 crypt32/
24 dciman32/
25 ddraw/ - DirectX ddraw
26 dinput/ - DirectX dinput
27 dplay/ - DirectX dplay
Eric Pouech19dc2081999-10-31 22:15:58 +000028 dplayx/ - DirectX dplayx
29 dsound/ - DirectX dsound
Alexandre Julliardc513a302002-09-18 23:11:19 +000030 gdi/ - GDI (graphics calls)
31 enhmetafiledrv/ - enhanced metafile driver
32 metafiledrv/ - metafile driver
33 win16drv/ - support for Win16 printer drivers
Sylvain Petreolle20281102002-05-06 20:08:43 +000034 glu32/
35 icmp/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000036 imagehlp/ - PE (Portable Executable) Image Helper lib
Eric Pouech19dc2081999-10-31 22:15:58 +000037 imm32/
Alexandre Julliardc513a302002-09-18 23:11:19 +000038 kernel/ - The Windows kernel
Eric Pouech19dc2081999-10-31 22:15:58 +000039 lzexpand/ - Liv-Zempel compression/decompression
40 mpr/ - Multi-Protocol Router (interface to various
41 network transport protocols)
42 msacm/ - audio compression manager (multimedia) (16 bit)
43 msacm32/ - audio compression manager (multimedia) (32 bit)
Sylvain Petreolle20281102002-05-06 20:08:43 +000044 msdmo/
45 msimg32/
46 msisys/
Eric Pouech19dc2081999-10-31 22:15:58 +000047 msnet/
Sylvain Petreolle20281102002-05-06 20:08:43 +000048 msrle32
49 msvcrt/ - 16 bit C runtime library
50 msvcrt20/ - 32 bit C runtime library
Eric Pouech19dc2081999-10-31 22:15:58 +000051 msvideo/ - 16 bit video manager
Sylvain Petreolle20281102002-05-06 20:08:43 +000052 netapi32/
53 ntdll/ - NT implementation of kernel calls
54 odbc32/
Andreas Mohr7bed6962001-09-19 22:34:38 +000055 ole32/ - 32 bit OLE 2.0 libraries
Eric Pouech19dc2081999-10-31 22:15:58 +000056 oleaut32/ - 32 bit OLE 2.0 automation
57 olecli/ - 16 bit OLE client
58 oledlg/ - OLE 2.0 user interface support
Sylvain Petreolle20281102002-05-06 20:08:43 +000059 olepro32/ - 32 bit OLE 2.0 automation
Eric Pouech19dc2081999-10-31 22:15:58 +000060 olesvr/ - 16 bit OLE server
Sylvain Petreolle20281102002-05-06 20:08:43 +000061 opengl32/ - OpenGL implementation
Klaas van Gend0a7aa161999-06-05 11:52:46 +000062 psapi/ - process status API
Sylvain Petreolle20281102002-05-06 20:08:43 +000063 qcap/
64 quartz/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000065 rasapi32/ - remote access server API
Sylvain Petreolle20281102002-05-06 20:08:43 +000066 richedit/
67 rpcrt4/
68 serialui/
69 setupapi/
70 shdocvw/
71 shfolder/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000072 shell32/ - COM object implementing shell views
Sylvain Petreolle20281102002-05-06 20:08:43 +000073 shlwapi/
74 sti/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000075 tapi32/ - telephone API
Alexandre Julliardc513a302002-09-18 23:11:19 +000076 ttydrv/ - TTY display driver (Wine specific)
Sylvain Petreolle20281102002-05-06 20:08:43 +000077 url
78 urlmon
Alexandre Julliardc513a302002-09-18 23:11:19 +000079 user/ - Window management, standard controls, etc.
Klaas van Gend0a7aa161999-06-05 11:52:46 +000080 ver/ - File Installation Library (16 bit)
81 version/ - File Installation Library (32 bit)
Sylvain Petreolle20281102002-05-06 20:08:43 +000082 win32s/
83 win87em/ - 80387 math-emulation
Eric Pouech19dc2081999-10-31 22:15:58 +000084 winaspi/ - 16 bit Advanced SCSI Peripheral Interface
Sylvain Petreolle20281102002-05-06 20:08:43 +000085 winedos/ - DOS features and BIOS calls (interrupts)
Alexandre Julliardc513a302002-09-18 23:11:19 +000086 wineps/ - Postscript driver (Wine specific)
Eric Pouech19dc2081999-10-31 22:15:58 +000087 winmm/ - multimedia (16 & 32 bit)
88 mciXXX/ - various MCI drivers
Sylvain Petreolle20281102002-05-06 20:08:43 +000089 midimap/- midi mapper
90 wavemap/- audio mapper
Chris Morgan9b0ba7c2002-03-21 01:38:19 +000091 winearts/ - ARTS audio driver
Eric Pouech19dc2081999-10-31 22:15:58 +000092 wineoss/- MM driver for OSS systems
Sylvain Petreolle20281102002-05-06 20:08:43 +000093 winnls/ - National Language Support
94 winsock/
95 wsock32/
96 winspool/ - Printing & Print Spooler
97 wintrust/
Eric Pouech19dc2081999-10-31 22:15:58 +000098 wnaspi32/ - 32 bit ASPI
Alexandre Julliardc513a302002-09-18 23:11:19 +000099 x11drv/ - X11 display driver (Wine specific)
Douglas Ridgway692389d1998-11-22 16:56:44 +0000100
Alexandre Julliardc513a302002-09-18 23:11:19 +0000101Winelib programs:
102-----------------
Alexandre Julliard889f7421997-04-15 17:19:52 +0000103
Alexandre Julliardc513a302002-09-18 23:11:19 +0000104 programs/ - All the Winelib programs
105 avitools/
106 clock/
107 cmdlgtst/
108 control/
109 expand/
110 notepad/
111 osversioncheck/
112 progman/
113 regapi/
114 regedit/
115 regsvr32/
116 regtest/
117 uninstaller/
118 view/
119 wcmd/
120 wineconsole/
121 winedbg/
122 winefile/
123 winemine/
124 winepath/
125 winetest/
126 winhelp/
127 winver/
Alexandre Julliard889f7421997-04-15 17:19:52 +0000128
Alexandre Julliard889f7421997-04-15 17:19:52 +0000129
Alexandre Julliardc513a302002-09-18 23:11:19 +0000130Support programs, libraries, etc:
131---------------------------------
132
133 documentation/ - some documentation
134 include/ - Windows standard includes
135 library/ - the Wine portability library
136 miscemu/ - the main Wine program
137 ole/ - global UUIDs static library
138 server/ - the Wine server
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000139 tools/ - relay code builder, new rc, bugreport
140 generator, wineconfigurator, etc.
Alexandre Julliardc513a302002-09-18 23:11:19 +0000141 unicode/ - Unicode support shared
Alexandre Julliard889f7421997-04-15 17:19:52 +0000142
143
Alexandre Julliardc513a302002-09-18 23:11:19 +0000144Miscellaneous:
145--------------
Alexandre Julliard889f7421997-04-15 17:19:52 +0000146
Alexandre Julliardc513a302002-09-18 23:11:19 +0000147Note: these directories will ultimately get moved into their
148respective dlls.
149
150 files/ - KERNEL file I/O
151 if1632/ - KERNEL relay code
152 loader/ - KERNEL loader code
153 memory/ - KERNEL memory management
154 misc/ - KERNEL shell, registry, winsock, etc.
155 msdos/ - KERNEL DOS support
156 relay32/ - KERNEL 32-bit relay code
157 scheduler/ - KERNEL process and thread management
158 win32/ - KERNEL misc Win32 functions
159
160 graphics/ - GDI graphics drivers
161 objects/ - GDI logical objects
162
163 controls/ - USER built-in widgets
164 windows/ - USER window management
165
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000166 tsx11/ - thread-safe X11 wrappers (auto generated)
Alexandre Julliard889f7421997-04-15 17:19:52 +0000167
Alexandre Julliard889f7421997-04-15 17:19:52 +0000168
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000169
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000170IMPLEMENTING NEW API CALLS
171==========================
172
Alexandre Julliardc513a302002-09-18 23:11:19 +0000173This is the simple version, and covers only Win32. Win16 is slightly
174uglier, because of the Pascal heritage and the segmented memory model.
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000175
Alexandre Julliardc513a302002-09-18 23:11:19 +0000176All of the Win32 APIs known to Wine are listed in the .spec file of
177their corresponding dll. An unimplemented call will look like (from
178gdi32.spec)
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000179 269 stub PolyBezierTo
180To implement this call, you need to do the following four things.
181
1821. Find the appropriate parameters for the call, and add a prototype to
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000183the correct header file. In this case, that means [include/wingdi.h],
184and it might look like
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000185 BOOL WINAPI PolyBezierTo(HDC, LPCVOID, DWORD);
186If the function has both an ASCII and a Unicode version, you need to
187define both and add a #define WINELIB_NAME_AW declaration. See below
188for discussion of function naming conventions.
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000189
1902. Modify the .spec file to tell Wine that the function has an
191implementation, what the parameters look like and what Wine function
192to use for the implementation. In Win32, things are simple--everything
193is 32-bits. However, the relay code handles pointers and pointers to
194strings slightly differently, so you should use 'str' and 'wstr' for
195strings, 'ptr' for other pointer types, and 'long' for everything else.
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000196 269 stdcall PolyBezierTo(long ptr long) PolyBezierTo
197The 'PolyBezierTo' at the end of the line is which Wine function to use
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000198for the implementation.
199
2003. Implement the function as a stub. Once you add the function to the .spec
201file, you must add the function to the Wine source before it will link.
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000202Add a function called 'PolyBezierTo' somewhere. Good things to put
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000203into a stub:
204 o a correct prototype, including the WINAPI
205 o header comments, including full documentation for the function and
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000206 arguments (see documentation/README.documentation)
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000207 o A FIXME message and an appropriate return value are good things to
208 put in a stub.
209
210 /************************************************************
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000211 * PolyBezierTo (GDI32.269)
212 *
213 * Draw many Bezier curves
214 *
215 * RETURNS
216 * nonzero on success or zero on faillure
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000217 *
218 * BUGS
219 * Unimplemented
220 */
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000221 BOOL WINAPI PolyBezierTo(HDC hdc, /* handle to device context */
222 LPCVOID p, /* ptr to array of Point structs */
223 DWORD count /* nr of points in array */
224 )
225 {
226 /* tell the user they've got a substandard implementation */
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000227 FIXME(gdi, ":(%x,%p,%d): stub\n", hdc, p, count);
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000228
229 /* some programs may be able to compensate,
230 * if they know what happened
231 */
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000232 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
233 return FALSE; /* error value */
234 }
235
Klaas van Gend0a7aa161999-06-05 11:52:46 +00002364. Implement and test the rest of the function.
237
Alexandre Julliard889f7421997-04-15 17:19:52 +0000238
Eric Pouech19dc2081999-10-31 22:15:58 +0000239IMPLEMENTING A NEW DLL
240======================
241
Eric Pouech31b41cf1999-12-05 02:16:24 +0000242Generic directions
243------------------
244
Eric Pouech19dc2081999-10-31 22:15:58 +0000245Apart from writing the set of needed .c files, you also need to do the
246following:
247
2481. Create a directory <MyDll> where to store the implementation of
Alexandre Julliardc513a302002-09-18 23:11:19 +0000249 the DLL. This directory has to be put under the dlls/ directory.
250 If the DLL exists under Windows as both 16 and 32 bit DLL, you
251 should have a single directory with both implementations.
Eric Pouech19dc2081999-10-31 22:15:58 +0000252
2532. Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can
254 copy an existing Makefile.in from another ./dlls/ subdirectory.
Alexandre Julliardc513a302002-09-18 23:11:19 +0000255 You need at least to change the MODULE and C_SRCS macros.
Eric Pouech19dc2081999-10-31 22:15:58 +0000256
Alexandre Julliardc513a302002-09-18 23:11:19 +00002573. Add the directory in ./configure.ac (in AC_OUTPUT macro at the end
258 of the file to trigger the Makefile generation)
Eric Pouech19dc2081999-10-31 22:15:58 +0000259
Alexandre Julliardc513a302002-09-18 23:11:19 +00002604. Run ./make_dlls in the dlls directory to update Makefile.in in
261 that directory.
Eric Pouech19dc2081999-10-31 22:15:58 +0000262
Alexandre Julliardc513a302002-09-18 23:11:19 +00002635. You can now regenerate ./configure file (with 'make configure')
Eric Pouech19dc2081999-10-31 22:15:58 +0000264 and the various Makefiles (with 'configure; make depend') (run
265 from the top of Wine's tree).
Alexandre Julliardc513a302002-09-18 23:11:19 +0000266 You should now have a Makefile file in ./dlls/<MyDll>/
Eric Pouech19dc2081999-10-31 22:15:58 +0000267
Alexandre Julliardc513a302002-09-18 23:11:19 +00002686. Create the .spec file for the DLL exported functions in your
Eric Pouech19dc2081999-10-31 22:15:58 +0000269 directory. Refer to 'Implementation of new API calls' earlier in
270 this document for more information on this part.
271
Alexandre Julliardc513a302002-09-18 23:11:19 +00002727. You can now start adding .c files. For the .h files, if they are
273 standard Windows one, put them in include/. If they are linked to
274 *your* implementation of the dll, put them in your newly created
275 directory.
Eric Pouech19dc2081999-10-31 22:15:58 +0000276
Eric Pouech31b41cf1999-12-05 02:16:24 +0000277Debug channels
278--------------
279
Eric Pouech19dc2081999-10-31 22:15:58 +0000280If you need to create a new debug channel, just add the
Dimitrie O. Paund95ce8c2002-09-18 18:29:59 +0000281WINE_DEFAULT_DEBUG_CHANNEL to your .c file(s), and use them.
282All the housekeeping will happen automatically.
Eric Pouech19dc2081999-10-31 22:15:58 +0000283
Eric Pouech31b41cf1999-12-05 02:16:24 +0000284Resources
285---------
286
287If you also need to add resources to your DLL, the create the .rc
Alexandre Julliardc513a302002-09-18 23:11:19 +0000288file. Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro,
289the list of .rc files to add to the DLL. See dlls/comctl32/ for an
290example of this.
Eric Pouech31b41cf1999-12-05 02:16:24 +0000291
292Thunking
293--------
294
295If you're building a 16 & 32 bit DLLs pair, then from the 32 bit code
296you might need to call 16 bit routine. The way to do it to add in the
297code, fragments like:
298/* ### Start build ### */
299extern WORD CALLBACK <PREFIX>_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
300/* ### stop build ### */
301Where <PREFIX>_ is an internal prefix for your module. The first
302parameter is always of type FARPROC16. Then, you can get the regular
303list of parameters. The _word_wwlll indicates the type of return (long
304or word) and the size of the parameters (here l=>long, w=>word; which
305maps to WORD,WORD,LONG,LONG,LONG.
306You can put several functions between the Start/Stop build pair.
307
Alexandre Julliardc513a302002-09-18 23:11:19 +0000308You can also read the winebuild manpage for more details on this.
Eric Pouech31b41cf1999-12-05 02:16:24 +0000309
Alexandre Julliardc513a302002-09-18 23:11:19 +0000310Then, add to ./dlls/<MyDll>/Makefile.in a line like:
311
312EXTRA_OBJS = $(MODULE).glue.o
Eric Pouech31b41cf1999-12-05 02:16:24 +0000313
314See dlls/winmm/ for an example of this.
315
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000316MEMORY AND SEGMENTS
317===================
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000318
319NE (Win16) executables consist of multiple segments. The Wine loader
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000320loads each segment into a unique location in the Wine processes memory
321and assigns a selector to that segment. Because of this, it's not
322possible to exchange addresses freely between 16-bit and 32-bit code.
323Addresses used by 16-bit code are segmented addresses (16:16), formed
324by a 16-bit selector and a 16-bit offset. Those used by the Wine code
325are regular 32-bit linear addresses.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000326
Alexandre Julliard1e37a181996-08-18 16:21:52 +0000327There are four ways to obtain a segmented pointer:
Alexandre Julliardc513a302002-09-18 23:11:19 +0000328 - Using the MapLS function (recommended).
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000329 - Allocate a block of memory from the global heap and use
330 WIN16_GlobalLock to get its segmented address.
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000331 - Declare the argument as 'segptr' instead of 'ptr' in the spec file
332 for a given API function.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000333
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000334Once you have a segmented pointer, it must be converted to a linear
335pointer before you can use it from 32-bit code. This can be done with
Alexandre Julliardc513a302002-09-18 23:11:19 +0000336the MapSL function. The linear pointer can then be used freely with
337standard Unix functions like memcpy() etc. without worrying about 64k
338boundaries. Note: there's no easy way to convert back from a linear
339to a segmented address.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000340
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000341In most cases, you don't need to worry about segmented address, as the
342conversion is made automatically by the callback code and the API
343functions only see linear addresses. However, in some cases it is
344necessary to manipulate segmented addresses; the most frequent cases
345are:
346 - API functions that return a pointer
347 - lParam of Windows messages that point to a structure
348 - Pointers contained inside structures accessed by 16-bit code.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000349
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000350It is usually a good practice to used the type 'SEGPTR' for segmented
351pointers, instead of something like 'LPSTR' or 'char *'. As SEGPTR is
352defined as a DWORD, you'll get a compilation warning if you mistakenly
353use it as a regular 32-bit pointer.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000354
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000355
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000356STRUCTURE PACKING
357=================
358
359Under Windows, data structures are tightly packed, i.e. there is no
360padding between structure members. On the other hand, by default gcc
361aligns structure members (e.g. WORDs are on a WORD boundary, etc.).
362This means that a structure like
363
364struct { BYTE x; WORD y; };
365
366will take 3 bytes under Windows, but 4 with gcc, because gcc will add a
367dummy byte between x and y. To have the correct layout for structures
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000368used by Windows code, you need to embed the struct within two special
369#include's which will take care of the packing for you:
370
371#include "pshpack1.h"
Eric Pouech19dc2081999-10-31 22:15:58 +0000372struct { BYTE x; WORD y; };
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000373#include "poppack1.h"
374
375For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.
376
377The use of the WINE_PACKED attribute is obsolete. Please remove these
378in favour of the above solution.
379Using WINE_PACKED, you would declare the above structure like this:
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000380
381struct { BYTE x; WORD y WINE_PACKED; };
382
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000383You had to do this every time a structure member is not aligned
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000384correctly under Windows (i.e. a WORD not on an even address, or a
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000385DWORD on a address that was not a multiple of 4).
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000386
387
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000388NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES
389==============================================
390
391In order to support both Win16 and Win32 APIs within the same source
Douglas Ridgway692389d1998-11-22 16:56:44 +0000392code, the following convention must be used in naming all API
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000393functions and types. If the Windows API uses the name 'xxx', the Wine
394code must use:
395
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000396 - 'xxx16' for the Win16 version,
397 - 'xxx' for the Win32 version when no ASCII/Unicode strings are
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000398 involved,
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000399 - 'xxxA' for the Win32 version with ASCII strings,
400 - 'xxxW' for the Win32 version with Unicode strings.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000401
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000402If the function has both ASCII and Unicode version, you should then
403use the macros WINELIB_NAME_AW(xxx) or DECL_WINELIB_TYPE_AW(xxx)
Jim Aston07684241999-07-18 13:28:59 +0000404(defined in include/windef.h) to define the correct 'xxx' function
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000405or type for Winelib. When compiling Wine itself, 'xxx' is _not_
406defined, meaning that code inside of Wine must always specify
407explicitly the ASCII or Unicode version.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000408
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000409If 'xxx' is the same in Win16 and Win32, you can simply use the same
410name as Windows, i.e. just 'xxx'. If 'xxx' is Win16 only, you could
411use the name as is, but it's preferable to use 'xxx16' to make it
412clear it is a Win16 function.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000413
414Examples:
415
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000416typedef struct { /* Win32 ASCII data structure */ } WNDCLASSA;
417typedef struct { /* Win32 Unicode data structure */ } WNDCLASSW;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000418typedef struct { /* Win16 data structure */ } WNDCLASS16;
419DECL_WINELIB_TYPE_AW(WNDCLASS);
420
421ATOM RegisterClass16( WNDCLASS16 * );
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000422ATOM RegisterClassA( WNDCLASSA * );
423ATOM RegisterClassW( WNDCLASSW * );
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000424#define RegisterClass WINELIB_NAME_AW(RegisterClass)
425
426The Winelib user can then say:
427
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000428 WNDCLASS wc = { ... };
429 RegisterClass( &wc );
430
431and this will use the correct declaration depending on the definition
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000432of the UNICODE symbol.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000433
434
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000435NAMING CONVENTIONS FOR NON-API FUNCTIONS AND TYPES
436==================================================
437
438Functions and data which are internal to your code (or at least shouldn't be
Francois Gougete550ebe2000-12-02 20:17:13 +0000439visible to any Winelib or Windows program) should be preceded by
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000440an identifier to the module:
441
442Examples:
443
444ENUMPRINTERS_GetDWORDFromRegistryA() (in dlls/winspool/info.c)
445IAVIFile_fnRelease() (in dlls/avifil32/avifile.c)
446X11DRV_CreateDC() (in graphics/x11drv/init.c)
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000447
448if you need prototypes for these, there are a few possibilities:
449- within same source file only:
450 put the prototypes at the top of your file and mark them as prototypes.
451- within the same module:
452 create a header file within the subdirectory where that module resides,
453 e.g. graphics/ddraw_private.h
454- from a totally different module, or for use in winelib:
Alexandre Julliardc513a302002-09-18 23:11:19 +0000455 you should never do that. Only exported APIs can be called across
456 module boundaries.
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000457
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000458
459DEBUG MESSAGES
460==============
Alexandre Julliardaca05781994-10-17 18:12:41 +0000461
462To display a message only during debugging, you normally write something
463like this:
464
Dimitrie O. Paund95ce8c2002-09-18 18:29:59 +0000465 TRACE("abc..."); or
466 FIXME("abc..."); or
467 WARN("abc..."); or
468 ERR("abc...");
Alexandre Julliardaca05781994-10-17 18:12:41 +0000469
Alexandre Julliard54c27111998-03-29 19:44:57 +0000470depending on the seriousness of the problem. (documentation/degug-msgs
Dimitrie O. Paund95ce8c2002-09-18 18:29:59 +0000471explains when it is appropriate to use each of them). You need to declare
472the debug channel name at the top of the file (after the includes) using
473the WINE_DEFAULT_DEBUG_CHANNEL macro, like so:
Alexandre Julliardaca05781994-10-17 18:12:41 +0000474
Dimitrie O. Paund95ce8c2002-09-18 18:29:59 +0000475 WINE_DEFAULT_DEBUG_CHANNEL(win);
Alexandre Julliardaca05781994-10-17 18:12:41 +0000476
Dimitrie O. Paund95ce8c2002-09-18 18:29:59 +0000477If your debugging code is more complex than just printf, you can use
478the macros:
479
480 TRACE_ON(xxx), WARN_ON(xxx), ERR_ON(xxx) and FIXME_ON(xxx)
481
482to test if the given channel is enabled. Thus, you can write:
483
484 if (TRACE_ON(win)) DumpSomeStructure(&str);
Alexandre Julliard234bc241994-12-10 13:02:28 +0000485
Alexandre Julliard234bc241994-12-10 13:02:28 +0000486Don't worry about the inefficiency of the test. If it is permanently
Alexandre Julliard54c27111998-03-29 19:44:57 +0000487disabled (that is TRACE_ON(win) is 0 at compile time), the compiler will
Alexandre Julliard234bc241994-12-10 13:02:28 +0000488eliminate the dead code.
Alexandre Julliardaca05781994-10-17 18:12:41 +0000489
Alexandre Julliard54c27111998-03-29 19:44:57 +0000490For more info about debugging messages, read:
491
492documentation/debug-msgs
493
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000494
495MORE INFO
496=========
497
Alexandre Julliard33072e11997-06-29 18:08:02 +00004981. There is a FREE online version of the MSDN library (including
499 documentation for the Win32 API) on http://www.microsoft.com/msdn/
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000500
Alexandre Julliard33072e11997-06-29 18:08:02 +00005012. http://www.sonic.net/~undoc/bookstore.html
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000502
Alexandre Julliard33072e11997-06-29 18:08:02 +00005033. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".
504
5054. You might want to check out BYTE from December 1983 as well :-)