सिस्टम: Windows 7 32 बिट
भाषा: - कोई समस्या नहीं सी ++रजिस्ट्री कुंजी से पढ़ने का प्रयास करते समय RegQueryValueEx() फ़ंक्शन ERROR_FILE_NOT_FOUND क्यों लौटाता है?
मैं कुंजी Driver
(प्रकार REG_SZ
) रजिस्टर HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0
का उपयोग करने की कोशिश की है।
HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM
से पढ़ने के लिए, सभी कुंजी (प्रकार REG_SZ
) स्लैश हो गए, उदाहरण के लिए \Device\Serial0
।
हालांकि ऐसे कुंजी यह हमेशा 2 (ऐसी कोई फाइल नहीं) देता है निम्न उदाहरण कोड के साथ पढ़ने:
HKEY hKey = 0;
DWORD dwType = REG_SZ;
char buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
auto ret = RegQueryValueEx(hKey, TEXT("\Device\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize);
// ret always == 2 for key with slashes
--- CUT ---
नाम पर स्लैश के साथ कुंजी मान को पढ़ने के लिए उचित तरीका क्या है?
ऊपर कोडी ग्रे द्वारा उचित उत्तर दिया गया है।
एक और मुद्दा नीचे ।
इम जब चर का उपयोग कर किसी पाठ स्ट्रिंग के बजाय मैं एक ही समस्या हो रही है।
चतुर्थ माना दोनों सिंगल और डबल स्लैश के साथ दृष्टिकोण:
HKEY hKey = 0;
DWORD keyType = REG_SZ;
TCHAR buf[255] = {0};
DWORD bufSize = sizeof(buf);
QSettings winReg("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat);
auto comsKey = winReg.allKeys();
FOREACH(auto com, comsKey)
{
// FOREACH - boost macro
// comsKey = QList<QString> (list of key names) [from Qt framework]
// com = QString (single key name) [from Qt framework]
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
wchar_t* keyw = new wchar_t();
//com.replace("/", "\\\\"); <- checked both variants commented and not commented; com == /Device/Serial0 so im converting to \\Device\\Serial0
int size = com.size();
mbstowcs(keyw, com.toStdString().data(), size);
//auto ret = RegQueryValueEx(hKey, TEXT("\\Device\\Serial0"), 0, &keyType, (LPBYTE)buf, &bufSize); // <- this works!
auto ret = RegQueryValueExW(hKey, (LPCWSTR)&keyw, 0, &keyType, (LPBYTE)buf, &bufSize); // <- this one not works!
मैं के साथ सभी वेरिएंट की कोशिश की है "\ डिवाइस .." "/ डिवाइस", "\ डिवाइस", आदि
पाठ ("\\ डिवाइस \\ Serial0")? –
@ वर्नर, नहीं, 'RegQueryValueEx' फ़ंक्शन * केवल * रजिस्ट्री कुंजी के मान से पूछताछ करता है। मूल्य कुंजी के भीतर संग्रहीत नाम/डेटा जोड़े हैं। इसलिए जब आप वर्णन करते हैं तो आप इसे चाबियों का घोंसला पथ नहीं पारित कर सकते हैं क्योंकि मानों में पथ नहीं होते हैं। माना जाता है कि शब्दावली काफी उलझन में है, रेमंड चेन ने इसे समझाने का प्रयास किया [यहां] (http://blogs.msdn.com/b/oldnewthing/archive/2009/02/04/9394113.aspx)। –