2009-02-03 6 views
12

का उपयोग कर एक नई विंडोज रजिस्ट्री कुंजी बनाएं I C++ का उपयोग कर विंडोज रजिस्ट्री में एक नई रजिस्ट्री कुंजी बनाने की कोशिश कर रहा हूं।सी ++

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 में गुजरने वाले एक या अधिक तर्कों में समस्या आ रही है। मैं ईमानदारी से यह सुनिश्चित नहीं कर रहा हूं कि चीजें कहाँ हो रही हैं क्योंकि मैंने जो त्रुटि कोड फंस गए हैं, वे सफलता दिखाते हैं।

/* 
* 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 
    ); 
*/ 

किसी भी विचार बहुत अच्छा होगा: संदर्भ के लिए, RegCreateKeyEx के लिए समारोह हस्ताक्षर है!

धन्यवाद, ब्रायन

+0

आपकी त्रुटि वास्तव में कहां होती है (मुझे RegCreateKeyEx() कॉल पर लगता है, लेकिन हमें अनुमान लगाने की आवश्यकता नहीं है), और GetLastError() वापस क्या करता है? –

+0

क्या आप अभी जिस कुंजी को बनाया है उसे हटाने का प्रयास करना चाहते हैं? –

+1

REG_OPTION_BACKUP_RESTORE के बजाय आपको REG_OPTION_NON_VOLATILE (= 0) पास करना होगा। आप एमएसडीएन http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx – Ismael

उत्तर

1

पहले सुराग REG_OPTION_BACKUP_RESTORE के आपके उपयोग है। आप शायद उस ध्वज का उपयोग नहीं करना चाहते हैं, क्योंकि मुझे लगता है कि इसे एक विशेष "बैकअप" विशेषाधिकार की आवश्यकता है जिसे आपको पहले से सक्षम करने की आवश्यकता है। सामान्य अनुप्रयोग ऐसा नहीं करना चाहते हैं।

+0

हां; न केवल आपको विशेषाधिकार की आवश्यकता है, बल्कि आपको इसे सुरक्षा API कॉल के माध्यम से स्पष्ट रूप से सक्षम करने की आवश्यकता है; जब तक कि आप पहले से ही नहीं जानते थे, आप शायद इसका उपयोग नहीं करना चाहते हैं। :) – Nick

+0

REG_OPTION_NON_VOLATILE में बदल गया, ऐसा लगता है कि इसे ठीक नहीं किया गया है। –

2

जैसा कि पहले से ही उल्लेख किया गया है, आपने विकल्प को RegCreateKeyEx पर कॉल में निर्दिष्ट किया है, जिसका अर्थ है कि आप बैकअप या पुनर्स्थापित करने के लिए कुंजी खोल रहे हैं। आमतौर पर, आप इसके बजाय REG_OPTION_NON_VOLATILE का उपयोग करेंगे।

आप किस ऑपरेटिंग सिस्टम को चल रहे हैं? विंडोज 2000/एक्सपी में, HKEY_LOCAL_MACHINE रजिस्ट्री हाइव गैर-प्रशासक उपयोगकर्ताओं द्वारा लिखित नहीं है, इसलिए RegCreateKeyEx किसी एक्सेस अस्वीकृत त्रुटि (त्रुटि 5) में विफल हो जाएगा। यह Vista पर भी लागू होता है, यदि आपके एप्लिकेशन में इसके मेनिफेस्ट में requestedExecutionLevel प्रविष्टि है। यदि आप Vista चला रहे हैं, और आपका एप्लिकेशन requestedExecutionLevel निर्दिष्ट नहीं करता है (या यदि इसमें कोई मैनिफेस्ट नहीं है), HKEY_LOCAL_MACHINE तक पहुंच वर्चुअलाइज्ड होगी, इसलिए RegCreateKeyEx सफल होना चाहिए। अधिक जानकारी के लिए एमएसडीएन में Registry Virtualization in 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)); 

क्योंकि RegSetValueEx में cbData पैरामीटर leng है बाइट्स में डेटा का वें, वर्ण नहीं।

मुझे आशा है कि इससे मदद मिलती है!

+0

मैंने आपके परिवर्तनों को एक अपवाद के साथ बनाया है: (_tcslen (डेटा) +1) * sizeof (TCHAR) बदल गया है (स्ट्रेलन (डेटा) +1) * sizeof (TCHAR) क्योंकि यह पहली बार संकलित नहीं करेगा। दोबारा, कोई त्रुटि कोड वापस नहीं आया, बस वह नहीं करता जो मैं उम्मीद करता हूं। हालांकि संकेतों के लिए धन्यवाद, ऐसा लगता है जैसे मैं करीब आ रहा हूं! –

+0

_tcslen() का उपयोग करने के लिए # शामिल जोड़ें। – ChrisN

+0

यदि यूनिकोड सक्षम किया गया था, तो मुझे नहीं लगता कि 'LPCTSTR डेटा = "" संकलित होगा। –

13

मैं वर्षों से अपनी व्यक्तिगत फंक्शन लाइब्रेरी संकलित कर रहा हूं। इस का एक हिस्सा पूरी तरह से रजिस्ट्री एक्सेस के साथ सौदा करता है, CreateRegistryKey Registry.Cpp फ़ाइल को फ़ंक्शन देखें।

यदि आपकी रुचि है, तो आप entire library here को पकड़ सकते हैं।

+1

मैं वास्तव में इसके साथ एक झटका ले रहा हूँ - बहुत दोस्ताना धन्यवाद लगता है! –

+1

Registry.cpp लिंक टूटा हुआ है, इसके बजाय प्रयास करें: http://svn.networkdls.com/svn/OpenSource/@Libraries/NSWFL/NSWFL_Registry.Cpp –

+0

IsWinNT –

0

शायद यह आपके कोड के साथ reason why you can cannot create a new key है।

ये लिंक मदद की जा सकती हैं।

http://www.codeguru.com/forum/archive/index.php/t-378884.html
http://www.codeguru.com/forum/archive/index.php/t-275250.html

एक sidenote के रूप, हमेशा त्रुटि संदेश प्राप्त करने के लिए GetLastError() की कोशिश करो।

मैंने उनमें से किसी का परीक्षण नहीं किया है।