How To Use the Win32 Registry from 16-bit Windows-Based AppLast reviewed: January 15, 1997Article ID: Q137378 |
The information in this article applies to:
SUMMARYBy 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 INFORMATIONA 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 |
KBCategory: kbprg kbcode
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |