Autor Beitrag
majolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: So 01.09.02 12:20 
Tach Leute,

ich habe eine Frage.Ich möchte gerne eine neue Dateiendung anlegen.*.lgd Diese soll ein eigenes ICON bekommen und bei Doppelclick in meinem Programm ausgeführt werden.Nun habe ich dazu mehrere Fragen:
1. Wenn ich mich nicht irre müssen diese Informationen in der Registry hinterlegt werden.Weiß nur nicht wie.Also wie die Registry Datei aufgebaut sein muss.
2. Muss ich im Programm noch eine Schnittstelle einbauen, dass es diese Dateien, wenn sie per Doppelclick ausgeführt werden, auch im Memo oder Richedit, oder Editfeld anzeigt.Irgendwie müssen dem Programm doch diese Information gegeben werden.

Ich hoffe es ist einigermaßen zu verstehen.
Danke im vorraus.
Gruß
majolo
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: So 01.09.02 12:46 
1.: Öffne mal den Regedit und geh dann auf HKEY_Classes_Root und dann auf .dpr. Wie du siehst ist da der Standardwert = "DelphiProject". Also scrollst du runter bis du zu HKEY_CLASSES_ROOT\DelphiProject kommst. Dort stehen die Infos à la Icon etc. drin. So, dass musst du jetzt nur :mrgreen: in dein Programm umsetzen.

2.: Wenn jemand auf eine datei doppelklickt, so wird das dazugehörige Programm ausgeführt und zwar mit einem Parameter (der Dateipfad der ausgewählten Datei) :arrow: mit ParamStr(Index: Integer) kannste die übergebenen Parameter auslesen und dann die Datei öffnen.

Ich glaube ParamStr(0) ist immer der Pfad zur exe, das hieße in deinem Fall dann ParamStr(1) außer, du übergibst noch mher Parameter.

_________________
Viele Grüße
Jakob
majolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: So 01.09.02 17:40 
Hi,

schonmal vielen Dank. versuche das ganze mal zu verdauen, weil ich so etwas noch nie gemacht habe.schau ma mal.
Gruß
majolo
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: So 01.09.02 21:53 
KeinePanik
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: So 01.09.02 23:10 
Also muss ich, um z.B. eine *.lgd zu registrieren in das HKEY_Classes_Root den Schlüssel ".lgd" schreiben, dann den Standartwert zu "Meine Anwendung" ändern , einen weiteren Schlüssel "Meine Anwendung" anlegen und dann in den weiteren Unterschlüssel "Meine Anwendung\shell\open\command" den Standardwert auf meine Anwendung angeben und das wars !?!? ... Ich wills jetzt lieber erstmal nicht testen, nicht dass ich da nen Fehler habe !

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.09.02 06:55 
Keine Panik, KeinePanik! :wink: Dein Gedanke ist richtig. Und wenn du die richtigen Angaben reinschreibst (Pfad, Dateiname, Anführungszeichen), dann gibt´s auch keine Fehler.

Ich würd´s erst mal von Hand probieren, damit du ein Gefühl dafür bekommst, und dann kannst du´s ja mal über das Programm erledigen lassen.

Aber - folgendes im Auge behalten: wenn du vorhast, dein Programm auch anderen zur Verfügung zu stellen, dann solltest du mit den unterschiedlichsten Systemen und Einstellungen rechnen. Sehr häufig vertreten: die NT/2000/XP-Fraktion mit Benutzerrechten.
Hier könnte es Probleme geben, wenn dein Programm versucht, auf den Schlüssel "HKEY_CLASSES_ROOT" zuzugreifen. Das darf auf NT-Systemen nicht jeder. Also vorher besser testen, ob der Benutzer, der dein Programm startet, z.B. Admin-Rechte hat. Dann kannst du den Eintrag in der Registry vornehmen, weil es bei Admins die wenigsten Probleme geben sollte.

Gruß,
Mathias.
majolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Mo 02.09.02 18:39 
Hi Leute,

danke ihr habt mir schon mal viel geholfen.Aber ich habe noch eine Frage zur Dateiregistrierung:
ausblenden volle Höhe 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:
uses 
  registry; 

procedure TForm1.RegEintraege; 
var 
  R: TRegistry; 
