❶ 用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");