Microsoft KB Archive/118557

= How FoxPro Uses Universal Thunking for 32-Bit API Calls =

Article ID: 118557

Article Last Modified on 9/30/2003

-

APPLIES TO


 * Microsoft Visual FoxPro 3.0 Standard Edition

-



This article was previously published under Q118557



SUMMARY
There are two methods of creating 32-bit applications in 16-bit versions of Windows (versions 3.1x). FoxPro uses two variations of the universal thunking (UT) method through the WATCOM compiler in order to perform 32-bit Windows API calls.



Method 1: The Universal Thunk
There are three main components of the universal thunk:


 * The 16-bit dynamic-link library (DLL) provides the same entry points as the Win32.DLL. This DLL serves as the 16-bit end for the universal thunk. It should be noted that the programmer must also include code that will detect whether the 32-bit side is loaded.
 * A Win32.DLL that sets up the universal thunk serves as the 32-bit end of the universal thunk. This DLL is supported only under Win32s.
 * A Win32 .EXE (stub) file loads the 32-bit DLL described above.

The following diagram illustrates how the pieces fit together:                     ---     ---     - | Win32 EXE |-->| Win32 DLL |<->| Win32  | 32-bit          |   (stub)  |   |    (UT)   |   |   DLL   | ---    ---     -                        /|\              /|\             -||-                        \|/              \|/                      -                           | Win 3.1 | <-> | 16-bit DLL | 16-bit          |   app. |    |   (UT)     | -     The load order is as follows:

The Windows 3.0 or 3.1 application loads the 16-bit DLL. The 16-bit DLL checks to see whether the 32-bit side has been initialized. If it has not been initialized, the DLL spawns the 32-bit .EXE (stub), which then loads the 32-bit DLL that sets up the universal thunks with the 16-bit DLL. Once all components are loaded and initialized, when the Windows 3.0 or 3.1 application calls an entry point in the 16-bit DLL, the 16- bit DLL uses the 32-bit universal thunk callback to pass the data to the 32-bit side. Once the call has been received on the 32-bit side, the proper Win32 DLL entry point can be called.

Method 2: Using the Win32s
The Win32s consists of three components:


 * An executable that loads Win32s-based applications in Windows version 3.0 or 3.1
 * A virtual device driver that provides flat-memory model and structured exception-handling support
 * A set of DLLs that translate Win32 function calls to Win16 function calls

To run your Win32s-based application on Windows version 3.0 or 3.1, you must include these Win32s components with your application. Win32s consists of a virtual device driver (VxD) and a set of DLLs that extend Windows 3.0 and 3.1 to support Win32 applications. The Win32s files must be shipped with the Win32 application and installed on the Windows 3.0 or 3.1 system.

Win32s is not built into Windows 3.0 or 3.1, so software vendors must ship and install Win32s (on the DEVICE = line of the WIN.INI file) along with the Win32 application in order to have the Win32 application work under Windows 3.0 or 3.1. The key feature of Win32s is to allow software developers to ship Win32 applications today for Windows 3.0 or 3.1 and Windows NT that will continue to install and work well on future Windows operating systems.

FoxPro for Windows Method
The WATCOM compiler is used to provide the thunking layer between Windows and FoxPro. FoxPro 2.5x for Windows and MS-DOS are both 16-bit applicaiton.. Any addresses or pointers that need to be passed to and from Windows 3.0 or 3.1 must be "thunked" down to 16 bit; the WATCOM compiler is used to perform the translation.

FoxPro 2.6 uses the WATCOM compiler (32-bit) and the Phar Lap extender for thunking. It can run on Windows 3.0 and later, including Windows for Workgroups.

Additional query words: VFoxWin FoxDos FoxWin 2.50 2.50a 2.50b 2.60 2.60a pharlap wfw windows for workgroups

Keywords: KB118557

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.