![]() |
Datentypen in der Registry
Leider habe ich lange nichts mehr mit Delphi gemacht und darum etwas den Überblick verloren.
Weil ich momentan einen ganze Schwung billig erworbener gebrauchter PCs einzurichten habe, bin ich es leid, überall die Dateitypen manuell einzutragen. Es geht darum, grundsätzlich für multimediale Inhalte portable Programme zuzuweisen. Das sind z.B. vor allem IrfanView und VLC. Leider komme ich mit der Registry nicht weiter. Es geht zunächst um das Ermitteln der aktuellen Einträge, ehe daran zu denken ist, neue einzutragen. Das ist nämlich nur nötig, wenn die gewünschte Zuweisung noch nicht existiert. Wenn ich die Dateitypen unter HKEY_CLASSES_ROOT auslese, bekomme ich z.B. für Dateien, die eigentlich mit IrfanView geöffnet werden sollen, überall rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_Fullscre en %1 als Ergebnis. Die Zuweisungen für IrfanView und anderes finde ich hingegen bei direkter Suche mit Regedit unter HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\FileExts, aber dann auch immer nur mit OpenWithList und OpenWithProgids. Wie finde ich das mit Delphi? Und wie kann ich die von mir gewünschten Einträge allgemeingültig als Vorgaben setzen, also bei HKEY_CLASSES_ROOT ?:shock: Meine bisherigen Tests basieren auf Beiträgen, die ich hier im Forum fand. Weil sie aber alle nicht genau das machten, was ich wissen will, mußte ich sie anpassen, um überhaupt Ergebnisse zu bekommen. Weil das im Endeffekt nichts brachte, habe ich das wieder gelöscht und stehe am Anfang.:pale: Kann mir jemand irgendwie weiterhelfen? Es geht um alte Delphi-Versionen (3, 4, 5, 7) und alte Windows-Versionen (98SE, XP). Bitte keine Kommentare zu "veraltet, unsicher" usw., denn es ist eine Kostenfrage, eine Frage des Prinzips und hat praktische Gründe, die zu erläutern themenfremd wäre. Danke. |
AW: Datentypen in der Registry
Ich würde da nicht das Rad neu erfinden und auf die Möglichkeiten zurückgreifen, die die Programme bzw. deren Setups eh schon bieten. Das geht, indem man die Programme unbeaufsichtigt installiert - was sich bei einer Menge von Rechnern ja sowieso anbietet. IrfanView hat die Schalter alle in der
![]() ![]() MfG Dalai |
AW: Datentypen in der Registry
Danke erstmal, ABER:
1.) Es geht um PORTABLES. Ich will nichts installieren. 2.) IrfanView und VLC sind lediglich Beispiele, weil für diese Progs viele Dateitypen in Betracht kommen. Es geht in jedem Fall darum, daß ich für genau die in meinem Eingangspost aufgeworfenen Fragen, also Zugriffs auf die Registry, Lösungsansätze suche. Also bitte keine solchen "Antworten" mehr, bei denen sich mir nur die sarkastische Frage stellt: "Klar, warum programmieren wir eigentlich noch selbst, wenn es doch schon soviele, fertige eiernde Räder gibt ?" !!! :shock: :roll: Bei der Menge von Rechnern bietet sich für mich nur eine einzige zeitsparende Lösung an und die heißt: Fertiges Verzeichnis der Portables inklusiv alles Unterverzeichnisse komplett auf die Zielrechner kopieren. Ich habe Gründe, soviele Portables wie möglich zu benutzen. Und gerade weil sich diverse Programme einfach alle Endungen "krallen", will ich selbst die Kontrolle haben. Schlimmstes Beispiel ist ja Microsoft selbst, das einem für fast alles "fertige Lösungen" = sprich fürchterliche "Programme" als Vorgaben unterjubelt. Die will ich nämlich auch komplett entfernen und durch Zuweisungen auf vernünftige Programme ersetzen. Auf einem meiner Bootsysteme (ich benutze meist Multiboot) habe ich gerade feststellen müssen, daß sich hier "Nero" fast alles gekrallt hat. Auch um sowas nachträglich wegzubekommen, geht es nicht ohne Registry, wenn man nicht alles zeitraubend manuell entfernen will. |
AW: Datentypen in der Registry
ungetestete Idee:
Delphi-Quellcode:
Der Aufruf von RegisterProg ließe sich sicherlich auch über eine Ini-Datei (o. ä.) realisieren, so dass die einzelnen Verknüpfungen nicht fest im Programm verdrahtet werden müssen.
uses Registry;
function RegisterProg( sFileType : String; // wird im Explorer als Typ angezeigt sStandard : String; // Inhalt des Eintrages (Standard) in der Registry sProgram : String; // vollständiger Pfad zum Programm sExt : String // zu verknüpfende Dateiendung ) : Boolean; var Reg : TRegistry; begin Result := True; Reg := TRegistry.Create; Reg.RootKey := HKEY_CLASSES_ROOT; Reg.OpenKey(sExt, True); try Reg.WriteString('', sFileType); except Result := False; end; Reg.CloseKey; if Result then begin Reg.OpenKey(sFileType, True); try Reg.WriteString('', sStandard); except // end; Reg.OpenKey('shell', True); Reg.OpenKey('open', True); Reg.OpenKey('command', True); try Reg.WriteString('',Format('"%s" "%s"',[sProgram,'%1'])); except // end; Reg.CloseKey; Reg.CloseKey; Reg.CloseKey; Reg.CloseKey; end; Reg.Free; end; // Aufruf: begin RegisterProg('BMP IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.bmp'); RegisterProg('JPG IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.jpg'); RegisterProg('JPG IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.jpeg'); end; Aufbau der INI-Datei:
Code:
Aufrufroutine bei die Nutzung einer Ini-Datei:
[JPEG]
FileType=JPG IrfanView Standard=IrfanView Program=c:\Programme\IrfanView\iview32_.exe Ext=.jpg [JPEG] FileType=JPG IrfanView Standard=IrfanView Program=c:\Programme\IrfanView\iview32_.exe Ext=.jpeg
Delphi-Quellcode:
und als Konsolenprogramm:
uses IniFiles;
var ini : TIniFile; sl : TStringList; i : Integer; sFileType : String; sStandard : String; sProgram : String; sExt : String; begin ini := TIniFile.Create('Verknüpfungen.ini'); sl := TStringList.Create; ini.ReadSections(sl); for i := 0 to sl.Count - 1 do begin sFileType := ini.ReadString(sl[i],'FileType',''); sStandard := ini.ReadString(sl[i],'Standard',''); sProgram := ini.ReadString(sl[i],'Program',''); sExt := ini.ReadString(sl[i],'Ext',''); RegisterProg(sFileType,sStandard,sProgram,sExt); end; sl.Free; ini.Free; end;
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses SysUtils, Registry, IniFiles, Windows, Classes; function RegisterProg( sFileType : String; // wird im Explorer als Typ angezeigt sStandard : String; // Inhalt des Eintrages (Standard) in der Registry sProgram : String; // vollständiger Pfad zum Programm sExt : String // zu verknüpfende Dateiendung ) : Boolean; var Reg : TRegistry; begin Result := True; Reg := TRegistry.Create; Reg.RootKey := HKEY_CLASSES_ROOT; Reg.OpenKey(sExt, True); try Reg.WriteString('', sFileType); except Result := False; end; Reg.CloseKey; if Result then begin Reg.OpenKey(sFileType, True); try Reg.WriteString('', sStandard); except // end; Reg.OpenKey('shell', True); Reg.OpenKey('open', True); Reg.OpenKey('command', True); try Reg.WriteString('',Format('"%s" "%s"',[sProgram,'%1'])); except // end; Reg.CloseKey; Reg.CloseKey; Reg.CloseKey; Reg.CloseKey; end; Reg.Free; end; function ReadIniFile(sIniFile : String) : Boolean; var ini : TIniFile; sl : TStringList; i : Integer; sFileType : String; sStandard : String; sProgram : String; sExt : String; begin Result := FileExists(sIniFile); if Result then begin WriteLn(Format('%s:',[sIniFile])); sl := TStringList.Create; ini := TIniFile.Create(sIniFile); ini.ReadSections(sl); for i := 0 to sl.Count - 1 do begin sFileType := ini.ReadString(sl[i],'FileType',''); sStandard := ini.ReadString(sl[i],'Standard',''); sProgram := ini.ReadString(sl[i],'Program',''); sExt := ini.ReadString(sl[i],'Ext',''); if RegisterProg(sFileType,sStandard,sProgram,sExt) then begin WriteLn(Format('Verknuepfung %s wurde erstellt.',[sFileType])); end else begin WriteLn(Format('Verknuepfung %s konnte nicht erstellt werden.',[sFileType])); end; end; ini.Free; sl.Free; end; end; var k : Integer; begin if ParamCount < 1 then begin WriteLn('Aufruf:'); WriteLn(Format('%s Ini-Datei [,Ini-Datei ... ,Ini-Datei]',[ParamStr(0)])); Halt(1); end; for k := 1 to ParamCount do begin if not ReadIniFile(ParamStr(k)) then begin WriteLn(Format('Die INI-Datei %s wurde nicht gefunden.',[ParamStr(k)])); end; end; end. |
AW: Datentypen in der Registry
Wahnsinn !
Das ist ja schon erheblich mehr als die erhofften Denkanstöße. Das werde ich mir gleich mal ansehen. Danke ! |
AW: Datentypen in der Registry
Liste der Anhänge anzeigen (Anzahl: 1)
Noch habe ich mich nicht dran gewagt, tatsächlich selbst Verknüpfungen in die Registry zu schreiben.
Aber der Tipp mit INI-Dateien ist wirklich gut. Anbei mal ein Zwischenstand als Anhang. Das ist alles noch etwas wirr, aber der Zweig HKEY_CLASSES_ROOT wird lesend ausgewertet. Dazu habe ich mich folgender Quelle bedient: ![]() Alle Verknüpfungen können nach unmterschiedlichen Kriterien als INI-Datei gespeichert werden. Außerdem habe ich die Möglichkeit eingebaut, mittels Textdateien, die pro Zeile eine Endung enthalten, zu prüfen, ob es dafür bereits Verknüpfungen gibt. Diese Dateien können nach bestimmten Kriterien angelegt werden, z.B. Audio, Grafik, Dokumente, Video usw. Ein paar Beispiele sind enthalten. Leider ist es aber so, daß bei weitem nicht alle zugewiesenen Dateitypen unter HKEY_CLASSES_ROOT gespeichert sind. Die meisten Sachen sind unter HKEY_CURRENT_USER, im Zweig "Software\Microsoft\Windows\CurrentVersion\Explore r\FileExts". Aber wie man das ausliest, habe ich noch nicht rausgefunden. Vielleicht kann mir da jemand weiterhelfen ? Ein besonderes Problem dabei sind "OpenWithList" und "OpenWithProgIds" ... Bevor ich Schreibfunktionen einbaue, möchte ich die Analyse komplettieren. Und bevor es dann soweit ist, muß noch die Möglichkeit eingebaut werden, die vorherigen Werte zu sichern und ggf. wieder herzustellen. Für jeden weiteren Rat bin ich dankbar. |
AW: Datentypen in der Registry
Festinstallierte Protable Programme?
Portables wird nicht fest installiert, denn das ist gegen seine Natür. Wie oft machst du sowas und wieviele PCs? Wenn man es öfters und und mehrmals macht, dann erstell dir doch ein eigenes Windows-Setup, wo gleich alles Wichtige drin ist. Men kann sowas auch durch Klonen der Festplatten erreichen. (machen die großen PC-Vermarkter auch nicht anders) ![]() Beim Klonen muß man nur estwas mit den Lizenzen auspassen, bzw. beim ersten Start jeweils eigene Lizenzen einrichten. ![]() Von vielen Programmen lassen sich die Setups per Batch ansteuern, womit du Diese sich auch selber richtig installieren lassen kannst. USB-Stick oder Netzlaufwerk mit den Setups und überall einmal starten. Auch wenn du es nicht hören wolltest ... Altes Delphi OK, aber wenn die PCs ins Internet gehen können sollen und das sowieso neu installiert wird, dann warum dann ein altes Windows? Stehen die PCs nur irgendwo gemeinsam rum, dann kannst du es auch mit Terminalserver (Windows) versuchen. Die Klienten entweder ohne eigenen Internetzugang oder auch gleich mit einem anderen OS. Da ist es dann auch egal wie alt und leistungsschwach diese PCs sind. |
AW: Datentypen in der Registry
Obwohl ich eigentlich nicht vorhatte, themenfremde Beiträge zu kommentieren:
portables nicht installieren, aber Dateien zuweisen, warum ? Installationen erzeugen unnützen Müll und beim Austauschen der Versionen reicht es, die Dateien in den entsprechenden Verzeichnisse zu ersetzen. Hätte ich welche der neueren (fürchterlichen) Firefox-Versionen fest installiert, hätte ich Probleme. Mit portables lassen sich auch unterschiedliche Versionen nutzen, indem einfach das Verzeichnis umbenannt wird. Warum überhaupt selbst zuweisen, statt es durch Programme machen zu lassen ? Microsoft selbst ist wohl das beste schlechte Vorbild für Hersteller anderer Anwenndungen, sich jeden nur denkbaren Dateityp zu krallen und entsprechend in der Regisry vermüllen. Für Audio-Dateien nehme ich z.B. lieber mplayerc statt VLC und mit Nero will ich z.B. nur ganz wenige Dateien geöffnet haben und z.B. die NRG-Dateien nicht standardmässig mit Nero Burning Rom, sondern mit ImageDrive. Warum alte Delphi-Versionen ? Als ich noch versucht habe, mit höheren Versionen als Delphi 1 erstellte Programme abwärtskompatibel zu dieser ersten Version zu gestalten, habe ich bemerkt, daß der umgekehrte Weg besser ist, also erst mit alten Versionen beginnen und erst danach auf Kompatibilität mit neuen Versionen herstellen. Momentan benutze ich weitgehend Delphi 5,solange etwas damit funktioniert. Nur wenn ich damit nicht auskomme, weil fremde Quelltexte eine höhere Version erfordern, benutze ich Delphi 7. Je neuer, desto komplexer, größere Exe-Dateien usw. Und nicht zuletzt ist es unzumutbar, erneut wahnsinnig viel Geld auszugeben, nur weil es etwas Neueres gibt, obwohl das Alte seine Funktionalität natürlich nicht verloren hat und das meiste damit funktioniert. Warum "veraltete" Windows-Versionen ? Hätten die Hardwarehersteller sich nicht durch Microsoft nötigen lassen, so daß alle neueren Möglichkeiten bzw. Geräte (z.B. Netzwerk, Scanner, Video) Windows erfordern, wüde ich es mit Sicherheit GAR NICHT benutzen. Windows 98 SE benötige ich noch für DOS, z.B. Assembler und Turbo Pascal. Im Windows-Modus sind (z.B. mit Delphi 1) noch nicht alle direkten Hardware-Zugriffe gesperrt. Alle späteren Versionen machen es Programmierern schwer. Außerdem gab es bei Windows 98 noch den bei späteren Versionen verschwundenen Midimapper. Der ist darum so wertvoll, weil es damit möglich ist, jedem Midikanal unterschiedliche Zielgeräte zuweisen zu können. Keine spätere Windows-Version bietet dies Möglichkeit mehr. Windows XP habe ich nur schwer akzeptieren gelernt. Ohne wäre mir die Nutzung bestimmter Hardware leider unmöglich (weil Hardware-Hersteller auch hier wieder der Erpressung durch Winzigweich gefolgt sind) und mit XP lassen sich endlich auch Festplatten-Kapazitäten nutzen, die angeblich schon für Windows 98 hätten gelten müssen. Warum keine neuen Windows-Versionen ? Je neuer, desto mehr Einschränkungen für den Anwender. Microsoft hat unter "Sicherheit" vor allem immer die eigene gemeint. Als ich mein Notebook kaufte, war Vista drauf. Allein die vielen neuen unnötigen "Dienste" waren mir ein Gräuel. Als mir dann der Konflikt zwischen automatischen Updates und einem Norton-Antivirusprogramm einen Totalcrash verursachte, habe ich nach Treibern für XP gesucht und Vista entsorgt. Ein Bekannter gab mir eine "Studentenversion" von Windows 7. Nach der Installation war ich entsetzt. Selbst Zusatztools, um z.B. HLP-Dateien lesen zu können und die alte Menüstruktur wenigstens teilweise nachbilden zu können, haben mir keine wirkliche Freude gebracht. Also weg auch damit und XP drauf. Warum Neues, nur weil es neu ist und alle meinen, sie müßten hinterher rennen, wenn es das Alte tut ?! Warum keine automatisierte Installation z.B. aus einer ISO-Datei o.ä. ? Weil die Rechner zwar identisch sind, aber anders eingerichtet werden sollen, was bereits bei der Festplatten-Partionierung beginnt. Das einzig Identische sollen die Portables sein. Übrigens ist die Hardware der alten Rechner neuer als die der meisten meiner anderen - und das für unter 20 € pro Stück. So, jetzt habe ich alles Genauestens dargelegt und werde mich dazu nicht mehr äussern. Das alles hat nämlich mit dem Thema absolut NICHTS zu tun. Es geht um die Registry und nichts anderes ! |
AW: Datentypen in der Registry
Die
Zitat:
Wenn ich das bei meinem XP in der Registry richtig sehe, verweisen die Einträge in den OpenWith... aber wieder auf Einträge unter HKEY_CLASSES_ROOT. Du solltest von daher dort keine neuen bzw. unter HKEY_CLASSES_ROOT nicht zu findende Verknüpfungen entdecken. Das Auslesen von
Delphi-Quellcode:
sollte in etwa so funktionieren:
HKEY_CURRENT_USER, im Zweig "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts"
Delphi-Quellcode:
Eigentlich musst Du die Logik, die Du schon implementiert hast nur geringfügig anpassen.
reg.rootkey := HKEY_CLASSES_ROOT;
if reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts', False) then ... |
AW: Datentypen in der Registry
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo !
Danke, daß Du mir meinen Ansatz angesehen hast. Wenn das mal so einfach wäre mit "Eigentlich musst Du die Logik, die Du schon implementiert hast nur geringfügig anpassen." ... :roll: Leider ist dabei nämlich nichts rausgekommen, obwohl ich Verschiedenes probiert habe. Allerdings stimmt es (wie ich gerade geprüft habe), daß der Zweig durch Zitat:
TypeName wird nicht gefunden, weil nicht vorhanden, entsprechend auch der Rest nicht. Es werden ausser der Extension keine weiteren Ergebnisse geliefert und darum taucht dann auch keine der gefundenen Extensions in der Gesamtliste auf. Die haben dann allenfalls "Application" und "ProgID", aber die meisten eben nur "OpenWithList" und "OpenWithProgIds". Die kann ich also leider nicht ignorieren, denn viele meiner Zuweisungen für IrfanView sind nur dort (unter HKEY_CURRENT_USER im von Dir genannten Zweig) eingetragen. Ausserdem möchte ich durchaus wählen können, ob ich z.B. eine HTML-Datei mit Notepad++ öffne oder mit einem der unterschiedlich vielen zur Auswahl stehenden Browser. Wenn mir da also jemand einen Rat geben könnte, wäre das super. Immerhin habe ich es jetzt (während des Schreibens des Beitrags teste ich) schon soweit geschafft, daß jetzt wenigstens schon die Extensions in die Liste übernommen werden. Aber wie ich an die paar vereinzelten "Application" und "ProgID" kommen soll, weiß ich nicht. Ich habe mal die momentane (noch sehr chaotische, weil unfertige) "Button2Click" als Textdatei angehängt. Einfach die bereits integrierte leere Prozedur ersetzen und im Objektinspektor "visible" auf true setzen. Vielleicht weißt Du da weiter ? Deine bisherigen Tipps waren jedenfalls schon sehr nützlich. Danke nochmal ! Außerdem habe ich festgestellt, daß die von mir abgewandelte Grundmethode nicht alle Einträge berücksichtigt. Das hatte ich erst gemerkt, nachdem ich die Unit von ![]() Nachtrag: Die hier angehängte Textdatei ist lediglich ein Replacement für eine gleichnamige (aber leere) Prozedur meines oben in der ZIP-Datei "reg.zip" enthaltenen Testes und ergibt (ohne dasselbe) wenig Sinn. Dieser Hinweis erfolgt, weil die Textdatei schon zweimal runtergeladen wurde, die ZIP-Datei aber nur einmal. Also nicht einfach die Textdatei runterladen und denken, die wäre für sich betrachtet irgendwie besonders informativ. Ganz im Gegenteil ! Das ist wirklich nur ein unfertiger Versuch, der bloß zusammen mit dem Testprog Sinn hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz