❶ 用c语言怎样做注册表
1、MSDN的定义是
LONG WINAPI RegSetValueEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpValueName,
_Reserved_ DWORD Reserved,
_In_ DWORD dwType,
_In_ const BYTE *lpData,
_In_ DWORD cbData
);
_In_ _out_ _Reserved_ 这样的标志是传入传出保留参数的意思。参考用。
HKEY hKey是注册表的5个主键之一如 HKEY_LOCAL_MICHINE.
LPCTSTR lpValueName 是子健的整个路径。
DWORD Reserved, 保留为0.
DWORD dwType新建注册表项的类型,DWORD,REG_DOWORD等。
const BYTE *lpData,对应的内容。
DWORD cbData 对应的长度,对安全输入有帮助。
有不知道的可以去查msdn 实在看不懂英文的话网络里面也有。
2、例如:
HKEY hKEY;
LPCTSTR data_Set=L"txtfile\\shell\\open\\command";
RegOpenKeyEx(HKEY_CLASSES_ROOT,data_Set,0,KEY_READ,&hKEY);
RegSetValueEx(hKEY,NULL,0,REG_SZ,(byte *)L"\%SystemRoot\%\\system32\\NOTEPAD\.EXE \%1",100);
❷ 用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 having
// 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语言操作注册表的书籍啊
操作注册表是Windows编程的内容,有一个WindowsAPI函数族专门用于操作注册表,可网上搜索或阅读Windows、VC编程教材。
❹ c语言修改注册表
有钻研精神,很好!但是,同时要学习调试程序和查阅MSDN手册,寻求解决问题的方法。
MSDN文档中有这么一行:
If dwType is the REG_SZ, REG_MULTI_SZ, or REG_EXPAND_SZ type and the ANSI version of this function is used (either by explicitly calling RegSetValueExA or by not defining UNICODE before including the Windows.h file), the data pointed to by the lpData parameter must be an ANSI character string. The string is converted to Unicode before it is stored in the registry.
这说明了,你如果出现了乱码,是字符集的问题。C语言默认的是ANSI字符集,而你的RegSetValueEx使用的是Unicode编码。
因此,我们有两种解决措施:
1.使用Unicode方法编程,包括各种字符串的赋值,都要改;
2.使用RegSetValueExA函数,具体来说,就是改一行代码:
LONG return1 = RegSetValueExA(key1,(LPCSTR)path2,NULL,REG_EXPAND_SZ,(const BYTE *)a,30);
OK。另外,你的"(默认)"不是这样用的,这样会新建一个值,名字叫"(默认)",应该为空字符串或NULL。参见MSDN:
If lpValueName is NULL or an empty string, "", the function sets the type and data for the key's unnamed or default value.
希望对你能有所帮助。
❺ 用C语言实现修改注册表
void WriteReg()
{
//test1:在根结点上创建子键
CString strSubKey= "MySubKey";
HKEY hkey1, hkey2;
long lrt, lRtVal;
DWORD dwdisposition= REG_CREATED_NEW_KEY;
if( ERROR_SUCCESS == RegCreateKeyEx( HKEY_CURRENT_USER, strSubKey, 0, NULL, 0, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, &hkey1, &dwdisposition ) )
//注:KEY_CREATE_SUB_KEY | KEY_SET_VALUE标志分别用于后面创建子键,后创建键值项, {
//test2:在刚创建的子键(MySubKey)下再创建子键( MySubSubKey)
lrt = RegCreateKeyEx( hkey1, "MySubSubKey", 0, NULL, 0, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, &hkey2, &dwdisposition );
//test3:在第一步创建的子键MySubKey下增加键值项
CString strValue="value of the MySubKey's valueItem";
lRtVal= RegSetValueEx( hkey1, "valItem1", 0, REG_SZ, (const byte *)(LPCTSTR)strValue , strValue.GetLength() + 1 );
//test4:在MySubSubKey下创建键值项
if( lrt == ERROR_SUCCESS )
{
strValue="value of the MySubSubKey's valueItem";
lRtVal= RegSetValueEx( hkey2, "valItem1", 0, REG_SZ, (const byte *)(LPCTSTR)strValue , strValue.GetLength() + 1 );
}
}
}
二,读注册表, 函数:RegOpenKeyEx, RegQueryValueEx
void ReadReg()
{
//test1,读取MySubSubKey下的valItem1值
CString strSubkey= "MySubKey\\MySubSubKey";
HKEY hKey;
char szValue[100]={0};
if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, strSubkey, 0, KEY_QUERY_VALUE, &hKey ) )
{
DWORD dwType= REG_SZ;
unsigned long nSize= sizeof(szValue) - 1;
if( ERROR_SUCCESS == RegQueryValueEx( hKey, "valItem1", NULL, &dwType, (byte *)szValue, &nSize ) )
{
int a=0;
}
}
}
读写注册表要注意访问标志,常用的有:
1,可增加子键: KEY_CREATE_SUB_EY
2. 可增加键值项:KEY_SET_VALUE
3.可查询键值项:KEY_QUERY_VALUE
❻ 请问在C语言中能进行修改注册表功能吗
我用VC++写过,没有用C写过。
我想,HTML中夹带的javascript都能修改注册表,用C而且在本机运行,应当可以,问题是你要知道注册表文件的结构。
用VC++是捷径。VC++带有函数,专门用于修改注册表,你可以直接用:
RegOpenKeyEx -- 打开某个注册键
RegCreateKeyEx -- 建新键,若键已存在,则打开该键
RegCloseKey -- 关闭某键
RegSetValueEx -- 给某键设数据和值的类型
RegDeleteValue-- 删去某键数据
RegDeleteKey -- 删去某子键
❼ 如何用C语言获取windows注册表信息
不是网上的不对,而是你的编译器不对。
Win-TC和Dev-C++是不能访问注册表的。因为访问注册表需要调用 Windows API 函数。
目前,能够调用 Windows API 函数的C/C++编译器只有 Visual C++
❽ c语言如何修改注册表
include <stdio.h>
system ("cmd /c 命令行");
使用命令行修改注册表的方法:
开始-运行-cmd
键入reg /?
查看帮助.
比如
reg add "HKLM\Software" /v "abc" /t REG_SZ /d "def" /f的意思是在HKLM\Software项里增加值"abc"他的类型是"REG_SZ"数据是"def"并自动覆盖现有的值.
相应c语句是
system ("cmd /c reg add \"HKLM\\Software\" /v \"abc\" /t REG_SZ /d \"def\" /f");
❾ 如何用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");