[solved][C++ MFC] Update eksplorera po zmianie w rejestrze

0

Witam!

Na podstwaie artykułu http://4programmers.net/Delphi/Gotowce/Własne_rozszerzenie jak zarejestrować swoje rozszeżenie i iknonę w rejestrze windows, napisałem podobną aplikację, z tym że w C++ MFC. Wszystko działa jak należy, ale mam jeden problem, nad rozwiązaniem którego już wiele stron przeczytałem i nie znalazłem rozwiązania.

Chodzi o to, że ikona przypisana do mojego wymyślonego rozszerzenia zmienia się (tj. pojawia przy dodaniu do rejestru, bądz znika przy usunięciu) dopiero przy zamknięciu eksplorera z Menedżera zadań, lub ponownym uruchomieniu systemu. Program uruchamia się od razu, gdy chcę otworzyć plik z moim rozszerzeniem, jeżeli jest zarejestrowany, ale sama ikona się nie pojawia.

Oto mój kod źródłowy:

void CSzyfrDlg::OnBnClickedCheck4()
{ 
	HKEY klucz;
	LONG wynik;
	CString rozszerzenie = ".gis";

	if(IsDlgButtonChecked(IDC_CHECK4))
	{
		wynik = RegCreateKey(HKEY_CLASSES_ROOT, rozszerzenie, &klucz);
		if (wynik != ERROR_SUCCESS)
		{
			AfxMessageBox("Błąd przy tworzeniu wpisu do rejestru",MB_ICONERROR|MB_OK);
			return;
		}
		else
		{
			wynik = RegSetValue(HKEY_CLASSES_ROOT, rozszerzenie, REG_SZ, "Plik programu Szyfr",1);
			if (wynik != ERROR_SUCCESS)
			{
				AfxMessageBox("Błąd przy tworzeniu wpisu do rejestru",MB_ICONERROR|MB_OK);
				return;
			}
			else
			{
				wynik = RegCreateKey(HKEY_CLASSES_ROOT, rozszerzenie+"\\DefaultIcon", &klucz);
				if (wynik != ERROR_SUCCESS)
				{
					AfxMessageBox("Błąd przy tworzeniu wpisu do rejestru",MB_ICONERROR|MB_OK);
					return;
				}
				else
				{
					wynik = RegSetValue(HKEY_CLASSES_ROOT, rozszerzenie+"\\DefaultIcon", REG_SZ, "%SystemRoot%\\system32\\SHELL32.dll,47",1);
					if (wynik != ERROR_SUCCESS)
					{
						AfxMessageBox("Błąd przy tworzeniu wpisu do rejestru",MB_ICONERROR|MB_OK);
						return;
					}
					else
					{
						wynik = RegSetValue(HKEY_CLASSES_ROOT, rozszerzenie+"\\shell\\open", REG_SZ, "&Otwórz",1);
						if (wynik != ERROR_SUCCESS)
						{
							AfxMessageBox("Błąd przy tworzeniu wpisu do rejestru",MB_ICONERROR|MB_OK);
							return;
						}
						else
						{
							wynik = RegSetValue(HKEY_CLASSES_ROOT, rozszerzenie+"\\shell\\open\\command", REG_SZ, plikProgramu + " %1",1);
							if (wynik != ERROR_SUCCESS)
							{
								AfxMessageBox("Błąd przy tworzeniu wpisu do rejestru",MB_ICONERROR|MB_OK);
								return;
							}
						}
					}
				}
			}
		}
	}
	else
	{
		wynik = RegDeleteKey(HKEY_CLASSES_ROOT, rozszerzenie+"\\DefaultIcon");
		if (wynik != ERROR_SUCCESS) 
		{
			AfxMessageBox("Błąd przy usuwaniu wpisu z rejestru",MB_ICONERROR|MB_OK);
			return;
		}
		else
		{
			wynik = RegDeleteKey(HKEY_CLASSES_ROOT, rozszerzenie+"\\shell\\open\\command");
			if (wynik != ERROR_SUCCESS) 
			{
				AfxMessageBox("Błąd przy usuwaniu wpisu z rejestru",MB_ICONERROR|MB_OK);
				return;
			}
			else
			{
				wynik = RegDeleteKey(HKEY_CLASSES_ROOT, rozszerzenie+"\\shell\\open");
				if (wynik != ERROR_SUCCESS) 
				{
					AfxMessageBox("Błąd przy usuwaniu wpisu z rejestru",MB_ICONERROR|MB_OK);
					return;
				}
				else
				{
					wynik = RegDeleteKey(HKEY_CLASSES_ROOT, rozszerzenie+"\\shell");
					if (wynik != ERROR_SUCCESS) 
					{
						AfxMessageBox("Błąd przy usuwaniu wpisu z rejestru",MB_ICONERROR|MB_OK);
						return;
					}
					else
					{
						wynik = RegDeleteKey(HKEY_CLASSES_ROOT, rozszerzenie);
						if (wynik != ERROR_SUCCESS) 
						{
							AfxMessageBox("Błąd przy usuwaniu wpisu z rejestru",MB_ICONERROR|MB_OK);
							return;
						}
					}
				}
			}
		}
	}
}
0

Ale w czym problem ? Przecież musisz zresetować explorer'a, tak to działa.

0

W tym problem, że wiele programów również ort! swoje typy plików, ale nie potrzebują restartować eksplorere,żeby zmiany były widoczne. Jak to robią?

0

Sorki, nie doczytałem, myślałem że chodzi o rozszerzenie powłoki.

Wywołaj:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)
0

Dzięki wielkie! O to właśnie chodziło!

1 użytkowników online, w tym zalogowanych: 0, gości: 1