Premnath Mali Ответов: 2

Как создать, сохранить и извлечь значение DWORD в реестр с помощью mfc


У меня есть один флажок и две командные кнопки set и get

Я хочу создать новый ключ в реестре т. е. MyRegDemo

затем при нажатии кнопки set я хочу создать значение DWORD в этом ключе и сохранить его либо 0 либо 1

и при нажатии кнопки get я хочу получить значение DWORD из реестра и установить флажок
зарегистрированный или незарегистрированный соответственно

а также предложите мне для 0 и 1 значения DWORD лучше или нет. На самом деле мой главный мотив-сохранить состояние флажка при закрытии приложения и получить состояние при открытии приложения, если есть какие-либо предложения по этому поводу, пожалуйста, скажите это также. Но сначала я хочу решить эту проблему.

Спасибо!!!

Что я уже пробовал:

void CRegistryDemoDlg::OnBnClickedSet()
{
	// TODO: Add your control notification handler code here
	CRegKey reg;

	HKEY m_hKeyParent=HKEY_CURRENT_USER;

	LPCTSTR m_myKey=L"\\Software\\MyRegDemo";

	reg.Create(m_hKeyParent,m_myKey);

	if(reg.Open(m_hKeyParent,m_myKey)==ERROR_SUCCESS)
	{
		DWORD data=1;
		reg.SetDWORDValue(L"Test",data);
		reg.Close();
	}
}

void CRegistryDemoDlg::OnBnClickedGet()
{
	// TODO: Add your control notification handler code here
	CRegKey reg;
	HKEY m_hkeyParent=HKEY_CURRENT_USER;
	LPCTSTR m_myKey=L"\\Software\\MyRegDemo";
	DWORD dvalue;
	if(reg.Open(m_hkeyParent,m_myKey)==ERROR_SUCCESS)
	{
		reg.QueryDWORDValue(L"Test",dvalue);
		reg.Close();
	}
	if(dvalue==1)
		m_chkbox1.SetCheck(true);
	else
		m_chkbox1.SetCheck(false);
}

2 Ответов

Рейтинг:
5

Premnath Mali

void CRegistryDemoDlg::OnBnClickedSet()
{
	// TODO: Add your control notification handler code here
	CRegKey reg;

	HKEY m_hKeyParent=HKEY_CURRENT_USER;

//Here I Was wrong while giving path
	LPCTSTR m_myKey=L"Software\\MyRegDemo";

	reg.Create(m_hKeyParent,m_myKey);

	if(reg.Open(m_hKeyParent,m_myKey)==ERROR_SUCCESS)
	{
		DWORD data=1;
		reg.SetDWORDValue(L"Test",data);
		reg.Close();
	}
}

void CRegistryDemoDlg::OnBnClickedGet()
{
	// TODO: Add your control notification handler code here
	CRegKey reg;
	HKEY m_hkeyParent=HKEY_CURRENT_USER;

//Here I Was wrong while giving path
	LPCTSTR m_myKey=L"Software\\MyRegDemo";
	DWORD dvalue;
	if(reg.Open(m_hkeyParent,m_myKey)==ERROR_SUCCESS)
	{
		reg.QueryDWORDValue(L"Test",dvalue);
		reg.Close();
	}
	if(dvalue==1)
		m_chkbox1.SetCheck(true);
	else
		m_chkbox1.SetCheck(false);
}


Рейтинг:
16

Jochen Arndt

Было бы хорошо знать, что не работает.

Сначала прочтите документацию по используемым функциям.

Затем проверьте возвращаемое значение каждого вызова функции и сообщите код ошибки (по крайней мере, в отладочных сборках, которые будут обнаружены во время разработки):

LONG err = reg.Create(m_hKeyParent,m_myKey);
if (ERROR_SUCCESS != err)
{
    // Report error here
}


Я не тестировал код, но предполагаю, что это происходит с ошибкой недопустимого дескриптора. Видеть CRegKey:: Create[^]. Этот hKeyParent параметр должен быть дескриптором открывать ключ.

Но нет никакой необходимости создавать ключ. Просто использовать Open() потому что он создаст ключ, если он еще не существует:
// Open key (creates it if it does not exist yet)
LONG err = reg.Open(HKEY_CURRENT_USER, L"Software\\MyRegDemo");
if (ERROR_SUCCESS != err)
{
    // Report error here
}
else
{
    reg.Close();
}


При чтении логического значения, хранящегося в DWORD, нулевое значение должно интерпретироваться как FALSE и как TRUE. Обычно пишут "1" для TRUE но некоторые записывают также Значение со всеми установленными битами.

Поэтому при чтении таких значений всегда следует проверять наличие нуля / ненулевого значения:
DWORD dvalue = 0; // Default
// ...
m_chkbox1.SetCheck(dvalue != 0);

Обратите внимание, что я инициализировал dvalue в приведенном выше примере. Хотя это должно быть сделано всегда, здесь важно, когда ваша программа выполняется в первый раз, потому что значение еще не существует (оно создается при выходе из вашей программы).


Premnath Mali

Я допустил опечатку при создании ключа я использовал L "\ \ Software\ \ MyRegDemo "вместо L" Software\\MyRegDemo " если я удалил косые черты, то мой код также работает успешно, но другая информация также полезна для меня.

Спасибо за это!!!