2009-03-01 5 views
2

Ich bin derzeit mit:Wie mehrere Dateien mit Delphi-Programm öffnen über Shell aufgerufen offen

if ParamStr(1)<>'%1' then 
begin 
    address.Text:=ParamStr(1); 
    autoconfigfile; 
end; 

den Namen der Datei zu holen, die zum Öffnen der Datei mit über Dateizuordnung verwendet wurde.

Ich möchte jetzt die Fähigkeit entwickeln, mehrere Dateien zu bearbeiten. I.e. wenn ich 5 Dateien auswähle und mit der rechten Maustaste klicke und öffne mit "EncryptionSystem". Ich habe den Registrierungseintrag:

reg.OpenKey('*\shell\Encrypt\command', true); 
    reg.WriteString('','C:\Program Files\EncryptionSystem\EncryptionSystem.exe "%1"'); 
    reg.CloseKey; 

Um einen Rechtsklick öffnen Fähigkeit, alle Dateien hinzuzufügen. Ich möchte dann die Fähigkeit,

  1. , wie viele Dateien
  2. der Pfadname jeder Datei
+0

Ich fand die Antwort nur in der Verwendung von dde für das Anfangsbit, da die erste Instanz die Nachricht von der Sekunde nicht empfängt, wenn alle Instanzen zusammen aufgerufen werden. beflügelt meinen eigenen gemeinsamen Speicherraum für das funktioniert gut. – Arthur

+0

Keine Antwort, aber auf die gleiche Frage: Ich habe meine Dateierweiterung nicht in der Registrierung enthalten, aber wenn ich mehrere Dateien in einem Fenster auswähle, und verwenden Sie "Öffnen mit", um mein Programm zu wählen, um sie zu öffnen , die Befehlszeile scheint nur einen der Dateinamen zu enthalten. Weißt du, wie man die anderen Dateinamen findet, bitte? Dave S –

Antwort

5

Wenn Sie versuchen, mehrere Dateien gleichzeitig zu öffnen, erhalten Sie in der Regel mehrere Instanzen des registrierten Programms, von denen jedes eine der Dateien öffnet.

urteilen nun von Ihrem letzten Fragen

How do i tell if one instance of my program is running?
How do I send a string from one instance of my Delphi program to another?

Sie nicht wünschen, mehrere Instanzen des Programms zu ermöglichen, so müssen Sie entweder diese Design-Entscheidung überdenken, oder eines der Umsetzung Möglichkeiten, die in den Antworten auf die zweite Frage beschrieben sind, um den Befehlszeilenparameter der sekundären Instanzen Ihres Programms an die erste Instanz zu senden. Bitte beachten Sie, dass das Timing hier wichtig ist, da die erste Instanz möglicherweise noch nicht bereit ist, die Daten von den anderen Instanzen zu empfangen. Insbesondere bei Lösungen, bei denen das Fensterhandle des Hauptformulars verwendet wird, oder bei einer Form von rohr- oder dateibasierten Kommunikationsmechanismen wird darauf gewartet, dass die erste Instanz bereit ist. Es kann daher viel einfacher sein, einfach mehrere Instanzen des Programms zuzulassen.

Sie können auch in this Microsoft Knowledge Base entry suchen oder für weitere Informationen über die DDE Execute Befehl suchen.

Edit: Sie könnten auch mit "% *" anstelle von "% 1" in dem Registrierungsschlüssel versuchen, wie ausführlich in dem "Old New Thing" Kommentar the answer by gabr erwähnt. Ich habe das nicht getestet, aber es sieht so aus, als könnte es funktionieren.

+0

% * sieht so aus, als ob ich es will, werde es testen, wenn ich nach hause komme, liefert das den longname oder die dos 8.3 version mit "~" – Arthur

0

Nicht sicher erkennen, was Sie wirklich wollen. Aber Sie können die Anzahl der Parameter mit finden:

ParamCount; 

Jeder param dann mit

ParamStr(1); 
ParamStr(2); 
ParamStr(3); 

Bis ParamCount gefunden wird.

+0

die paramcount übergeben die Anzahl der Parameter am Ende des Dateinamens hinzufügen .. Apon Eröffnung von 5 Dateien gibt es nur 1 Param. – Arthur

0

Ich merke, dass Sie es nur mit% 1 registrieren.

Ich würde% 1% 2% 3% 4% 5 usw. in der Registrierung versuchen.

Ich habe noch nie mit Shell-Erweiterungen gespielt, um zu sehen, was sonst noch fehlschlägt. Alles, was ich getan habe, sind registrierte Dateizuordnungen, und sie verhalten sich genau so, wie ich es erwartet hätte.

6

Neben allem anderen sollten Sie% l anstelle von% 1 verwenden. Auf diese Weise bekommt Ihr Programm einen vollständigen (langen) Namen der Datei, nicht die kurze (DOS 8.3).

EDIT: Eine Antwort auf Robs Frage in den Kommentaren

Es scheint, dass es fast unmöglich ist, für ‚% l‘ und ‚% 1‘ (einschließlich Prozentzeichen) entweder mit Google oder MSDN Suche zu suchen. :(Allerdings fand ich eine ziemlich gute Beschreibung in The Old New Thing - '% 1' erkennt automatisch, ob Ihr Programm lange Dateinamen unterstützt und entweder kurze oder lange Namen übergibt.Es scheint, dass alle modernen Systeme den langen Namen übergeben, es sei denn Ihre exe kann nicht gefunden werden (zumindest verstehe ich das Raymond-Expose)

Wenn Sie weiter unten in den Kommentaren blättern (suchen Sie nach '% l' auf der Seite), finden Sie eine Liste aller unterstützten Parameter Seite, die nicht mehr existiert (aber ich fand eine alte Kopie in der Internet Archive). Diese Seite enthält auch keinen Verweis auf Microsoft-Dokumentation, so kann ich Ihnen keine verbindliche Verbindung geben :(

Rob, danke für die Nachfrage - ich weiß jetzt mehr über% 1 /% l als zuvor :) +1 dafür.

+0

Haben Sie ein Zitat dafür? –

+1

Was ist das - Wikipedia? ;) – gabr

+0

Wenn jemand die Formatierung meiner Bearbeitung reparieren kann, bitte weitermachen - ich kann das Problem nicht finden (habe keine Ahnung, was den ganzen Absatz verursacht und mehr zu einem Hyperlink wird). – gabr