The registration database of WIN 95 and NT is a very important part of the system. There is a set of REG functions in the Win32 API to handle these issues. The general read and write process is as follows:
1. Use the RegopenkeyEx or RegreateKeyex function to open or create a key;
2. If the last step is successful, use the regQueryValueex read the value of the subkey, use the RegSetValueEx to set the sub-key value, use RegenumKey to get all sub-keys, use regdeletekey to delete a key;
3. Use the Regclosekey shutdown button after completing the operation.
The following program opens the HKEY_CURRENT_USER / SOFTWARE / ZEAL SOFTSTUDIO / SOFTWARE / ZEAL SOFTSTUDIO / ASKPRO FTP / LASTTIME button and then read the value of the Wol subkey.
HKEY HKEY;
Char SZ [256];
DWORD DWTYPE, SL = 256;
RegopenKeyex (HKEY_CURRENT_USER,
"Software // Zeal Softstudio // askpro ftp // lasttime",
NULL, Key_All_access, & HKey
RegQueryValueex (HKEY, "WOL", NULL, & DWTYPE, (LPBYTE) SZ, & SL
RegcloseKey (HKEY);
The MFC program can read and write the registry using the CREGKEY class. The way to call the API in the VB can refer to QA000226 "How to Access Windows System Registry".
Open the registration button
Long RegopenKeyex (HKEY HKEY, // Handle To Open Key
LPCTSTR LPSUBKEY, / / Address of Name of Subkey To Open
DWORD ULOPTIONS, // Reserved = 0
Regsam Samdesired, // Security Access Mask
Phkey phkresult // address of Handle to Open Key
);
example:
HKEY HD;
HD = HKEY_LOCAL_MACHINE;
Char * regKeyname = "Software // XY123 // poker //";
Long a = regopenkeyex (hd, regkeyname, 0, key_read, & hd); // Successfully returned ERROR_SUCCESS, otherwise returns an error code
Close registration button
Long regclosekey (HKEY HKEY / / HANDLE TO Key To Close);
example:
RegcloseKey (HKEY_LOCAL_MACHINE);
Al: RegcloseKey (HD);
Establish registration key
Long RegcreateKeyex (HKEY HKEY, // Handle To An Open Key
LPCTSTR LPSUBKEY, / / Address of Subkey Name
DWORD reserved, // reserved = 0
LPTSTR LPCLASS, / / Address of class string
DWORD DWOPTIONS, / / SPECIAL OPTIONS FLAG
Regsam Samdesired, // Desired Security Access
LPSecurity_Attributes LPSecurityAttributes, // Address of Key Security Structure
Phkey phkResult, // address of buffer for Opened Handlerpdword LPDWDISPOSITION / / Address of Disposition Value Buffer;
example:
Char * sclass = ""; // class name is specified as empty
DWORD NBF = 0; // Accept the return value, indicate whether to create a new button or open the existing key. (Test Always return REG_OPENED_EXISTING_KEY.
Long II = regreateKeyex (HD, RegkeyName, 0, Sclass, Reg_Option_non_Volatile,
Key_Read | Key_WRITE, NULL, & HD, & NBF;
// reg_option_non_volatile indicates that the key is permanently reserved. The security structure indicates null, automatically obtains a default value.
/ / Successfully returned ERROR_SUCCESS, otherwise returns an error code
Enumerate key value
Long RegenumValue (HKEY HKEY, // Handle to Key to Query
DWORD DWINDEX, // Index of Value To Query
LPTSTR LPVALUENAME, / / Address of Buffer for Value String
LPDWORD LPCBVALUENAME, / / Address for Size of Value Buffer
LPDWORD LPRESERVED, // Reserved = NULL
LPDWORD LPTYPE, / / Address of Buffer for Type Code
LPBYTE LPDATA, / / Address of Buffer for Value Data
LPDWORD LPCBDATA // Address for size of data buffer;
example:
DWORD DINX = 0;
Char Valuename [70]; // Allocate Numerical Name Buffer
STRCPY (Valuename, "Deskpattern"); // Jelly specifies which key value name
DWORD nsize = 69; // Value Name Buffer Size
DWORD K = reg_sz; // Indicate data type
Unsigned char vari [70]; // allocating numerical buffer
DWORD NCBVARI = 69; // Numerical buffer size
DINX = 0; // starting from 0
While ((II = RegenumValue (HD, DINX, VALUENAME, & NSIZE, NULL, & K, VARI, & NCBVARI))
= Error_no_more_items)
{
DINX ; // Index 1, ready to remove a value
nsize = 69; // Restore the original size
NCBVARI = 69;
}
After successful, return value 0, and each variable is returned to the following:
VALUENAME = value name, ending 0; if: Deskcolor
nsize = numeric name length, 9
K = reg_sz deskcolor type is REG_SZ
VARI = key value, 32768 deskcolor = "32768",
NCBVARI = key value REG_SZ includes end 0, = 6,
Read key value
Long RegqueryValueex (HKEY HKEY, // Handle To Key to Query
LPTSTR LPVALUENAME, / / Address of Name of Value To Query
LPDWORD LPRESERVED, // RESERVED
LPDWORD LPTYPE, // Address of Buffer for Value Typelpbyte LPDATA, / / Address of Data Buffer
LPDWORD LPCBDATA / / Address of Data Buffer Size;
example:
RegQueryValueex (HD, Valuename, Null, & K, VARI, & NCBVARI);
Variable definition and successful variable setting value with RegenumValueex
Write key value
Long RegsetValueex (HKEY HKEY, // Handle To Key To Set Value for
LPCTSTR LPVALUETS, // Name of The Value To Set
DWORD RESERVED, // Reserved
DWORD DWTYPE, / / FLAG for Value Type
Const Byte * LPData, // Address of Value Data
DWORD CBDATA / / SIZE OF VALUE DATA);
example:
STRCPY (Valuename, "Hello");
Unsigned char vari [10];
DWORD K = REG_SZ;
STRCPY (CHAR *) VARI, "1234567")
RegSetValueex (HD, Valuename, 0, K, VARI, 7);
After success, add a key value in Poker Hello: REG_SZ: 1234567
Write integer variable:
INT HI = 8;
RegSetValueex (pj, valuename, 0, reg_binary, (unsigned char *) & hi, sizeof (int));
After successful, add a key value under Poker Hello2: reg_binary: 08 00 00 00
Void addeventsource ()
{
HKEY HK;
DWORD DWDATA;
Uchar szbuf [80];
// Add your source name as a subkey under the application
// Key in The EventLog Registry Key.
IF (REGCREATEKEY (HKEY_LOCAL_MACHINE,
System // CurrentControlSet // Services /
// EventLog // Application // Samplapp ", & hk)
"" COULD NOT CREATE THE REGISTRY Key. ");
// set the name of the message file.
STRCPY (SZBUF, "% systemroot% // system // samplapp.dll");
// add the name to the EventMessageFile Subkey.
IF (RegSetValueex (HK, // Subkey Handle
"EventMessageFile", // value name
0, // must be Zero
REG_EXPAND_SZ, / / VALUE TYPE
(Lpbyte) SZBUF, // Pointer to Value Data
Strlen (SZBUF) 1)) // Length of Value Data
ErroRexit ("Could Not Set The Event Message File.");
// set the supported event type in the type = EventLog_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
EventLog_information_type;
IF (RegSetValueex (HK, // Subkey Handle
"Typessupported", // Value Name
0, // must be Zero
REG_DWORD, / / VALUE TYPE
(Lpbyte) & dwdata, // Pointer to Value Data
Sizeof (dword))) // Length of Value Data
"" "Could Not Set The Supported Types.");
RegcloseKey (HK);
}
The following code is rewritten to C: /DK1/ATM/harp/exatmshell.exe:
HKEY HKEY;
Long res;
DWORD DATATYPE = REG_SZ;
Unsigned char szvalue [_max_path];
STRCPY ((char *) Szvalue, "C: //dk1//ATM//harp/ /exatmshell.exe");
Res = :: regopenkeyex (HKEY_LOCAL_MACHINE,
"Software // Microsoft // Windows NT // CurrentVersion // WinLogon ///////////////////////////////////////////////////////>
Key_WRITE | Key_Read, & HKey
IF (res! = error_success)
{
AfxMessageBox ("AAA");
Return;
}
Res = :: RegSetValueex (HKEY, "Shell", 0, DataType, Szvalue, Strlen (LPCSTR (SzValue));
RegcloseKey (HKEY);
IF (res == error_success)
:: AFXMessageBox ("You have successfully set the registry from the key value of the Shell to C: //dk1//atm//harp//exatmshell.exe");
Else
:: AfxMessageBox ("Set failed: There is no such key!");