Microsoft KB Archive/137378

{|
 * width="100%"|

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

 * }

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
 * 1) include "wownt16.h"    // available from Win32 SDK
 * 2) include "shellapi.h"   // 16-bit Windows header

// As defined by the Win32 SDK in Winreg.h
 * 1) 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 : _IK kbKernBase kbRegistry kbGrpDSKernBase

Issue type :

Technology : kbWin32SDKSearch kbAudDeveloper kbSDKSearch kbWin32sSearch kbWin32SDK400 kbWin32SDK350 kbWin32SDK351