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;
}
}
}
}
}
}
}