Laden...

Dateiendung mit Programm verbinden

Erstellt von Maddinel vor 19 Jahren Letzter Beitrag vor 12 Jahren 11.749 Views
Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 19 Jahren
Dateiendung mit Programm verbinden

Hi,
wie kann ich am besten bei der Installation eine bestimmte Dateiendung mit meiner Anwendung verbinden? ALso das die Dateien beim Doppelklick mit meiner Anwendung geöffnet werden.

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 19 Jahren

Sorry ich habe nicht richtig geschaut und gerade diese Klasse im Forum gefunden:


using Microsoft.Win32;

namespace Abc
{
    /// <summary>
    /// Klasse zum Erstellen und Löschen von Dateiassoziationen.
    /// </summary>
    public class FileAssociation
    {
        private FileAssociation() {}

        /// <summary>
        /// Erstellt eine neue Dateiassoziation. Alte Assoziazionen werden überschrieben.
        /// </summary>
        /// <param name="keyName">Name des Programmschlüßels</param>
        /// <param name="applicationName">Name der Anwendung</param>
        /// <param name="applicationPath">Pfad zur Executable der Anwendung</param>
        /// <param name="extension">Dateierweiterung (ohne Punkt!)</param>
        /// <param name="extensionIcon">Optionales Icon für die Dateierweiterung</param>
        public static void CreateAssociation(string keyName, string applicationName, string applicationPath, string extension, string extensionIcon)
        {
            string keyValue        = null;
            RegistryKey key        = null;
            RegistryKey subKey    = null;

            keyValue = applicationName;

            key = Registry.ClassesRoot.CreateSubKey(keyName);
            key.SetValue("", applicationName);

            if (extensionIcon != null)
            {
                subKey = key.CreateSubKey("DefaultIcon");
                subKey.SetValue("", extensionIcon);
            }

            subKey = key.CreateSubKey("Shell");
            subKey = subKey.CreateSubKey("Open");
            subKey = subKey.CreateSubKey("command");
            subKey.SetValue("", applicationPath + " \"%1\"");

            subKey = Registry.ClassesRoot.CreateSubKey("." + extension);
            subKey.SetValue("", keyName);
        }

        /// <summary>
        /// Stellt fest, ob eine Dateiassoziation zur angegebenen Anwendung besteht.
        /// </summary>
        /// <param name="keyName">Name des Programmschlüßels</param>
        /// <param name="applicationName">Name der Anwendung</param>
        /// <param name="extension">Dateierweiterung (ohne Punkt!)</param>
        /// <returns>True, wenn bereits eine Assoziation besteht</returns>
        public static bool IsAssociated(string keyName, string applicationName, string extension)
        {
            try
            {
                RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName);
                if ((string) key.GetValue("") == applicationName)
                {
                    key.Close();
                    key = Registry.ClassesRoot.OpenSubKey("." + extension);
                    if ((string) key.GetValue("") == keyName)
                    {
                        return true;
                    }
                }

                return false;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Löscht eine Dateiassozaition. Achtung, es wird beim Löschen keine Rücksicht genommen, obs
        /// sich um eine Assoziation zum eigenen Programm handelt!
        /// </summary>
        /// <param name="keyName">Name des Programmschlüßels</param>
        /// <param name="extension">Dateierweiterung (ohne Punkt!)</param>
        /// <returns>True, wenn der Löschvorgang erfolgreich war.</returns>
        public static bool DeleteAssociation(string keyName, string extension)
        {
            try
            {
                Registry.ClassesRoot.DeleteSubKeyTree(keyName);
                Registry.ClassesRoot.DeleteSubKeyTree("." + extension);

                return true;
            }
            catch
            {
                return false;
            }
        }

    }
}

[EDIT=herbivore]Damit sichergestellt ist, dass alle Änderungen im Windows-Explorer sofort wirksam werden, muss die Win32-Funktion SHNotifyChange SHChangeNotify aufgerufen werden.[/EDIT]

Aber dazu meine Frage:
Wo muss ich das einbauen? Passiert sowas normalerweise nicht während des Setups? Wenn ja wie?

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

381 Beiträge seit 2004
vor 19 Jahren

Mach eine "User-Defined Aktion" und lasse dann diesen Code ablaufen. Wenn du mittels VS.NET 2003 des Setup erstellt kannst du eigene Programme hinzu fügen. Die einfachste Art ist du baust dir eine kleine Console Anwendung in welcher dein Code liegt. Dieser EXE führt dann dein Setup als Benutzerdefinierte Aktion aus und fertig ist deine Registrierung der Dateiendung.

Mit freundlichen Grüßen

René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect


.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/

Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 19 Jahren

Wie kann man eigene Programme einfügen?

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

381 Beiträge seit 2004
vor 19 Jahren

Im Projektmappen-Explorer deines Setup Projektes findest du oben verschiedene Icons. Das fünfte von Links ist der Button für die benutzerdefinierten Aktionen. Wenn du das klickst, dann bekommst du im Hauptfenster einen TreeView der wie folgt aufgebaut ist:

Benutzerdefinierte Aktionen

