PRB: L2029 '_exit' Unresolved External from STOP Stmt in DLL

Last reviewed: July 18, 1995
Article ID: Q102693
The information in the article applies to:
  • Microsoft FORTRAN for MS-DOS, version 5.1

SYMPTOMS

An attempt to link a dynamic-link library (DLL) for the Microsoft Windows operating system fails and Microsoft LINK generates the following message:

   error L2029: '_exit' : unresolved external

CAUSE

Microsoft FORTRAN does not support using the STOP statement in a DLL developed for Windows.

RESOLUTION

To terminate the DLL and the calling application, use the SendMessage() function in the Windows application programming interface (API) to send the calling application a WM_QUIT message. The code example below demonstrates this technique.

MORE INFORMATION

The code example below terminates the DLL and the calling application after displaying a message box warning the user to save all data.

Sample Code - EXIT.FOR

C Compiler options needed: /c /Od /Zi /AL

      interface to integer*2 function PostAppMessage[pascal]
     + (htask, msg, wparam, lparam)
      integer*2 htask[value]
      integer*2 msg[value]
      integer*2 wparam[value]
      integer*4 lparam[value]
      end

      interface to integer*2 function GetCurrentTask[pascal]
      end

      interface to integer*2 function MessageBox[pascal]
     + (hwnd, boxtext, caption, boxtype)
      integer*2   hwnd[value]
      character*1 boxtext[reference]
      character*1 caption[reference]
      integer*2   boxtype[value]
      end

      subroutine exit
      integer*2 in
      character buffer1*120, buffer2*80
      integer*2 i, WM_QUIT, PostAppMessage, GetCurrentTask, MessageBox
      WM_QUIT = #12

      buffer1 =
     +'************** DLL issued STOP Statement ************'//
     +'\n  Application will terminate. Save contents of windows NOW'c
      buffer2 = 'DLL STOP'c

      i = MessageBox(0, buffer1, buffer2, 0)
      i = PostAppMessage(GetCurrentTask(), WM_QUIT, in, 0)
      return
      end

The following QuickWin driver program calls the subroutine in DLLTEST.FOR.

Sample Code - TEST.FOR

C Compiler options needed: /c /Od /Zi /MW

      program testdllstop
      print *, 'before calling DLL'
      call dllsub
      print *, 'back from sub1'
      end

The following DLL displays a dialog box and calls the exit subroutine to close the DLL and the calling application.

Sample Code - DLLTEST.FOR

C Compiler options needed: /c /Od /Zi /Aw /Gw

      interface to integer*2 function MessageBox[pascal]
     + (hwnd, boxtext, caption, boxtype)
      integer*2   hwnd[value]
      character*1 boxtext[reference]
      character*1 caption[reference]
      integer*2   boxtype[value]
      end

      subroutine dllsub
      integer*2 messagebox
      i = MessageBox(int2(0), 'Prior to STOP statement in DLL'c,
     + ' 'c, 0)
      call exit
      end

DLLTEST.DEF

LIBRARY     DLLTEST
EXETYPE     WINDOWS
CODE        PRELOAD MOVEABLE DISCARDABLE
DATA        PRELOAD MOVEABLE SINGLE
HEAPSIZE    1024
EXPORTS     DLLSUB
            WEP

MAKEFILE

all: test.exe dlltest.dll

test.obj: test.for

   fl /c /Od /Zi /MW test.for

dlltest.obj: dlltest.for
   fl /c /Od /Zi /Aw /Gw dlltest.for

exit.obj: exit.for
   fl /c /Od /Zi /AL exit.for

dlltest.dll: dlltest.obj exit.obj
   link dlltest exit, dlltest.dll, nul, /co /nod ldllfew, dlltest.def;

dlltest.lib: dlltest.def
   implib dlltest.lib dlltest.def

test.exe: test.obj dlltest.lib
   link test, test, nul, /co /nod llibfew dlltest,
      c:\fortran\binb\fl.def;


Additional reference words: 5.10
KBCategory: kbtool kberrmsg kbprb
KBSubcategory: LnkIss


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 18, 1995
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.