b) klingt am vernünftigsten: Eine Extension registrieren. Das geht in etwa so (die typedefs und Funktion musst du da selber noch einsetzen)
Ab Vista gibt es da eine API für, für alles davor ist Handarbeit angesagt:
Code:void Registry::RegisterFileType( const GR::tChar* szExtension, const GR::tChar* szAppDescription, const GR::tChar* szIconPath, const GR::tChar* szOpenCommand ) { GR::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 ); } bool Registry::IsFileTypeRegisteredTo( const GR::tChar* szExtension, const GR::tChar* szAppDescription ) { GR::tChar szDesc[MAX_PATH], szTemp[MAX_PATH]; wsprintf( szDesc, _T( "%s.Document" ), szAppDescription ); GetKey( HKEY_CLASSES_ROOT, szExtension, _T( "" ), szTemp ); if ( _tcsicmp( szTemp, szDesc ) == 0 ) { return true; } return false; } void Registry::UnregisterFileType( const GR::tChar* szExtension, const GR::tChar* szAppDescription ) { if ( !IsFileTypeRegisteredTo( szExtension, szAppDescription ) ) { return; } DeleteBranch( HKEY_CLASSES_ROOT, szExtension ); }
Ein Aufruf sieht dann so aus:
Code:// den Pfad zur eigenen EXE heraussuchen GR::tChar szDummy[MAX_PATH]; GetModuleFileName( NULL, szDummy, MAX_PATH ); GR::tString strKey = szDummy; // Dateinamen als Aufrufparameter mitgeben strKey += _T( " \"%1\"" ); // registrieren Registry::RegisterFileType( _T( ".igf" ), _T( "Painter Image" ), szDummy, strKey.c_str() ); // deregistrieren Registry::UnregisterFileType( _T( ".igf" ), _T( "Painter Image" ) );
Das wäre genau das!