Autor Beitrag
Freiberger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 20:01 
Hallo zusammen.
ich habe für mein Programm eine eigene Dateiendung .mbr in Windows verknüpft.

Sobald ich die Datei starte oder Dateien auf die Verknüpfung ziehe geht das Programm auch auf.
Ich möchte über Paramstr() die Dateien prüfen, und da liegt das Problem...

Dateien auf Verknüfpung ziehen...
Parameter Nr. 1: C:\Users\...\Desktop\Word.doc
Parameter Nr. 2: C:\Users\...\Desktop\Testfile für Programm.mbr
Parameter Nr. 3: C:\Users\...\Desktop\Excel.xlsx

Start der Datei...
Parameter Nr. 1: C:\Users\...\Desktop\Testfile
Parameter Nr. 2: für
Parameter Nr. 3: Programm.mbr

Wie bekomme für den Start der Datei den Paramstr() in einer Zeile ?
Oder woran erkenne ich, ob das Programm über die .mbr-Datei gestartet wurde oder durch Ziehen von Datei(en) auf die Verknüfung ?

Ich bin ratlos...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 20:03 
Da fehlen Anführungszeichen bei der Übergabe des Parameters...
Wenn das so im Programm ankommt, dann ist das schon falsch.


Zuletzt bearbeitet von jaenicke am Fr 06.03.09 20:07, insgesamt 2-mal bearbeitet
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 20:05 
ich habe die Parameter in ein Memo geschrieben...
Parameter 1 = paramstr[0]...
Parameter 2 = paramstr[1]... usw

Ich übergebe die Parameter nicht, diese werden beim Programmstart empfangen...
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 06.03.09 20:10 
Hast Du Dein Programm als Standard für diese Endung in der Registry eingetragen? Falls ja, wie sieht der String aus?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 20:13 
user profile iconFreiberger hat folgendes geschrieben Zum zitierten Posting springen:
Ich übergebe die Parameter nicht, diese werden beim Programmstart empfangen...
Wenn du die Verknüpfung von Windows erstellen lässt, dann sollte das korrekt sein. Wenn du den Registryeintrag selbst erstellst, dann darfst du die Anführungszeichen nicht vergessen. Der muss dann lauten:
ausblenden Quelltext
1:
"... Dein Programm.exe" "%1"					
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 06.03.09 20:14 
Darauf wollte ich hinaus, aber der olle Streber muss ja immer alles verraten :mrgreen:
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 20:18 
ich habe das so im Delphi-Easy-Helper gefunden...

if GetProgramAssociation('mbr')='' then InstallExt('.mbr', 'MBR-Datei', 'mein Programm', ParamStr(0), '"%1"',1) ;

"Extension" Dateiendung die Registriert werden soll
"ExtDescription" Kurzbeschreibung, wofür die Abkürzung der Endung steht.
"FileDescription" Bietet Platz für eine Beschreibung des Programmes mit dem geöffnet wird.
"OpenWith" Hier muss der komplette Pfad zu der Anwendung übergeben werden, die mit der Endung verknüpft werden soll.
"ParamStr" Enthält mögliche Parameter und deren Schreibweise. (z.B. "%1" um auch Pfadangaben mit Leerzeichen zu übergeben)
"IconIndex" Dem Parameter kann ein entsprechender Index übergeben werden, der angibt, welches Icon für die Anzeige im Explorer verwendet werden soll.
Der Index bezieht sich auf die Icons der verknüpften Anwendung.


Aber du hast recht. es könnte an der %1 liegen...
Keine Ahnung, was es noch gibt (obwohl %1 für Pfadangaben mit Leerzeichen ist)
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 20:27 
habe es gerade nochmal versucht.
Es liegt definitif an den Leerzeichen im Dateinamen...
Mit 1 Unterstrich wird es eine Zeile weniger.

Parameter Nr. 1: C:\Users\...\Desktop\Testfile_für
Parameter Nr. 2: Programm.mbr
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 20:40 
%1 ist einfach nur in der Shell der Dateiname inkl. Pfad. Und der kann auch Leerzeichen enthalten.