  • Installation
  • Commit ausführen
  • Rollback
  • Deinstallieren

Du machst einen Rechtsklick auf Installieren und fügst dort deine EXE ein. Die EXE wiederrum muss sich aber schon in deinem Setup befindet. Hinzufügen kannst du diese über den Dateisystem-Editor. Gehe dazu in den Projektmappen-Explorer und wähle das erste Icon von Links. Jetzt kannst du die Datei mit da rein packen.

Mit freundlichen Grüßen

René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect


.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/

Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 19 Jahren

Ich danke dir! 😁 👍

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Maddinel,

Wo muss ich das einbauen? Passiert sowas normalerweise nicht während des Setups? Wenn ja wie?

naja, das ist so eine Sache. Wenn wir mal davon ausgehen, dass du die Extension .MaddinelSpecialFilesHjgfjkgfjk registrieren willst. Dann sollte es reichen, das in der Installationsroutine zu machen.

Aber oft geht es um Erweiterungen, die verbreitet sind (.bmp, .txt, ...) oder zumindest potentiell auch von anderen Anwendungen genutzt werden (könnten), z.B. .msf was MaddinelSpecialFile oder MicroSoftFormat oder - was wirklich verwendet wird - Mail Summary File (Mozilla Mail / ThunderBird) - heißen könnte.

Damit eine Anwendung weiterhin funktioniert (also ihre Dateiassoziation behält), wenn eine konkurrierende Anwendung die Assoziation umbiegt, prüfen viele Anwendungen die Assoziationen beim Start oder sogar ständig im Hintergrund (WinAmp) oder bieten solche Prüfung noch besser in den Optionen an.

Man sollte darauf achten, keine Kampfanwendungen zu schreiben, die sich gegenseitig (ständig) die Assoziationen wegziehen, sondern den Benutzer im Vorfeld fragen und ihm auch später genaue Eingriffsmöglichkeiten geben (Optionen).

HTH

herbivore

2.921 Beiträge seit 2005
vor 16 Jahren

s. dazu auch die Klassen von www.Mentalis.org

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

W
196 Beiträge seit 2007
vor 13 Jahren

Tut mir leid, dass ich ein so altes Thema ausgrabe, aber ich habe eine Frage dazu.

Herbivore schrieb:

Damit sichergestellt ist, dass alle Änderungen im Windows-Explorer sofort wirksam werden, muss die Win32-Funktion SHNotifyChange aufgerufen werden.

Jedoch habe ich gesucht, leider aber nicht gefunden wie ich die Funktion aufrufen kann. Es wäre sehr nett , wenn mir jemand erklären könnte, wie ich das am besten anstelle.

Mfg wizer

U
1.688 Beiträge seit 2007
vor 13 Jahren

Hallo wizer,

Jedoch habe ich gesucht, leider aber nicht gefunden wie ich die Funktion aufrufen kann

Korrekterweise heißt die Funktion SHChangeNotify - dazu müsste sich dann auch einiges finden lassen.

W
196 Beiträge seit 2007
vor 13 Jahren

Danke! Hat super funktioniert 😃

A
10 Beiträge seit 2010
vor 12 Jahren

Hallo,

ich versuche gerade dasselbe umzusetzen. Meine (Anfänger)Frage ist, woher weiß ich den Programmschlüsssel. Ist das der, der in der Registry für die .exe eingetragen ist? Woher weiß ich, welchen das Setup dort einträgt?
Gibt es eine einfache Möglichkeiten das ganze im Debugging zu testen, ohne dass das Programm installiert ist?

Dankeschön!

Gruß
Andre

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo AKNOT,

die Sache läuft zweistufig. In der Registry steht zu der Dateiendung (also z.B. .mde) der Dateityp (also z.B. MeineDateiEndung). Und erst bei der stehen dann die möglichen Aktionen und welches Programm dafür ausgeführt werden muss. Von der Dateiendung ausgehend, bekommst du also alle Informationen, die du braucht. Du kriegst so auch heraus, was das Setup eingetragen hast. Debuggen braucht man da eigentlich nichts. Das läuft ja zuverlässig. Wenn du ausprobieren willst, ob dein Programm auch wirklich (so) aufgerufen wird, wie du es willst, muss es aber schon installiert sein.

herbivore

PS: Für die Kommandozeile gibt es die Befehle assoc und ftype.