2012-10-18 45 views
2

可能重复:
How to compare stringsC++中的char阅读注册表字符串值*


我要比较注册表字符串值,如果它们是相同的消息框出现
目前我正在使用这个功能,它会正确返回值,但每当我想比较它们时,比较结果总是错的

char* GetRegistry(char* StringName) 
{ 
DWORD dwType = REG_SZ; 
HKEY hKey = 0; 
char value[1024]; 
DWORD value_length = 1024; 
const char* subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\MCI\\Player"; 
RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey); 
RegQueryValueEx(hKey, StringName, NULL, &dwType, (LPBYTE)&value, &value_length); 
return value; 
} 


我用这个来比较它们

if (GetRegistry("First") == GetRegistry("Second")) 
{ 
MessageBox(NULL,":|",":|",1); 
} 


但在MessageBox显示值怎么过不同


任何帮助表示赞赏。

+3

[如何在C++比较字符串(http://stackoverflow.com/questions/ 6222583 /如何比较字符串) –

+1

要准确,你甚至没有'SZ_STRING',所以为什么要把它放在标题上。 –

+0

我想写REG_SZ,但无意中我写了SZ_STRING – Shahriyar

回答

5

通过使用std::string,比较行为将按照您的预期进行。此外,这将修复函数返回一个指向本地缓冲区的指针的另一个bug。

std::string GetRegistry(const char* StringName) 
{ 
.... 
return std::string(value); 
} 
+0

谢谢,但林使用它在一个win32 DLL中,当我想使用你的代码它告诉我“命名空间标准没有成员字符串” – Shahriyar

+0

@Shahriyar:你有没有'#包括'? – Andrey

+0

谢谢你,现在我做了,我要再次测试函数 – Shahriyar

3

GetRegistry()返回char*,所以你实际上是比较指针operator==。 您应该使用strcmp()来执行原始类似C的char*字符串比较,或者更好地使用强健的C++字符串类,如CStringstd::[w]string

下面是使用功能的可能重写ATL的CString

#include <atlbase.h> 
#include <atlstr.h> 

CString GetRegistry(LPCTSTR pszValueName) 
{ 
    // Try open registry key 
    HKEY hKey = NULL; 
    LPCTSTR pszSubkey = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\MCI Extensions"); 
    if (RegOpenKey(HKEY_LOCAL_MACHINE, pszSubkey, &hKey) != ERROR_SUCCESS) 
    { 
     // Error: 
     // throw an exception or something... 
     // 
     // (In production code a custom C++ exception 
     // derived from std::runtime_error could be used) 
     AtlThrowLastWin32(); 
    } 

    // Buffer to store string read from registry 
    TCHAR szValue[1024]; 
    DWORD cbValueLength = sizeof(szValue); 

    // Query string value 
    if (RegQueryValueEx(
      hKey, 
      pszValueName, 
      NULL, 
      NULL, 
      reinterpret_cast<LPBYTE>(&szValue), 
      &cbValueLength) 
     != ERROR_SUCCESS) 
    { 
     // Error 
     // throw an exception or something... 
     AtlThrowLastWin32(); 
    } 

    // Create a CString from the value buffer 
    return CString(szValue); 
} 

然后你就可以这样调用:

if (GetRegistry(_T("First")) == GetRegistry(_T("Second"))) 
    ... 

注意,该代码将同时在ANSI/MBCS编译和Unicode版本(它基于Win32 TCHAR模型)。

+0

无法打开源文件“atlstr.h” 无法打开源文件“atlbase.h” 我应该下载什么东西? – Shahriyar

+0

@Shahriyar:你需要ATL。如果您使用Visual Studio的某个商业版本,则可以。但ATL在免费的Express版本上不可用。 (但是,您似乎可以下载WDK并从中获取ATL标头:请参阅[适用于Windows的Google Chrome构建指导](http://www.chromium.org/developers/how-tos/build-instructions-windows) ,其中有关于使用Visual C++ 2012 Express的一节。) –

+0

非常感谢,我的问题解决了 – Shahriyar

0

这个源代码有几个问题。

首先,你有一个局部变量函数,一个变量在栈上,它返回变量的地址,但函数返回时,变量消失,地址不再有效。

接下来的问题是您没有比较字符串。相反,您要比较函数返回的地址,如果您幸运,地址可能相同。既然你连续两次调用这个函数,你很幸运,所以地址是一样的。 (1)在函数中创建两个本地字符串,它们调用函数GetRegistry();(2)修改GetRegistry()函数,以便它使用这些缓冲区而不是它自己的缓冲区。因此,代码会看起来像:

char registryEntryOne[1024]; 
char registryEntryTwo[1024]; 
DWORD dwRegistryEntryOneLen; 
DWORD dwRegistryEntryTwoLen; 

registryEntryOne[0] = 0; // init the registry entry to zero length string 
registryEntryTwo[0] = 0; 

dwRegistryEntryOneLen = sizeof(registryEntryOne); 
GetRegistry ("First", registryEntryOne, &dwRegistryEntryOneLen); 
dwRegistryEntryTwoLen = sizeof(registryEntryTwo); 
GetRegistry ("Second", registryEntryTwo, &dwRegistryEntryTwoLen); 

// two strings are equal if: 
// the lengths are the same 
// at least one of the lengths is non-zero 
// the bytes are the same in the same order 
if (dwRegistryEntryOneLen && dwRegistryEntryOneLen == dwRegistryEntryTwoLen && memcmp (registryEntryOne, registryEntryTwo, dwRegistryEntryOneLen) == 0) { 
    // strings are equal 
} else { 
    // strings are not equal 
} 

的GetRegistry()函数看起来是这样的:

char* GetRegistry(char* StringName, char *valueBuffer, DWORD *value_length) 
{ 
    DWORD dwType = REG_SZ; 
    HKEY hKey = 0; 
    const char* subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\MCI\\Player"; 

    RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey); 
    RegQueryValueEx(hKey, StringName, NULL, &dwType, (LPBYTE)valueBuffer, value_length); 
    return valueBuffer; 
} 
+0

这个功能给我一些错误 – Shahriyar