2013-02-26 60 views
5

मैं रजिस्ट्री के "(डिफ़ॉल्ट)" पढ़ने के लिए कोशिश कर रहा हूँ ग में विंडोज 7 में ++ मूल्यों, और निम्नलिखित कोड मैं का उपयोग कर रहा है:पढ़ना रजिस्ट्री विंडोज 7 में अजीब तरीके से व्यवहार

string GetSZValueUnique(HKEY openKey, const char* regkey, const char* keyName) 
{ 
    HKEY hKey = 0; 
    BYTE data[512] ; 
    DWORD szsize = 512 ; 
    string value ; 

    LONG retValue = RegOpenKeyEx(openKey, regkey, 0, KEY_READ, &hKey) ; 

    if (retValue == ERROR_SUCCESS) 
    { 
     LONG retV = RegQueryValueEx(hKey, keyName, 0, 0, data, &szsize) ; 
     if (retV == ERROR_SUCCESS) 
     { 
      char* _value = reinterpret_cast<char*>(data) ; 
      value = _value ; 

      RegCloseKey (hKey) ; 
      return value ; 
     } 
     else 
     { 
      char msg[512] ; 
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,(DWORD)retV,0,&msg[0],512,0) ; 
      error_string = &msg[0]; 
      MessageBox(0, error_string.c_str(), "Query : GetSZValueUnique", 0); 
     } 
    } 
    else 
    { 
     char msg[512] ; 
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,(DWORD)retV,0,&msg[0],512,0) ; 
     error_string = &msg[0]; 
     MessageBox(0, error_string.c_str(), "Open : GetSZValueUnique", 0); 
    } 

    RegCloseKey (hKey) ; 
    return "" ; 
} 

और यह मैं कैसे है

string ts3 = GetSZValueUnique(HKEY_LOCAL_MACHINE, "SOFTWARE\\TeamSpeak 3 Client\\", ""); 
if (!ts3.empty()) 
    MessageBox(0, ts3.c_str(), "GetSZValueUnique", 0); 

कुछ कुंजी के लिए यह कुछ के लिए काम करता है यह नहीं है: उदाहरण के लिए, इसके लिए "एडोब", "TrendMicro", "चेकप्वाइंट", "RegisteredApplications" लेकिन के लिए नहीं काम करता है इसके बाद के संस्करण समारोह बोल रहा हूँ "7-ज़िप", "आरटीएलसेटअप", "सोनिक", "टीमस्पीक 3 क्लाइंट"

अब मैं विचारों से बाहर हूं, क्या कोई यह बता सकता है कि क्या गलत है?

संपादित करें: मैं के साथ कोड की जाँच कर ली "(डिफ़ॉल्ट)" मूल्यों और अन्य मूल्यों के रूप में अच्छी तरह से, चाबी के लिए अपनी यह कभी नहीं काम नहीं कर रहा अतीत * "अगर (retValue == ERROR_SUCCESS)" * की जाँच करें और मैं चला जाता है हमेशा "निर्दिष्ट फ़ाइल" त्रुटि नहीं मिलती है। कुंजियों के लिए यह काम कर रहा है, यह "* अगर (retValue == ERROR_SUCCESS) *" से पहले हो जाता है और यदि यह मौजूद है तो मान वापस लौटाता है, अगर यह मौजूद नहीं है तो यह केवल त्रुटि संदेश प्रदर्शित करता है "निर्दिष्ट फ़ाइल नहीं मिली"।

संपादित करें 2: मैं फिर से जांचा गया: और यह कुंजी इसके लिए काम करता है सॉफ्टवेयर के तहत "Wow6432Node" उपकुंजी में उनके समतुल्य क्लोन है ... हममम लगता ... इसलिए मैं यह कैसे काम कर मिलता है?

+0

आप किस व्यवहार का अनुभव कर रहे हैं? क्या आपने बाद की प्रविष्टियों के लिए कोई डेटा है तो मैन्युअल रूप से जांच की है? –

+3

सबसे पहले, आपका ऐप 64 बिट या 32 बिट है, दूसरा, क्या आपने अपने एल्गोरिदम में "काम करने" में एक अंतर देखा है जब आपका 32 बिट ऐप 32 बिट से जुड़े ऐप्स देखता है, या आपका 64 बिट ऐप 64 बिट से जुड़े ऐप्स देखता है, लेकिन जब आप दो चीजें जोड़ते हैं काम नहीं लग रहा है? यदि ऐसा है, तो Google [Wow6432Node] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072 (v = vs.85) .aspx)। – WhozCraig

+0

@ bash.d मूल प्रश्न को अपडेट किया गया। – StudentX

उत्तर

6

आप झंडा ::

  1. "KEY_WOW64_32KEY" "samDesired" RegOpenKeyEx के पैरामीटर में आप Wow6432Node कुंजी का उपयोग करना चाहते हैं निर्दिष्ट कर सकते हैं यानी, 32-बिट कुंजी से आपका ऐप
  2. "KEY_WOW64_64KEY" "samDesired" RegOpenKeyEx के पैरामीटर में आप सामान्य कुंजी का उपयोग करना चाहते हैं जैसे कि, 64-बिट कुंजी द्वारा आपके एप्लिकेशन से।

नोट :: उपयुक्त संदेह के साथ टिप्पणियों में @WhozCraig द्वारा आपका संदेह पहले से ही मंजूरी दे दी गई है। अगर वह जवाब देता है, तो मेरा जवाब स्वीकार करें।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^