Dateinamenserweiterung registrieren

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

Ich habe für mein Programm die Standard-Dateierweiterung geändert. Jetzt möchte ich die neue Erweiterung beim Starten des Programmes automatisch diesem zuordnen, also derart, daß beim Doppelklick auf eine Datei mit dieser Endung sich mein Programm mit der Datei öffnet.
Was muß ich also wo in die Registry eintragen, um das zu bewerkstelligen? Im MSDN habe ich dazu leider nichts erschöpfendes gefunden.

Für sachdienliche Hinweise bin ich wie immer sehr dankbar! :)
 
Aus dem Fundus meiner hässlichen, aber funktionierenden Codebasis:

Code:
bool CRegistryHelper::SetKey( HKEY hKeyMain, const TCHAR* szBranch, const TCHAR* szKey, const TCHAR* szValue )
{

  HKEY          hkeySub;

  unsigned long dwSize;


  if ( RegOpenKeyEx( hKeyMain, szBranch, 0, KEY_SET_VALUE, &hkeySub ) != ERROR_SUCCESS )
  {
    if ( RegCreateKeyEx( hKeyMain, szBranch, 0, _T( "" ), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_SET_VALUE, NULL, &hkeySub, &dwSize ) != ERROR_SUCCESS )
    {
      return false;
    }
  }
  dwSize = 512;
#ifdef UNICODE
  if ( RegSetValueEx( hkeySub, szKey, 0, REG_MULTI_SZ, (BYTE*)szValue, (unsigned long)2 * String::Length( szValue ) + 2 ) != ERROR_SUCCESS )
#else
  if ( RegSetValueEx( hkeySub, szKey, 0, REG_SZ, (BYTE*)szValue, (unsigned long)String::Length( szValue ) ) != ERROR_SUCCESS )
#endif
  {
    RegCloseKey( hkeySub );
    return false;
  }

  RegCloseKey( hkeySub );

  return true;

}


void CRegistryHelper::RegisterFileType( const TCHAR* szExtension, const TCHAR* szAppDescription, 
                                        const TCHAR* szIconPath, const TCHAR* szOpenCommand )
{

  TCHAR      szDesc[MAX_PATH];
  wsprintf( szDesc, _T( "%s.Document" ), szAppDescription );
  SetKey( HKEY_CLASSES_ROOT, szExtension, NULL, szDesc );

  SetKey( HKEY_CLASSES_ROOT, szDesc, NULL, szAppDescription );

  wsprintf( szDesc, _T( "%s.Document\\DefaultIcon" ), szAppDescription );
  SetKey( HKEY_CLASSES_ROOT, szDesc, NULL, szIconPath );

  wsprintf( szDesc, _T( "%s.Document\\shell\\open\\command" ), szAppDescription );
  SetKey( HKEY_CLASSES_ROOT, szDesc, NULL, szOpenCommand );

}

Die String::Length-Funktion müsste leicht zu ersetzen sein.

Und weil heute so ein schönes Wetter ist, hier ein Beispielaufruf:


Code:
TCHAR    szDummy[MAX_PATH];
GetModuleFileName( NULL, szDummy, MAX_PATH );
std::string   strKey = szDummy;
strKey += _T( " \"%1\"" );

CRegistryHelper::RegisterFileType( _T( ".igf" ), _T( "Painter Image" ), szDummy, strKey.c_str() );
 
Danke Endurion!

Das meiste hatte ich inzwischen schon herausgefunden und bin gerade dabei, es zu implementieren und testen. Aber es ist schön, so die Bestätigung dafür zu bekommen, daß es so auch funktioniert. Ich war mir noch nicht ganz sicher, ob es da nicht noch mehr Schlüssel gibt, die damit zu tun haben.

Nur das mit dem DefaultIcon kannte ich noch nicht. Muß da ein Pfad zur .exe angegeben werden oder auch eine Icon-Nummer? Und wenn ja, wie? Ich habe schon ein Icon für die Dateien in den Applikations-Ressourcen.
 
Alles klar, es ist der Pfad zur exe, ohne Anführungszeichen und danach, durch ein Komma getrennt, der Index des anzuzeigenden Icons.
 
Zurück