DOCERR: Guide to Programming LIBENTRY.ASM

Last reviewed: July 22, 1997
Article ID: Q69894
3.00 3.10 WINDOWS kbprg kbdocerr

The information in this article applies to:

  • Microsoft Windows Software Development Kit (SDK) for Windows versions 3.1 and 3.0

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 docerr
KBCategory: kbprg kbdocerr
KBSubcategory: KrDll
Keywords : kb16bitonly


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 22, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.