[英]Create a new windows registry key using c++
我正在嘗試使用C ++在Windows注冊表中創建一個新的注冊表項。 這是我到目前為止的代碼:
HKEY hKey;
LPCTSTR sk = TEXT("SOFTWARE\\OtherTestSoftware");
LONG openRes = RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
sk,
0,
NULL,
REG_OPTION_BACKUP_RESTORE,
KEY_ALL_ACCESS,
NULL,
&hKey,
NULL);
if (openRes==ERROR_SUCCESS) {
printf("Success creating key.");
} else {
printf("Error creating key.");
}
LPCTSTR value = TEXT("OtherTestSoftwareKey");
LPCTSTR data = "OtherTestData\0";
LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1);
if (setRes == ERROR_SUCCESS) {
printf("Success writing to Registry.");
} else {
printf("Error writing to Registry.");
}
//RegDeleteKey(hKey, sk);
LONG closeOut = RegCloseKey(hKey);
if (closeOut == ERROR_SUCCESS) {
printf("Success closing key.");
} else {
printf("Error closing key.");
}
我能夠使用非常相似的代碼片段成功打開現有密鑰(基本上用RegOpenKeyEx替換RegCreateKeyEx)。 我會想象我傳遞給RegCreateKeyEx的一個或多個參數導致了麻煩。 我真的不確定哪些事情可能會被搞砸,因為我所困的所有錯誤代碼都顯示成功。 作為參考,這是RegCreateKeyEx的函數簽名:
/*
* LONG WINAPI RegCreateKeyEx(
__in HKEY hKey,
__in LPCTSTR lpSubKey,
__reserved DWORD Reserved,
__in_opt LPTSTR lpClass,
__in DWORD dwOptions,
__in REGSAM samDesired,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__out PHKEY phkResult,
__out_opt LPDWORD lpdwDisposition
);
*/
任何想法都會很棒!
謝謝,布賴恩
我多年來一直在編寫自己的個人函數庫。 其中一部分完全涉及注冊表訪問,請參閱Registry.Cpp文件的CreateRegistryKey函數。
如前所述,您所指定的REG_OPTION_BACKUP_RESTORE
在調用選項RegCreateKeyEx
,這意味着你為了執行備份或還原打開鍵。 通常,您將使用REG_OPTION_NON_VOLATILE
。
你在運行什么操作系統? 在Windows 2000 / XP中, HKEY_LOCAL_MACHINE
注冊表配置單元不能由非管理員用戶寫入,因此RegCreateKeyEx
將失敗並顯示拒絕訪問錯誤(錯誤5)。 如果您的應用程序在其清單中有requestedExecutionLevel
條目,這也適用於Vista。 如果您正在運行Vista,並且您的應用程序未指定requestedExecutionLevel
(或者它根本沒有清單),則對HKEY_LOCAL_MACHINE
訪問將被虛擬化,因此RegCreateKeyEx
應該成功。 有關詳細信息,請參閱MSDN 中Windows Vista中的注冊表虛擬化 。
您發布的代碼存在一些問題,只有在使用UNICODE
定義編譯項目時才會出現問題。 這一行:
LPCTSTR data = "OtherTestData\0";
應該
LPCTSTR data = TEXT("OtherTestData\0");
這一行:
LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ,
(LPBYTE)data, _tcslen(data)+1);
應該:
LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ,
(LPBYTE)data, (_tcslen(data)+1) * sizeof(TCHAR));
因為cbData
在參數RegSetValueEx
是數據的以字節為單位,而不是以字符的長度。
我希望這有幫助!
第一個線索是您使用REG_OPTION_BACKUP_RESTORE
。 您可能不想使用該標志,因為我認為它需要一個特殊的“備份”權限,您需要事先啟用它。 普通應用程序不希望這樣做。
這些鏈接可能會有所幫助。
http://www.codeguru.com/forum/archive/index.php/t-378884.html
http://www.codeguru.com/forum/archive/index.php/t-275250.html
作為旁注,請始終嘗試使用GetLastError()來獲取錯誤消息。
我沒有測試過他們中的任何一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.