Ich habe ein Problem mit Dateizuordnungen. Meine C#-Anwendung kann die Dateizuordnung für ihre eigene Erweiterung festlegen, sodass Benutzer, die auf die verwendete Projektdatei doppelklicken, meine App öffnen und die Datei laden.
Dies führt zu Problemen mit zwei Komponenten von Drittanbietern. Jede verwendet eine Lizenzierung.
Beim Doppelklick erscheinen die Lizenzdialoge für beide Komponenten. Beim Ausführen der App aus der ausführbaren Datei geschieht dies nicht. Wenn ich die entsprechende Datei auf meine App-Verknüpfung ziehe, startet die App mit der Datei und es erscheinen keine Lizenzdialoge.
Daher muss ich zu dem Schluss kommen, dass das Problem in der Art und Weise liegt, wie Windows die Dateizuordnungsaktion ausführt.
Die Leute, die den Lizenzcode erstellen, haben mir gesagt, dass das Problem wahrscheinlich darin liegt, dass der Name der ausführbaren Datei geändert wurde und der Lizenzcode diese ablehnt. Ich kann nur annehmen, dass dies mit dem Argument zusammenhängt, das den Dateinamen enthält.
Ich habe versucht, die Codeausführung über Haltepunkte in meinem Code abzufangen, aber ich kann es nicht erreichen, selbst wenn der Haltepunkt in der ersten ausgeführten Zeile liegt. Was auch immer Windows tut, es kommt über diesen Punkt hinaus.
Antwort1
So funktionieren Verbände
Wenn Sie im Windows Explorer auf eine Datei doppelklicken, sucht die Windows-Shell in der Registrierung nach der Dateierweiterung, um festzustellen, ob die Erweiterung registriert ist. Wenn die Erweiterung nicht registriert ist, zeigt Windows das Dialogfeld „Öffnen mit“ an, in dem der Benutzer eine Anwendung auswählen kann, die dem Dateityp zugeordnet werden soll. Wenn die Erweiterung registriert ist, ruft Windows die Funktion ShellExecute() mit dem Befehl „öffnen“ auf. Außerdem wird der Name der Datei, auf die doppelgeklickt wurde, als Befehlszeilenparameter übergeben.
Assoziationen gehen jedoch über das bloße Öffnen einer Datei hinaus. Wenn Sie im Explorer mit der rechten Maustaste auf eine Textdatei (.TXT) klicken, werden oben im Kontextmenü zwei Elemente angezeigt. Das erste heißt „Öffnen“. Die Auswahl dieses Menüelements entspricht einem Doppelklick auf die Datei im Explorer. Wenn Sie „Öffnen“ wählen, wird NOTEPAD.EXE mit der geladenen ausgewählten Datei gestartet (vorausgesetzt, es handelt sich um eine Standard-Windows-Installation). Das zweite Menüelement heißt „Drucken“. Wenn Sie auf dieses Menüelement klicken, wird die Datei gedruckt, ohne dass Notepad überhaupt angezeigt wird.
Bei anderen Dateitypen werden im Kontextmenü des Explorers sogar noch mehr Elemente angezeigt. Wenn Sie beispielsweise mit der rechten Maustaste auf eine Microsoft PowerPoint-Datei klicken, werden Kontextmenüelemente mit den Namen „Öffnen“, „Neu“, „Drucken“ und „Anzeigen“ angezeigt. Die im Kontextmenü für einen bestimmten Dateityp angezeigten Elemente werden aus der Registrierung abgerufen.
Es gibt mindestens zwei Möglichkeiten, eine Dateizuordnung in Windows zu erstellen. Eine Möglichkeit besteht darin, im Windows Explorer mit der rechten Maustaste auf eine Datei zu klicken und im Kontextmenü „Öffnen mit…“ auszuwählen. Wenn Sie dies tun, zeigt Windows das Dialogfeld „Öffnen mit“ an. Natürlich erfordert diese Methode ein Eingreifen des Benutzers. Wenn Sie Ihre Anwendung bereitstellen, möchten Sie Ihre Benutzer wahrscheinlich nicht zwingen, eine Dateizuordnung manuell einzurichten.
Eine bessere Möglichkeit, eine Zuordnung herzustellen, besteht darin, verschiedene Registrierungseinträge aus Ihrer Anwendung heraus vorzunehmen. Ein gutes Installationsprogramm nimmt die Registrierungseinträge für Sie vor, aber manchmal benötigen Sie mehr Kontrolle über den Vorgang.
Verein anmelden
Zum Registrieren einer Dateizuordnung müssen zwei separate Registrierungsschlüssel erstellt werden. Beide Schlüssel werden im HKEY_CLASSES_ROOT
Abschnitt der Registrierung erstellt.
Der Dateierweiterungsschlüssel
Der erste Schlüssel ist der Name der Dateierweiterung, dem ein Punkt vorangestellt ist.
HKEY_CLASSES_ROOT\.zzy
In einer Produktionsanwendung sollten Sie die Registrierung überprüfen, um sicherzustellen, dass kein Schlüssel vorhanden ist, bevor Sie versuchen, einen neuen Schlüssel zu erstellen. Wenn der Schlüssel bereits vorhanden ist, muss Ihre Anwendung den Benutzer entweder auffordern, die Dateizuordnung zu ersetzen, oder darauf vorbereitet sein, eine ganz andere Dateierweiterung zu verwenden.
Der Wert dieses Schlüssels ist mit dem zweiten Schlüssel verknüpft, den Sie erstellen werden. Tatsächlich ist es der Name des zweiten Schlüssels. Für das Beispielprogramm habe ich diesem Schlüssel den Wert „Test App File“ zugewiesen. Dieser Wert kann beliebig sein, aber wie beim ersten Schlüssel müssen Sie sicherstellen, dass der Schlüssel nicht bereits in der Registrierung vorhanden ist.
Der Anwendungszuordnungsschlüssel
Der zweite Schlüssel hat den gleichen Namen wie der Standardwert für den ersten Schlüssel.
HKEY_CLASSES_ROOT\Test App File
Dieser Schlüssel muss mindestens einen Unterschlüssel haben. Windows verwendet diesen Unterschlüssel, wenn es die Anwendung ausführt. Der gesamte Schlüssel ist wie folgt aufgebaut:
HKEY_CLASSES_ROOT
Test App File
shell
open
command
Die Zeichenfolge, die dem Befehlsschlüssel übergeben wird, ist der vollständige Pfad und Dateiname der Anwendung, gefolgt von%1. Zum Beispiel:
C:\MyApp\MyApp.exe %1
Wenn Windows die Anwendung startet, ersetzt sie die%1Symbol mit dem Pfad und Dateinamen der Datei, auf die im Windows-Explorer doppelgeklickt wurde. Dieser Wert wird als Befehlszeilenparameter an Ihre Anwendung übergeben.
Zusätzliche Tasten
Es gibt weitere Unterschlüssel, die Sie unter dem Dateizuordnungsschlüssel erstellen können. Einer dieser Schlüssel ist der DefaultIcon
Schlüssel. Dieser Schlüssel wird verwendet, um das Symbol anzugeben, das die Windows-Shell neben Dateien der registrierten Typen anzeigt. Dieser Schlüssel ist nicht erforderlich, wenn Sie nur einen Dateityp registriert haben und dieser Dateityp das Anwendungssymbol verwenden soll. So sieht der Wert des Schlüssels DefaultIcon für eine Zuordnung aus, die das Standardanwendungssymbol angibt:
C:\MyApp\MyApp.exe,0
Dies gibt an, dass das erste in der EXE-Datei der Anwendung gefundene Symbol als Anzeigesymbol der Dateizuordnung verwendet werden soll. Wenn Ihre Anwendung mehr als einen Dateityp hat, können Sie andere Symbole angeben, indem Sie den Symbolindex ändern, der auf das Komma folgt. C++Builder hat beispielsweise Symbole für eine Projektdatei, eine Formulardatei, eine Quelldatei usw. Wenn Sie in der Registrierung darunter nachsehen, HKEY_CLASSES_ROOT\BCBProject\DefaultIcon
werden Sie feststellen, dass das Symbol für eine Projektdatei den Symbolindex 4 hat (zumindest für C++Builder 4).
Wenn Sie Benutzern das Drucken eines Dokuments erlauben möchten, können Sie zusätzlich zum Unterschlüssel „open“ einen Unterschlüssel „print“ hinzufügen. Der Wert des Unterschlüssels „print“ ist dem des Unterschlüssels „open“ ähnlich, mit einer Ausnahme:
C:\MyApp\MyApp.exe /p %1
Beachten Sie, dass dieser Wert einen Befehlszeilenschalter von hat/Peingefügt zwischen dem Anwendungsnamen und dem%1Symbol. Ihre Anwendung kann auf das/PSchalter und ergreifen Sie entsprechende Maßnahmen, wenn der Schalter erkannt wird.
Sie können für einen bestimmten Dateityp beliebig viele Unterschlüssel hinzufügen. Der Name jedes Unterschlüssels wird im Kontextmenü des Explorers angezeigt. Sie müssen nur für jeden Befehlstyp einen Befehlszeilenschalter hinzufügen, damit Ihre Anwendung das ausgewählte Kontextmenüelement identifizieren kann. Wenn Sie einen Standardwert für den Unterschlüssel angeben, verwendet Windows diesen Text für den Text des Kontextmenüelements. Wenn Sie keinen Standardwert angeben, verwendet Windows den Schlüsselnamen selbst für das Menüelement.
Alle Informationen stammen aus dieserArtikel.