2

可能重复:
如何比较字符串


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

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 怎么出现 值是不同的


任何帮助表示赞赏。

4

3 回答 3

5

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

std::string GetRegistry(const char* StringName)
{
....
return std::string(value);
}
于 2012-10-18T12:51:01.723 回答
4

GetRegistry()返回 a 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 版本中编译(它基于 Win32TCHAR模型)。

于 2012-10-18T12:48:12.740 回答
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;
}
于 2012-10-18T13:04:34.207 回答