This article was previously published under Q107174
This article has been archived. It is offered "as is" and will no longer be updated.
When a Windows-based application is started, it fails to load. Whilerunning under the debug version of Windows, one or both of the followingdebug messages are displayed on the debug terminal:
Then, Windows generates the following unrecoverable application error(UAE): "Not enough space for Environment."
The initial size specified for the application's local heap in the DEFfile is too small to contain the local allocation for the environment.
When the Windows loader loads an application, it also stores a copy ofthe MS-DOS environment strings (such as the PATH string, and so forth)in the application's DGROUP. In general, the space needed to storethis environment table could be around 200 to 300 bytes, but it couldvary depending on the environment variables in the system. The loaderwill try to allocate space for the environment table usingLocalAlloc(), and this call will fail if there is not enough space inthe local heap. In such a case, Windows automatically tries to expandthe local heap by doing a Gloabal(Re)Alloc. Because the maximum sizefor the DGROUP is 64K, the GlobalAlloc will fail if the loader triesto grow the DGROUP beyond the 64K limit. This will happen when thesize of the DGROUP is close to the limit of 64K and there is notenough space in the application's DGROUP for Windows to expand thelocal heap in it. In such a case, the application's DGROUP must becleaned up to allow more space for the local heap. A few ways to dothis are:
Reduce the application's stack size using the STACKSIZE statement in the DEF file. A recommended stack size is between 5K and 10K. You can also determine exactly how much stack space your application needs and use that optimized value in your DEF file. For more information, query in the Microsoft Knowledge Base on the following words:
Move string constants from your DGROUP into string tables in a DEF file. Move large static arrays from your DGROUP to dynamically allocated memory using GlobalAlloc.
If Microsoft C/C++ or Visual C++ compiler is being used, some of the data from the DGROUP can be moved into an extra data segment by using the /Gt compiler option (refer to pages 522-523 of the Microsoft C/C++ "Environment and Tools" manual). However, note that an application with multiple data segments will be restricted to only one instance. For more information on this problem, please query in the Microsoft Knowledge Base on the following words: