PRB: Guide to Programming LIBENTRY.ASM Documentation Error

ID Number: Q69894

3.00 3.10

WINDOWS

docerr

Summary:

SYMPTOMS

Pages 20-22 and 20-23 of the "Microsoft Windows Software Development

Kit Guide to Programming" for versions 3.0 and 3.1 include incorrect

code for the Windows dynamic-link library (DLL) entry routine,

LIBENTRY.ASM.

RESOLUTION

The following is the correct code:

PAGE,132

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; LIBENTRY.ASM

;

; Windows dynamic-link library entry routine

;

; This module generates a code segment called INIT_TEXT.

; It initializes the local heap if one exists and then calls

; the C routine LibMain which should have the form:

; BOOL FAR PASCAL LibMain(HANDLE hInstance,

; WORD wDataSeg,

; WORD cbHeap,

; LPSTR lpszCmdLine);

;

; The result of the call to LibMain is returned to Windows.

; The C routine should return TRUE if it completes initialization

; successfully, FALSE if some error occurs.

;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

include cmacros.inc

externFP <LibMain> ; the C routine to be called

createSeg INIT_TEXT, INIT_TEXT, BYTE, PUBLIC, CODE

sBegin INIT_TEXT

assumes CS,INIT_TEXT

?PLM=0 ; 'C'naming

externA <_acrtused> ; ensures that Win DLL startup code

; is linked

?PLM=1 ; 'PASCAL' naming

externFP <LocalInit> ; Windows heap init routine

cProc LibEntry, <PUBLIC,FAR> ; entry point into DLL

cBegin

push di ; handle of the module instance

push ds ; library data segment

push cx ; heap size

push es ; command line segment

push si ; command line offset

; if we have some heap then initialize it

jcxz callc ; jump if no heap specified

; call the Windows function LocalInit to set up the heap

; LocalInit((LPSTR)start, WORD cbHeap);

xor ax,ax

cCall LocalInit <ds, ax, cx>

or ax,ax ; did it do it ok ?

jz error ; quit if it failed

; invoke the C routine to do any special initialization

callc:

call LibMain ; invoke the 'C' routine

; (result in AX)

jmp short exit ; LibMain is responsible for

; stack clean up

error:

pop si ; clean up stack on a LocalInit error

pop es

pop cx

pop ds

pop di

exit:

cEnd

sEnd INIT_TEXT

end LibEntry

Additional reference words: 3.00 3.10 3.x