PRB: Insufficient Memory Message Running a FoxPro EXE

ID: Q190462


The information in this article applies to:
  • Microsoft Visual FoxPro for Macintosh, version 3.0b
  • Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0, 5.0a, 6.0


SYMPTOMS

When you run an executable created with Visual FoxPro from within Visual FoxPro, the following error message occurs:

VFP cannot start--insufficient memory free up memory and try again.
This message may also occur when you attempt to run multiple sessions of Visual FoxPro while system resources are low.


RESOLUTION

Use the DO command to launch an executable, created with Visual FoxPro, from within a Visual FoxPro application or executable.


MORE INFORMATION

Launching an application uses available system resources, and launching multiple instances of an application can severely reduce the system resources available.

Steps to Reproduce Behavior

  1. Create a .prg file named Waitwins.prg, using the following code:
    
          SET EXCL OFF
          ox=CREATEOBJECT('TEST')
          ox.INIT
          RELEASE ox
    
          DEFINE CLASS test AS CUSTOM OLEPUBLIC
             NAME = "TEST"
    
             PROCEDURE INIT
                set excl off
                IF !FILE('TESTDBF.DBF')
                   CREATE TABLE testdbf (testflda T)
                ENDIF
                INSERT INTO testdbf (testflda) VALUES (DATETIME())
             ENDPROC
          ENDDEFINE 


  2. Create a new project called WAITWINS and ADD the Waitwins.prg.


  3. Click the Build button in the Project Manager dialog box and select the Build Executable option.


  4. Create a .prg file named Memtest.prg, using the following code:
    
          DO WHILE .T.
             IF LASTKEY()=27
                EXIT
             ENDIF
             RUN /N waitwins
             =memcheck()
             SELECT testmem
             GO BOTT
             =INKEY(10)
          ENDDO
    
          PROCEDURE memcheck
             * Check available memory
             m.os_is=OS()
             m.curtime=DATETIME()
             m.func_pos="FORM TEST"
             IF !FILE('testmem.dbf')
                CREATE TABLE testmem (os_is c(15), func_pos c(15), ;
                   CURTIME T, tphys N(15,0), availphys N(15,0), ;
                   tpagefile N(15,0), apagefile N(15,0), ;
                   tvirtual N(15,0), avirtual N(15,0), runapps m)
             ENDIF
             DECLARE GlobalMemoryStatus IN win32api STRING @MemStat
             m.stru = longtostr(32) + REPLICATE(CHR(0), 28)
             =GlobalMemoryStatus(@m.stru)
             m.tphys = strtolong(SUBSTR(m.stru, 9, 4))
             m.availphys = strtolong(SUBSTR(m.stru, 13, 4))
             m.tpagefile = strtolong(SUBSTR(m.stru, 17, 4))
             m.apagefile = strtolong(SUBSTR(m.stru, 21, 4))
             m.tvirtual = strtolong(SUBSTR(m.stru, 25, 4))
             m.avirtual = strtolong(SUBSTR(m.stru, 29, 4))
             m.runapps=runapps()
             INSERT INTO testmem FROM MEMVAR
    
          PROCEDURE runapps
             LOCAL awin_apps, vfp_handle, ln_current_window,ln_window_count
             * Determine what other applications are running
             DIMENSION awin_apps[1]
             vfp_handle=0
             DECLARE INTEGER FindWindow ;
                IN win32api ;
                INTEGER nullpointer, ;
                STRING cwindow_name
             DECLARE INTEGER GetWindow ;
                IN win32api ;
                INTEGER ncurr_window_handle, ;
                INTEGER ndirection
             DECLARE INTEGER GetWindowText ;
                IN win32api ;
                INTEGER n_win_handle, ;
                STRING @ cwindow_title, ;
                INTEGER ntitle_length
             vfp_handle=FindWindow(0,_SCREEN.CAPTION)
             ln_current_window=vfp_handle
             ln_window_count=0
             DO WHILE ln_current_window>0
                lc_window_title=SPACE(255)
                ln_length=GetWindowText(ln_current_window, ;
                   @lc_window_title,LEN(lc_window_title))
                IF ln_length>0
                   lc_window_title=STRTRAN(TRIM(lc_window_title),CHR(0),"")
                ELSE
                   lc_window_title=""
                ENDIF
                IF ln_current_window>0 .AND. !EMPTY(lc_window_title)
                   ln_window_count=ln_window_count+1
                   DIMENSION awin_apps(ln_window_count,2)
                   awin_apps[ln_Window_Count,1]=lc_window_title
                   awin_apps[ln_Window_Count,2]=ln_current_window
                ENDIF
                ln_current_window=GetWindow(ln_current_window,2)
             ENDDO
             retval=""
             IF !EMPTY(awin_apps[1])
                IF ALEN(awin_apps,1)>0
                   FOR i=1 TO ALEN(awin_apps,1)
                      retval=retval+awin_apps[i,1]+CHR(13)
                   NEXT
                ENDIF
             ENDIF
             CLEAR DLLS
             RETURN retval
    
          FUNCTION longtostr
             PARAMETERS lnlongval
             PRIVATE i, lcretstr
             lcretstr = ""
             FOR i = 24 TO 0 STEP -8
                lcretstr = CHR(INT(lnlongval/(2^i))) + lcretstr
                lnlongval = MOD(lnlongval, (2^i))
             NEXT
             RETURN lcretstr
    
          FUNCTION strtolong
             PARAMETERS lclongstr
             PRIVATE i, lnretval
             lnretval = 0
             FOR i = 0 TO 24 STEP 8
                lnretval = lnretval + (ASC(lclongstr) * (2^i))
                lclongstr = RIGHT(lclongstr, LEN(lclongstr) - 1)
             NEXT
             RETURN lnretval 


  5. In the Command window type the following command:
    
          DO MEMTEST 


Depending on the available system resources, it may take several hours for the error message to appear.


REFERENCES

For additional information, please see the following articles in the Microsoft Knowledge Base:

Q181289 HOWTO: Pass Structures to a DLL
Q188404 HOWTO: Use API Calls to Detect Other Running Applications
(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by John Desch, Microsoft Corporation

Additional query words: kbVFp300b kbVFp500 kbVFp500a kbMAC kbvfp600

Keywords :
Version : MACINTOSH:3.0b; WINDOWS:3.0,3.0b,5.0,5.0a,6.0
Platform : MACINTOSH WINDOWS
Issue type : kbprb


Last Reviewed: August 3, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.