このソース コードにはいくつかの問題があります。
まず第一に、スタック上の変数であるローカル変数を持つ関数があり、その変数のアドレスを返しますが、関数が戻ると、変数は消え、アドレスは無効になります。
次の問題は、文字列を比較していないことです。代わりに、関数によって返されたアドレスを比較しています。運が良ければ、アドレスは同じである可能性があります。関数を 2 回続けて呼び出しているため、幸運にもアドレスが同じになります。
次のことをお勧めします: (1) 関数を呼び出している関数内に 2 つのローカル文字列を作成し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;
}