begin 
  R := TRegistry.Create; 
  try 
    R.RootKey := HKEY_CLASSES_ROOT; 
    R.OpenKey('.waf', True); 
    R.WriteString('', 'abfragefile'); 
    R.CloseKey; 
    R.OpenKey('abfragefile', True); 
    R.WriteString('', 'Wörter Abfrage'); 
    R.CloseKey; 
    R.OpenKey('abfragefile\DefaultIcon', True); 
    R.WriteString('',Form1.ediVerzeichniss.Text+'\ico\waf.ico'); 
    R.CloseKey; 
    R.OpenKey('abfragefile\shell\open\command', True); 
    R.WriteString('',Form1.ediVerzeichniss.Text+'\prog\Abf.exe /o %1'); 
    R.CloseKey; 
    R.OpenKey('abfragefile\shell\print\command', True); 
    R.WriteString('',Form1.ediVerzeichniss.Text+'\prog\Abf.exe /p %1'); 
    R.CloseKey; 
    R.OpenKey('abfragefile\shell\prinntto\command', True); 
    R.WriteString('',Form1.ediVerzeichniss.Text+'\prog\Abf.exe /p %1'); 
    R.CloseKey; 
  except 
    R.Free; 
  end; 
end;


Da heißt es zum Beispiel:


ausblenden Quelltext
1:
R.WriteString('',Form1.ediVerzeichniss.Text+'\ico\waf.ico');					

Was bedeutet der ('',Form1.ediVerzeichniss.Text'); Teil? Ich habe Angst mir durch einen Fehler die Registry kaputt zu machen.
Und was bedeutet dieser:
ausblenden Quelltext
1:
2:
3:
4:
R.WriteString('', 'abfragefile'); 
    R.CloseKey; 
    R.OpenKey('abfragefile', True); 
    R.WriteString('', 'Wörter Abfrage');

Ich nehme an abfragefile ist eine Art Verzeichniss und Wörter abfragen, das, was im explorer erscheint.
Danke
Majolo
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.09.02 20:15 
majolo hat folgendes geschrieben:
Aber ich habe noch eine Frage zur Dateiregistrierung:

Uih, es ist schon ein Weilchen her, dass ich so was direkt im Programm gemacht habe. Normalerweise lasse ich das während der Installation erledigen.

Zitat:
Was bedeutet der ('',Form1.ediVerzeichniss.Text'); Teil?

Das bedeutet, dass dem Standardwert eines Registryschlüssels der Inhalt eines TEdit-Controls zugewiesen wird. Das findest du häufiger in deinem Code, deswegen tippe ich mal, dass in diesem TEdit das Verzeichnis des Programms drin steht. Lass dir den Inhalt des Eingabefeldes doch einfach mal mit
ausblenden Quelltext
1:
ShowMessage(Form1.ediVerzeichniss.Text);					

anzeigen. Angesichts solcher Zeilen:
ausblenden Quelltext
1:
2:
3:
R.WriteString('',Form1.ediVerzeichniss.Text+'\ico\waf.ico');
...
R.WriteString('',Form1.ediVerzeichniss.Text+'\prog\Abf.exe /o %1');

solltest du ohnehin prüfen, dass das letzte Zeichen im Eingabefeld kein Backslash ist, sonst könnte der Eintrag in der Registry u.U. so aussehen:
ausblenden Quelltext
1:
c:\Programme\WAFProgramm\\prog\Abf.exe					

was sicher nicht mehr funktionieren würde. Des Weiteren wäre es empfehlenswert, wenn du prüfst, ob Schlüssel und Werte überhaupt angelegt werden können. "OpenKey" ist beispielsweise eine Bool-Funktion, das heißt, wenn der Schlüssel nicht angelegt werden konnte, ist der Rückgabewert false. Und "WriteString" löst im Fehlerfall eine Exception aus. Streng genommen müsste man diese Aufrufe also ebenfalls in einen try-except-Block klammern.

Gerade unter NT-Systemen (NT, 2000, XP) sollte man dies prüfen, da nicht jeder Benutzer automatisch das Recht hat, auf alle Schlüssel der Registry zuzugreifen.

Zitat:
Ich habe Angst mir durch einen Fehler die Registry kaputt zu machen.

Die Angst kann ich dir nicht nehmen. Bei Arbeiten an der Registry ist grundsätzlich Aufmerksamkeit gefordert. Wenn du aber die o.g. Grundregeln beherrscht, dann kannst du ruhiger an die Sache herangehen. :wink:

Zitat:
Ich nehme an abfragefile ist eine Art Verzeichniss und Wörter abfragen, das, was im explorer erscheint.

Richtig. "abfragefile" ist der interne Schlüssel, auf den die Dateiendung ".waf" zeigt, und "Wörter Abfrage" würde als Beschreibung im Explorer erscheinen.


Übrigens - die Borland-Demo der Shell-Erweiterung zeigt einen zweiten Weg, wie man Registryeinträge anlegen kann. Das Ergebnis ist das gleiche, aber dein Code würde so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
uses
  ComObj;

{ ... }

try
  CreateRegKey('.waf','','abfragefile');
  CreateRegKey('abfragefile','','Wörter Abfrage');
  CreateRegKey('abfragefile\DefaultIcon','',
    '"' + Form1.ediVerzeichniss.Text + '\ico\waf.ico"');
  CreateRegKey('abfragefile\shell\open\command','',
    '"' + Form1.ediVerzeichniss.Text + '\prog\Abf.exe" /o "%1"');
  CreateRegKey('abfragefile\shell\print\command','',
    '"' + Form1.ediVerzeichniss.Text + '\prog\Abf.exe" /p "%1"');
  CreateRegKey('abfragefile\shell\printto\command','',
    '"' + Form1.ediVerzeichniss.Text + '\prog\Abf.exe" /p "%1"');
except
end;

Ach ja: ich habe hier nicht grundlos den Dateinamen und den Parameter %1 in Anführungszeichen gesetzt. Schließlich gibt´s ja auch lange Verzeichnis- und Dateinamen, u.U. mit Leerzeichen drin. :wink:
majolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Mo 02.09.02 20:55 
@MathiasSimmack: Vielen Dank für die Win 2000/NT Belehrung, das wusste ich jedoch. Ich weiß, dass vorsicht geboten ist beim Arbeiten mit der registry.Kein Problem.Trotzdem vielen Dank. ich werde versuchen deine Hilfe mit einzubauen.

Ach mal ne Frage nebenbei: Wo wir schon bei NT und Administrationrechten sind. Wenn ich nicht irre habe ich irgendwo mal gelesen, dass man diese Dinge in der Registry woanders unterbringt und so die Adminrecht umgeht.Ich habe auch glaube ich sogar noch eine Pfad angabe rumfliegen, aber noch nie ausprobiert.Klappt das, denn ich besitze kein 2000 oder NT?Hat einer damit Erfahrungen, dann würde ich nämlich bei mir eine Bedingung einprogrammiern, die das Betriebssystem testet und dann je nach Betriebssystem die Registryeinträge vornimmt.
Gruß
majolo
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 03.09.02 07:54 
majolo hat folgendes geschrieben:
@MathiasSimmack: Vielen Dank für die Win 2000/NT Belehrung, das wusste ich jedoch.

Eine Belehrung war das nicht, nur ein freundlicher Hinweis. Das ist jetzt eine Belehrung: "Wenn du´s wusstest, warum nimmst du dann so einen schrottigen Code, bei dem keinerlei Fehlerprüfung stattfindet?" :evil:


Zitat:
Wenn ich nicht irre habe ich irgendwo mal gelesen, dass man diese Dinge in der Registry woanders unterbringt und so die Adminrecht umgeht.

Wozu sollte man die Admin-Rechte umgehen wollen? Solche Fragen haben irgendwie immer etwas Zweideutiges. Ich finde das Rechte-System von NT/2000/XP sehr gut. Richtig eingesetzt muss man zwar ein paar Beschränkungen in Kauf nehmen, allerdings ist man vor chaotischem Virenbefall sehr sicher (weil sich der/das Virus nur im Rahmen deiner Benutzerrechte ausbreiten kann), und sogar vor Dialern bist du ab Win2000 gut geschützt, wenn du die Zugriffsrechte so einstellst, dass nur der Admin Schreibzugriff auf die Datei mit dem DFÜ-Verbindungen hat.

Was du machen kannst, sind bestimmte Dinge im Schlüssel HKCU unterzubringen. Man liest ja sehr oft Fragen wie "Wie mache ich einen Autostarteintrag für mein Programm?", oder "Wie kann ich die Konfiguration meines Programms speichern?" usw.
Wenn man sich angewöhnt, den typischen 9x-Vorschlag mit dem Schlüssel HKEY_LOCAL_MACHINE zu ignorieren und stattdessen HKEY_CURRENT_USER zu benutzen, dann gibt es auch auf NT-Systemen keine großen Probleme.

Und bestimmte Funktionen lassen sich - in Abhängigkeit von den Benutzerrechten - sperren. Vorstellbar wäre z.B., dass dein Programm eine Meldung zeigt, wie etwa: "Ohne Administratorrechte kann eine Dateiregistrierung nicht erfolgen" o.ä. Eine entsprechende Prüffunktion (IsAdmin) sollte im Web zu finden sein, ansonsten krame ich sie mal raus. :wink:
majolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Di 03.09.02 16:56 
@Mathias: Kein Problem. Was heißt schrott Code. Ist immerhin der Code der mir hier empfohlen wurde.Jedoch bastele ich mir die Codes, die ich hier erhalte sowieso anders zurecht.

Zu Adminstrationrechte umgehen. Ich habe natürlich keinen bösen Hintergedanken.Ich möchte nur einfach sicher gehen, dass meine Software auf möglichst allen Systemen funktioniert.Nicht so wir bei Microsoft, die es nicht mal schaffen ihre eigenen Programme auf allen Systemen zum laufen bekommen.

Gruß
majolo
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.09.02 07:12 
majolo hat folgendes geschrieben:
@Mathias: Kein Problem. Was heißt schrott Code. Ist immerhin der Code der mir hier empfohlen wurde.

Empfohlen? Nein. Der Code steht lediglich in den FAQs, weil ihn dort jemand eingetragen hat. Wäre ein anderer schneller gewesen, sähe das Ergebnis entweder besser oder noch schlechter aus. :wink:

Zitat:
Ich möchte nur einfach sicher gehen, dass meine Software auf möglichst allen Systemen funktioniert.

Wie gesagt, wenn es z.B. um Programmeinstellungen geht, die du in der Registry ablegen möchtest, dann benutze den Schlüssel HKEY_CURRENT_USER anstelle vonHKEY_LOCAL_MACHINE. Das gilt auch für Autostarteinträge, wenn dein Programm beim nächsten Win-Start automatisch erscheinen soll.

Bei anderen Zugriffen, wie z.B. bei dieser Dateitypregistrierung, würde ich das von den Rechten abhängig machen. Wenn jemand keine Admin-Rechte hat, dann zeigst du ihm einmal eine entsprechende Box. (Nur einmal! Sonst nervt´s, wenn dieser Hinweis bei jedem Start erscheint. :wink:)
Das bedeutet aber auch, dass du prüfen müsstest, ob die Registrierung des Dateityps schon vorhanden ist. Und das lässt sich LESEND auch ohne Admin-Rechte ausführen:
ausblenden Quelltext
1:
2:
3:
4:
cReg := TRegistry.Create(KEY_READ);
try
  cReg.RootKey := HKEY_CLASSES_ROOT;
  ...

Du siehst, zumindest der Lesezugriff sollte ohne Probleme auf allen Systemen klappen. Na ja, und beim Schreibzugriff - wie gesagt: auf Adminrechte prüfen und dann den Benutzer hinweisen (dass er keine hat), oder die Aktion ausführen.

Das wäre mein Vorschlag.
majolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334

Ubuntu 8.04, WinXP Prof.
D1, D6Pers, D7 Prof., D8 Prof., D2005 Pers
BeitragVerfasst: Mi 04.09.02 18:55 
Den FAQ-Thread habe ich schlußendlich eh nicht genommen,sondern einen aus einem Tutorial.Der klappt auch wunderbar und macht keine Zicken.
Den Benutzer aufmerksam machen, war sowieso meine Absicht. Auf den Dialog sollte dann ein Hilfefenster zur Fehlerbeseitigung erscheinen, das gleichzeitig die Möglichkeit bietet, nach erworbenen Admin-Rechten die registry einträge entsprechend hinzuzufügen, zu ändern und zu entfernen.Das ganze muss leicht aufgebaut sein, denn es soll auch von Schülern aus der 5. Klasse und Lehrern im Alter Anfang 60 geschnallt und selber korrigiert werden können.
Gruß
majolo