Schau doch einfach mal nach was genau in die Registry geschrieben wird bzw. was da steht. (Unter CLASSES_ROOT\.mbr und dann der Wert, der da steht, unter CLASSES_ROOT, hier also CLASSES_ROOT\MBR-Datei)
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 20:51 
da steht nur
Name Typ Wert
------------------------------------
(Standard) Reg_SZ MeinProgramm

Bei anderen Dateitypen kann ich noch aufklappen, hier nicht.

Die Funktion zu eintragen in die Registry ist...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
function GetProgramAssociation(Ext: string): string;
var reg: TRegistry;
  s: string;
begin
  s:='';
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_CLASSES_ROOT;
  if reg.OpenKey('.'+ext+'\shell\open\command', false) <> false then begin
    s:=reg.ReadString('');
    reg.CloseKey;
  end
  else begin
    if reg.OpenKey('.'+ext, false)<>false then begin
      s:=reg.ReadString('');
      reg.CloseKey;
      if s<>'' then begin
        if reg.OpenKey(s+'\shell\open\command', false)<>false then
          s:=reg.ReadString('');
        reg.CloseKey;
      end;
    end;
  end;
  if Pos('%', s) > 0 then Delete(s, Pos('%', s), length(s));
  if ((length(s)>0) and (s[1]='"')) then Delete (s, 1, 1);
  if ((length(s)>0) and (s[length(s)]='"')) then Delete(s, Length(s), 1);
  while ((length(s)>0) and ((s[length(s)]=#32) or (s[length(s)]='"'))) do
    Delete(s, Length(s), 1);
  reg.Free;
  result:=s;
end;
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 21:00 
Ich habe die Datei mal direkt mit Windows zugeordnet, da kommt das gleiche raus...

Man kann aber auch nicht einfach alle Parameter zu einem Text zusammenfügen, da kommt es bei mehreren Dateine (Ziehen auf Verknüfpung) zu Fehlern...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 21:08 
user profile iconFreiberger hat folgendes geschrieben Zum zitierten Posting springen:
Die Funktion zu eintragen in die Registry ist...
Das ist die zum Auslesen...

Sonst schreib doch die Funktion zum Eintragen selbst, so dass es richtig eingetragen wird. ;-)
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 21:13 
Sorry...

selberschreiben gern, aber ich habe von Registry leider keine Ahnung...


Das ist die aktuelle Funktion zum Eintragen...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
function InstallExt(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  if Extension <> '' then
  begin
    if Extension[1] <> '.' then
      Extension := '.' + Extension;

    Reg := TRegistry.Create;
    try
      Reg.RootKey := HKEY_CLASSES_ROOT;
      if Reg.OpenKey(Extension, True) then
      begin
       Reg.WriteString('', ExtDescription);
       if Reg.OpenKey('\' + ExtDescription, True) then
       begin
         Reg.WriteString('', FileDescription);
         if Reg.OpenKey('DefaultIcon', True) then
         begin
           Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex]));
           if Reg.OpenKey('\' + ExtDescription + '\Shell\Open\Command', True) then
           begin
             Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));
             Result:=True;
           end;
         end;
       end;
     end;
  finally
    Reg.Free;
  end;
  end;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.03.09 21:26 
Da hast du ja schon die Antwort:
ausblenden Delphi-Quelltext
1:
             Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));					
Also musst du es ohne aufrufen, denn sonst kommen die Anführungszeichen doppelt an.
ausblenden Delphi-Quelltext
1:
2:
if GetProgramAssociation('mbr') = '' then
  InstallExt('.mbr', 'MBR-Datei', 'mein Programm', ParamStr(0), '%1', 1);
Nebenbei brauchst du natürlich Adminrechte, aber die Einrichtung macht ja normalerweise ohnehin das Setupprogramm, das diese sowieso hat.
Freiberger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Fr 06.03.09 22:09 
Heee, es geht...

vielen vielen Dank, da wäre ich nie drauf gekommen.

Dann ist es im Easy-Helper falsch... da steht...
Easy-Helper hat folgendes geschrieben:
Ein Beispielaufruf könnte so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if InstallExt('.xyz', 'XYZDatei', 'Tolles Programm', ParamStr(0), '"%1"',0) then
   Showmessage('Dateiendung konnte erfolgreich registriert werden.');
end;

Vielen Dank nochmal..

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt