c语言注册函数_c语言修改注册表键值
1.c语言,运行时有0x0040134b引用的0x00130003内存,该内存不能为written是什么原因
2.用C语言删除注册表项
3.c语言读取注册表健值怎么读取
4.C语言怎么判断注册表键值是否存在
无论用哪种语言来读取注册表,都有很多句子;
读取注册表项的各个键值,然后写到文件中 void ExportRegistry( CString cstrKeyRootName, //注册表根值,如HKEY_CURRENT_USER CString cstrKeyName, //注册表子键 CString cstrFileName) //导出的文件名(包括路径) { FILE *fp; HKEY hKeyRootName; CString cstrFullPathStr(_T("")); if(cstrKeyRootName == _T("HKEY_CLASSES_ROOT")) hKeyRootName = HKEY_CLASSES_ROOT; else if(cstrKeyRootName == _T("HKEY_CURRENT_USER")) hKeyRootName = HKEY_CURRENT_USER; else if(cstrKeyRootName == _T("HKEY_LOCAL_MACHINE")) hKeyRootName = HKEY_LOCAL_MACHINE; else if(cstrKeyRootName == _T("HKEY_USERS")) hKeyRootName = HKEY_USERS; else if(cstrKeyRootName == _T("HKEY_PERFORMANCE_DATA")) hKeyRootName = HKEY_PERFORMANCE_DATA; else if(cstrKeyRootName == _T("HKEY_CURRENT_CONFIG")) hKeyRootName = HKEY_CURRENT_CONFIG; else if(cstrKeyRootName == _T("HKEY_DYN_DATA")) hKeyRootName = HKEY_DYN_DATA; fp = fopen(cstrFileName, "w+"); if(fp == NULL) { MessageBox(NULL, _T("Error while creating the file"), _T("Registry eXPort"), MB_OK); return; } if(cstrKeyName.IsEmpty()) cstrFullPathStr = cstrKeyRootName; else cstrFullPathStr = cstrKeyRootName + _T("\\") + cstrKeyName; //// First print the header ..... this may be different for some version of Windows... do manually change if required //Here need to add version check Dword dwVersion = GetVersion(); // Get build numbers for Windows NT or Win32s if (dwVersion < 0x80000000) // Windows NT { fprintf(fp, "%s\n", _T("Windows Registry Editor Version 5.00")); } else // Win32s { fprintf(fp, "%s\n", _T("REGEDIT4")); } EnumerateValues(hKeyRootName, cstrKeyName, fp, cstrFullPathStr); EnumerateKey(hKeyRootName, cstrKeyName , fp , cstrFullPathStr); fclose(fp); }这种方法比较原始,也比较复杂,是直接读取、枚举注册表的键值,然后一项一项的写到文件中。这种方法是我在参考Thanigai Murugan K.(具体的出处记不起来了)写的。他原来导出的函数中存在比较多的问题,一是不能导出所有的键值,二是导出的有些键值不符合规范,无法进行导入。我除了EnumerateValues函数没有修改外,其他的函数全都重新写了一遍。这个函数使用起来也非常方便,例如:CRegisterExport re; re.EXPortRegistry("HKEY_CURRENT_USER","Software\\VCKBASE","C:\\Test.reg");
c语言,运行时有0x0040134b引用的0x00130003内存,该内存不能为written是什么原因
调用注册表操作API,可以在
HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
以上是自动运行程序注册的位置,都有自动运行程序的功能,也有不同之处,具体看msdn吧,下面是操作注册表的API:
1、RegCloseKey()
原型:RegCloseKey(HKEY hKey)
解释:关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。
2、RegCreateKeyEx()
原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,
LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition );
解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。提供该函数是为了向后兼容。所有的WIN32应用程序应使用函数RegCreateKeyEx()。各参数及返回值的含义如下:
各参数及返回值的含义如下:
·hKey为主键值,可以取下面的一些数值:HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、 HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USER、HKEY_PERFORMANCE_DATA(WINNT操作系统)、HKEY_DYN_DATA(WIN9X操作系统);
·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(\)开始。该参数可以为NULL;
·参数Reserved为保留值,必须设置为0;
·参数lpClass为一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数;
·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值: REG_OPTION_NON_VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);REG_OPTION_VOLATILE,表示新创建的键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持;
·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:KEY_CREATE_LINK,表示准许生成符号键;KEY_CREATE_SUB_KEY 表示准许生成子键;KEY_ENUMERATE_SUB_KEYS 表示准许生成枚举子键;KEY_EXECUTE 表示准许进行读操作;KEY_NOTIFY表示准许更换通告; KEY_QUERY_VALUE 表示准许查询子键;KEY_ALL_ACCESS 提供完全访问,是上面数值的组合;
KEY_READ 是下面数值的组合:KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY; KEY_SET_VALUE 表示准许设置子键的数值;KEY_WRITE 是下面数值的组合:KEY_SET_VALUE、KEY_CREATE_SUB_KEY;
·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述;
·参数phkResult为一个指向新创建或打开的键的句柄的指针;
·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值: REG_CREATE_NEW_KEY 表示键先前不存在,现在被创建;REG_OPENED_EXISTING_KEY 表示键先前已存在,现在被打开。
如果该函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSE_FROM_SYSTEM标识调用FormatMessage()函数来获取一个对错误的总体描述。
3、RegOpenKeyEx()
原型:LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
REGSAM samDesired, PHKEY phkResult );
解释:打开一个指定的键,并返回打开键的句柄。
各参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄;
·参数ulOption保留,通常必须设置为0;
·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数;
·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄;
·函数的返回值同RegCreateKeyEx函数的返回值。
4、 查询某一个键值:RegQueryValueEx()
原型:LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD pReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData );
解释:根据要查询的键的句柄,要返回的查询的数据。
各个参数及返回值的含义如下:
·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数;
·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针;
·参数lpReserved保留,必须为NULL;
·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:REG_BINARY 二进制数据、REG_DWORD 32位整数、REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存、REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存、REG_EXPAND_SZ 一个包含未扩展环境变量的字符串、REG_LINK 一个Unicode类型的链接、REG_MULIT_SZ 以两个零结尾的字符串、REG_NONE 无类型数值、REG_RESOURCE_LIST 设备驱动列表、REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串;
·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL;
·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL;返回值同RegCreateKeyEx函数的返回值;
5、RegSetValueEx()
原型:LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, DWORD dwType,
const BYTE *lpData, DWORD cbData);
解释:设置注册表中的一个键值。
各个参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
·参数lpValueName为一个指向包含值名的字符串指针;Reserved保留,通常必须设置为0;
·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数;
·参数lpData为一个指向包含数据的缓冲区的指针;
·参数cbData以字节为单位,指定数据的长度;
返回值同RegCreateKeyEx函数的返回值。
6、RegDeketeKey()
原型:LONG RegDeleteKey(HKEY hKey,LPCTSTR lpSubKEY);
解释:函数RegDeketeKey删除一个键及所有的子键。
各个参数及返回值的含义如下:
·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。
用C语言删除注册表项
出现0x 指令引用的0x内存。该内存不能为"read"或"written"。
只要对症下药问题才能解决。答案原创★严禁复制★
1盗版系统或GHOST版本系统可能会出现该问题,如果系统本身有问题,及时安装官方发行的补丁,{检查电脑年、月、日是否正确}。建议:使用正版或官方网站其它版本的系统
2对电脑没有影响或偶尔出现,不用管它,重启电脑后可能会自动消失。
3引起的:升级杀毒软件或下载专杀工具,对电脑全盘杀毒。
4硬件上的原因:是内存引起的,把内存条拆下重新安装。必要时更换内存条
5软件引起的:安装的软件与系统或其它软件发生冲突,(一般的解决办法就是卸载该软件重新安装或卸载有冲突的软件,问题才能解决。) 如果驱动不稳定,重新安装驱动或及时更新驱动。
6注意:如果您使用windows IE,最近一段时间很多网友反映IE变得不太稳定。用360安全卫士修复IE,如果没有效果{升级IE或降低IE版本试试}。如果还是不行,最简单的解决办法就是:下载更换其它浏览器。不用删除windows IE,直接使用其它浏览器即可。比如:360安全浏览器、世界之窗浏览器、傲游等。
对应以上的如果都没问题,可以试试下面的方法:
◆试用命令排除
开始-运行- 输入cmd-- 回车,在命令提示符下输入下面命令
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1回车。
完成后,在输入下面的
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回车。
如果怕输入错误,可以复制这两条指令,然后在命令提示符后击鼠标右键,打“粘贴”,回车,耐心等待,直到屏幕滚动停止为止。重启电脑
◆◆运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks 下,应该只有一个正常的键值{AEB6717E-7E19-11d0-EE-00C04FD912}, 将其他的删除。如果还有一个(默认)不用管它,一般它为空。
c语言读取注册表健值怎么读取
请注意以下程序中的主函数中的调用语句:
bSuccess = RegDelnode(HKEY_CURRENT_USER, "Software\\TestDir"); /*删除HCU下的Software\TestDir*/
按照这样的格式,要想删除哪个项目,只需要将其做为参数传入RegDelnode()函数就可以了!比如:
RegDelnode(HKEY_CURRENT_USER, "Software");
RegDelnode(HKEY_CURRENT_CONFIG, "Software");
***********************************************
#include <windows.h>
#include <stdio.h>
BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
LPTSTR lpEnd;
LONG lResult;
DWORD dwSize;
TCHAR szName[MAX_PATH];
HKEY hKey;
FILETIME ftWrite;
// First, see if we can delete the key without hing
// to recurse.
lResult = RegDeleteKey(hKeyRoot, lpSubKey);
if (lResult == ERROR_SUCCESS)
return TRUE;
lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
if (lResult == ERROR_FILE_NOT_FOUND) {
printf("Key not found.\n");
return TRUE;
}
else {
printf("Error opening key.\n");
return FALSE;
}
}
// Check for an ending slash and add one if it is missing.
lpEnd = lpSubKey + lstrlen(lpSubKey);
if (*(lpEnd - 1) != TEXT('\\'))
{
*lpEnd = TEXT('\\');
lpEnd++;
*lpEnd = TEXT('\0');
}
// Enumerate the keys
dwSize = MAX_PATH;
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
NULL, NULL, &ftWrite);
if (lResult == ERROR_SUCCESS)
{
do {
lstrcpy (lpEnd, szName);
if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
break;
}
dwSize = MAX_PATH;
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
NULL, NULL, &ftWrite);
} while (lResult == ERROR_SUCCESS);
}
lpEnd--;
*lpEnd = TEXT('\0');
RegCloseKey (hKey);
// Try again to delete the key.
lResult = RegDeleteKey(hKeyRoot, lpSubKey);
if (lResult == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey)
{
TCHAR szDelKey[2 * MAX_PATH];
lstrcpy (szDelKey, lpSubKey);
return RegDelnodeRecurse(hKeyRoot, szDelKey);
}
void main()
{
BOOL bSuccess;
bSuccess = RegDelnode(HKEY_CURRENT_USER, "Software\\TestDir"); /*删除HCU下的Software\TestDir*/
if(bSuccess)
printf("Success!\n");
else printf("Failure.\n");
}
C语言怎么判断注册表键值是否存在
c++读取windows注册表信息的方法为:
以下是示例代码:
GetStringRegKey(hKey, L"BinDir", strValueOfBinDir, L"bad");
GetStringRegKey(hKey, L"", strKeyDefaultValue, L"bad");
LONG GetDWORDRegKey(HKEY hKey, const std::wstring &strValueName, DWORD &nValue, DWORD nDefaultValue)
{
nValue = nDefaultValue;
DWORD dwBufferSize(sizeof(DWORD));
DWORD nResult(0);
LONG nError = ::RegQueryValueExW(hKey,
strValueName.c_str(),
0,
NULL,
reinterpret_cast<LPBYTE>(&nResult),
&dwBufferSize);
if (ERROR_SUCCESS == nError)
{
nValue = nResult;
}
return nError;
}
LONG GetBoolRegKey(HKEY hKey, const std::wstring &strValueName, bool &bValue, bool bDefaultValue)
{
DWORD nDefValue((bDefaultValue) ? 1 : 0);
DWORD nResult(nDefValue);
LONG nError = GetDWORDRegKey(hKey, strValueName.c_str(), nResult, nDefValue);
if (ERROR_SUCCESS == nError)
{
bValue = (nResult != 0) ? true : false;
}
return nError;
}
LONG GetStringRegKey(HKEY hKey, const std::wstring &strValueName, std::wstring &strValue, const std::wstring &strDefaultValue)
{
strValue = strDefaultValue;
WCHAR szBuffer[512];
DWORD dwBufferSize = sizeof(szBuffer);
ULONG nError;
nError = RegQueryValueExW(hKey, strValueName.c_str(), 0, NULL, (LPBYTE)szBuffer, &dwBufferSize);
if (ERROR_SUCCESS == nError)
{
strValue = szBuffer;
}
return nError;
}
//---------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
int main(void)
{
char str[]="SOFTWARE\\call";
HKEY ck;
if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)str,0,KEY_ALL_ACCESS,&ck)) {
printf("YES\n");
RegCloseKey(&ck);
}
else printf("NO\n");
return 0;
}
//---------------------------------------------------------------------------
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。