Added explanation on creating a new DLL.
This commit is contained in:
parent
a72a398ff4
commit
19dc208728
102
DEVELOPERS-HINTS
102
DEVELOPERS-HINTS
|
@ -28,7 +28,7 @@ GDI:
|
||||||
win16drv/ -> see below
|
win16drv/ -> see below
|
||||||
ttydrv/ - tty display driver
|
ttydrv/ - tty display driver
|
||||||
psdrv/ - PostScript graphics driver
|
psdrv/ - PostScript graphics driver
|
||||||
metafiledrv/ - metafile drivr
|
metafiledrv/ - metafile driver
|
||||||
enhmetafiledrv/ - enhanced metafile driver
|
enhmetafiledrv/ - enhanced metafile driver
|
||||||
objects/ - logical objects
|
objects/ - logical objects
|
||||||
|
|
||||||
|
@ -45,24 +45,46 @@ Other DLLs:
|
||||||
avifil32/ - COM object to play AVI files
|
avifil32/ - COM object to play AVI files
|
||||||
comctl32/ - common controls
|
comctl32/ - common controls
|
||||||
commdlg/ - common dialog boxes (both 16 & 32 bit)
|
commdlg/ - common dialog boxes (both 16 & 32 bit)
|
||||||
|
dplayx/ - DirectX dplayx
|
||||||
|
dsound/ - DirectX dsound
|
||||||
imagehlp/ - PE (Portable Executable) Image Helper lib
|
imagehlp/ - PE (Portable Executable) Image Helper lib
|
||||||
msacm/ - audio compression manager (multimedia)
|
imm32/
|
||||||
msacm32/ - audio compression manager (multimedia)
|
lzexpand/ - Liv-Zempel compression/decompression
|
||||||
|
mpr/ - Multi-Protocol Router (interface to various
|
||||||
|
network transport protocols)
|
||||||
|
msacm/ - audio compression manager (multimedia) (16 bit)
|
||||||
|
msacm32/ - audio compression manager (multimedia) (32 bit)
|
||||||
|
msnet/
|
||||||
|
msvideo/ - 16 bit video manager
|
||||||
|
ole32/ - 32 bit OLE 2.0 librairies
|
||||||
|
oleaut32/ - 32 bit OLE 2.0 automation
|
||||||
|
olecli/ - 16 bit OLE client
|
||||||
|
oledlg/ - OLE 2.0 user interface support
|
||||||
|
olesvr/ - 16 bit OLE server
|
||||||
ntdll/ - NT implementation of kernel calls
|
ntdll/ - NT implementation of kernel calls
|
||||||
psapi/ - process status API
|
psapi/ - process status API
|
||||||
rasapi32/ - remote access server API
|
rasapi32/ - remote access server API
|
||||||
shell32/ - COM object implementing shell views
|
shell32/ - COM object implementing shell views
|
||||||
|
sound/ - Sound on loudspeaker (not sound card)
|
||||||
tapi32/ - telephone API
|
tapi32/ - telephone API
|
||||||
ver/ - File Installation Library (16 bit)
|
ver/ - File Installation Library (16 bit)
|
||||||
version/ - File Installation Library (32 bit)
|
version/ - File Installation Library (32 bit)
|
||||||
winaspi/ -
|
win32s
|
||||||
|
win87em - 80387 math-emulation
|
||||||
|
winaspi/ - 16 bit Advanced SCSI Peripheral Interface
|
||||||
|
windebug/ - Windows debugger
|
||||||
|
wing/ - WinG (for games) internface
|
||||||
|
winmm/ - multimedia (16 & 32 bit)
|
||||||
|
mciXXX/ - various MCI drivers
|
||||||
|
wineoss/- MM driver for OSS systems
|
||||||
|
wavemap/- audio mapper
|
||||||
|
midimap/- midi mapper
|
||||||
winspool/ - Printing & Print Spooler
|
winspool/ - Printing & Print Spooler
|
||||||
wnaspi32/ -
|
wnaspi32/ - 32 bit ASPI
|
||||||
|
|
||||||
Miscellaneous:
|
Miscellaneous:
|
||||||
|
|
||||||
misc/ - shell, registry, winsock, etc.
|
misc/ - shell, registry, winsock, etc.
|
||||||
multimedia/ - multimedia driver
|
|
||||||
ipc/ - SysV IPC based interprocess communication
|
ipc/ - SysV IPC based interprocess communication
|
||||||
win32/ - misc Win32 functions
|
win32/ - misc Win32 functions
|
||||||
ole/ - OLE code
|
ole/ - OLE code
|
||||||
|
@ -164,6 +186,72 @@ into a stub:
|
||||||
4. Implement and test the rest of the function.
|
4. Implement and test the rest of the function.
|
||||||
|
|
||||||
|
|
||||||
|
IMPLEMENTING A NEW DLL
|
||||||
|
======================
|
||||||
|
|
||||||
|
Apart from writing the set of needed .c files, you also need to do the
|
||||||
|
following:
|
||||||
|
|
||||||
|
1. Create a directory <MyDll> where to store the implementation of
|
||||||
|
the DLL.
|
||||||
|
|
||||||
|
If the DLL exists under Windows as both 16 and 32 bit DLL, you can
|
||||||
|
either create one directory for each, or have a single directory
|
||||||
|
with both implementations.
|
||||||
|
|
||||||
|
This (those) directory(ies) have to be put under the dlls/
|
||||||
|
directory in Wine tree structure.
|
||||||
|
|
||||||
|
2. Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can
|
||||||
|
copy an existing Makefile.in from another ./dlls/ subdirectory.
|
||||||
|
|
||||||
|
You need at least to change the MODULE, SPEC_SRCS, and C_SRCS
|
||||||
|
macros.
|
||||||
|
|
||||||
|
3. Add the directory (and the generated .o file for the module) in:
|
||||||
|
+ ./configure.in (in AC_OUTPUT macro at the end of the file to
|
||||||
|
trigger the Makefile generation),
|
||||||
|
+ ./Makefile.in (in LIBSUBDIRS and LIBOBJS macros)
|
||||||
|
|
||||||
|
4. You can now regenerate ./configure file (with 'make configure')
|
||||||
|
and the various Makefiles (with 'configure; make depend') (run
|
||||||
|
from the top of Wine's tree).
|
||||||
|
|
||||||
|
You shall now have a Makefile file in ./dlls/<MyDll>/
|
||||||
|
|
||||||
|
5. You now need to declare the DLL in the module lists. This is done
|
||||||
|
by adding the corresponding descriptor in ./if1632/builtin.c if
|
||||||
|
your DLL is 16 bit (resp. ./relay32/builtin.c for a 32 bit DLL)
|
||||||
|
(or both if your directory contains the dual 16/32
|
||||||
|
implementations).
|
||||||
|
|
||||||
|
Note: the name of the descriptor is based on the module name, not
|
||||||
|
on the file name (they are the same in most of the case, but for
|
||||||
|
some DLLs it's not the case).
|
||||||
|
|
||||||
|
6. You also need to define the loadorder for the created DLL
|
||||||
|
(./wine.ini and ./module/loadorder.c). Usually, "native,builtin"
|
||||||
|
is ok. If you have written a paired 16/32 bit implementation, don't
|
||||||
|
forget to define it also in those files.
|
||||||
|
|
||||||
|
7. Create the .spec file for the DLL export points in your
|
||||||
|
directory. Refer to 'Implementation of new API calls' earlier in
|
||||||
|
this document for more information on this part.
|
||||||
|
|
||||||
|
8. Don't forget the .cvsignore file.
|
||||||
|
|
||||||
|
9. You can now start adding .c files.
|
||||||
|
|
||||||
|
10. For the .h files, if they are standard Windows one, put them in
|
||||||
|
include/. If they are linked to *your* implementation of the DLL,
|
||||||
|
put them in your newly created directory.
|
||||||
|
|
||||||
|
If you need to create a new debug channel, just add the
|
||||||
|
DECLARE_DEBUG_CHANNEL to your .c file(s) and rerun
|
||||||
|
tools/make_debug. When sending out your patch, you don't need to
|
||||||
|
provide nor ./configure nor the ./include/debugdefs.h diffs. Just
|
||||||
|
indicate that those files need to be regenerated.
|
||||||
|
|
||||||
MEMORY AND SEGMENTS
|
MEMORY AND SEGMENTS
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
@ -223,7 +311,7 @@ used by Windows code, you need to embed the struct within two special
|
||||||
#include's which will take care of the packing for you:
|
#include's which will take care of the packing for you:
|
||||||
|
|
||||||
#include "pshpack1.h"
|
#include "pshpack1.h"
|
||||||
struct {BYTE x; WORD y; };
|
struct { BYTE x; WORD y; };
|
||||||
#include "poppack1.h"
|
#include "poppack1.h"
|
||||||
|
|
||||||
For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.
|
For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.
|
||||||
|
|
Loading…
Reference in New Issue