How To Use the Win32 Registry from 16-bit Windows-Based App

ID: Q137378


The information in this article applies to:
  • Microsoft Win32 Software Development Kit (SDK), versions 3.1x, 3.5, 3.51, 4.0


SUMMARY

By obtaining access to all Win32-based registry APIs, a 16-bit Windows-based application can also gain full access to the Win32 registry. Such access would be based on Generic Thunking to ensure portability between Windows NT and Windows 95.


MORE INFORMATION

A 16-bit Windows-based application must implement a generic thunk function for each Win32 API required to access the Win32 registry. To achieve the greatest flexibility, you need to implement these new functions in a 16-bit Windows-based DLL that can be implicitly linked to a 16-bit Windows-based application. In Windows NT and Windows 95, all Win32 registry APIs are exported from Advapi.dll.

For a 16-bit Windows-based application to access the Win32 registry, it must first define the predefined reserved handle value (HKEY_LOCAL_MACHINE) as defined by the Win32 environment. These predefined reserved handle values are located in the Winreg.h file in the Win32 SDK.

The following demonstrates a sample technique used to perform registry thunking:


// required includes
#include "wownt16.h"     // available from Win32 SDK
#include "shellapi.h"    // 16-bit Windows header

// As defined by the Win32 SDK in Winreg.h
#define HKEY_CURRENT_USER           (( HKEY ) 0x80000001 )

HKEY hOpen;
DWORD rc;

if ( ERROR_SUCCESS ==
      (rc=RegOpenKey(HKEY_CURRENT_USER, "Control Panel\\Desktop", &hOpen)))
      {
         DWORD dwType, cbData;
         BYTE   bData[1000];
         cbData = 1000;

         if ( (rc =
         RegQueryValueEx(hOpen, "BorderWidth", NULL,
                              &dwType, bData, &cbData ))
              == ERROR_SUCCESS )
          {
          // used retreived data
          MessageBox(NULL, "Value Retreived","Information",MB_OK);
          }
          else
             MessageBox(NULL, "RegQueryValueEx Failed","Error",MB_OK);
             RegCloseKey(hOpen);
      }

// This code should be placed in a DLL to allow for maximum flexibility.
// When the full conversion to 32-bit is complete, the thunking library
// need not be included.

LONG RegQueryValueEx(
    HKEY  hKey,
    LPSTR  lpszValueName,
    LPDWORD  lpdwReserved,
    LPDWORD  lpdwType,
    LPBYTE  lpbData,
    LPDWORD  lpcbData
   )
{
    DWORD pFn;
    DWORD dwResult = ERROR_ACCESS_DENIED; //random error if fail
    DWORD hAdvApi32;

    hAdvApi32=LoadLibraryEx32W("ADVAPI32.DLL", NULL, 0);

    if ((DWORD)0!=hAdvApi32)
     {
           // call ANSI version
      pFn=GetProcAddress32W(hAdvApi32, "RegQueryValueExA");
      if ((DWORD)0!=pFn)
       {
        dwResult=CallProcEx32W(
               CPEX_DEST_STDCALL | 6, // standard function call with
                                      // six parameters
               0x3e,                  // Identify what parameters
                                      //(addresses) must be translated
               pFn,                   // function pointer
               hKey,                  // open key
               lpszValueName,         // value to query
               lpdwReserved,          // reserved for future use
               lpdwType,              // value type
               lpbData,               // value data
               lpcbData               // value data length
               );
       }
     }
    if (hAdvApi32)
                 FreeLibrary32W(hAdvApi32);

              return(dwResult);
} 


To include the generic thunk APIs, the 16-bit app needs to add the following to its module definition (.DEF) file:

IMPORTS
_CallProcEx32W = KERNEL.518
LoadLibraryEx32W = KERNEL.513
FreeLibrary32W = KERNEL.514
GetProcAddress32W = KERNEL.515

Additional query words: 3.50 4.00

Keywords : kbcode kbKernBase kbRegistry kbGrpKernBase
Version : 3.1x 4.00 | 3.50 3.51 4.00
Platform : NT WINDOWS
Issue type :


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