![]() |
Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Der Sourcecode ermöglicht es, einen Dateityp mit einem Programm zu verknüpfen, d.h. bei einem Doppelklick im Explorer wird die Datei (des Dateityps) mit dem verknüpften Programm geöffnet.
Im Sourcecode wird ganz brauchbar unterschieden zwischen: Windows-Versionen (Win3X, Win9X und WinNT4/Win2K/WinXP) und den Rechten der Benutzer unter Windows ab NT4 (Administrator oder Normalsterbliche). Win9X: Das Programm wird mit dem Dateityp direkt und sofort verknüpft! Ab WinNT4 (Win2K, WinXP) überprüft der Sourcecode, ob man gerade als Administrator angemeldet ist. Falls NEIN, wird der Dateityp *nur* für den gerade angemeldeten Benutzer registriert.
Delphi-Quellcode:
Bert
//----von Mathias Simmacks "IsAdmin.inc" (TFileTypeRegistration.zip) geklaut:
function GetAdminSid: PSID; const // bekannte SIDs ... (WinNT.h) SECURITYNTAUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); // bekannte RIDs ... (WinNT.h) SECURITYBUILTINDOMAINRID: DWORD = $00000020; DOMAINALIASRIDADMINS: DWORD = $00000220; begin Result := nil; AllocateAndInitializeSid(SECURITYNTAUTHORITY, 2, SECURITYBUILTINDOMAINRID, DOMAINALIASRIDADMINS, 0, 0, 0, 0, 0, 0, Result); end; //----von Mathias Simmacks "IsAdmin.inc" (TFileTypeRegistration.zip) geklaut: function IsAdmin: LongBool; var TokenHandle: THandle; ReturnLength: DWORD; TokenInformation: PTokenGroups; AdminSid: PSID; Loop: Integer; wv: TOSVersionInfo; begin wv.dwOSVersionInfoSize := sizeof(TOSversionInfo); GetVersionEx(wv); Result := (wv.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS); if (wv.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin TokenHandle := 0; if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then try ReturnLength := 0; GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength); TokenInformation := GetMemory(ReturnLength); if Assigned(TokenInformation) then try if GetTokenInformation(TokenHandle, TokenGroups, TokenInformation, ReturnLength, ReturnLength) then begin AdminSid := GetAdminSid; for Loop := 0 to TokenInformation^.GroupCount - 1 do begin if EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) then begin Result := True; break; end; end; FreeSid(AdminSid); end; finally FreeMemory(TokenInformation); end; finally CloseHandle(TokenHandle); end; end; end; //------------------------ ////////////////////////// function WVersion: string; var OSInfo: TOSVersionInfo; begin Result := '3X'; OSInfo.dwOSVersionInfoSize := sizeof(TOSVERSIONINFO); GetVersionEx(OSInfo); case OSInfo.dwPlatformID of VER_PLATFORM_WIN32S: begin Result := '3X'; Exit; end; VER_PLATFORM_WIN32_WINDOWS: begin Result := '9X'; Exit; end; VER_PLATFORM_WIN32_NT: begin Result := 'NT'; Exit; end; end; //case end; procedure registerfiletype(Handle: HWnd; ft, key, desc, icon, prg: string); // Benutzung z.b. für ZIP-Dateien: // registerfiletype(Handle, '.zip', '', 'Zip-Archiv', paramstr(0) + ',1', paramstr(0)); var myReg: TRegIniFile; wo: byte; begin if WVersion = '3X' then begin //MessageBox(Handle, 'Window 3.x wird nicht unterstützt.', 'Information', mb_IconInformation); exit; end; wo := pos('.', ft); while wo > 0 do begin delete(ft, wo, 1); wo := pos('.', ft); end; if (ft = '') or (prg = '') then exit; if pos('*', ft) <> 0 then exit; if pos('?', ft) <> 0 then exit; ft := '.' + ft; try myReg := TRegIniFile.create(''); if (WVersion = '9X') or (IsAdmin = true) then begin //MessageBox(Handle, 'Admin-Rechte oder Win9x.', 'Information', mb_IconInformation); myReg.RootKey := HKEY_CLASSES_ROOT; key := ExtractFileName(Application.ExeName) + copy(ft, 2, maxint); end else begin myReg.RootKey := HKEY_CURRENT_USER; key := '\Software\Classes\.' + copy(ft, 2, maxint); end; myReg.WriteString(ft, '', key); myReg.WriteString(key, '', desc); if icon <> '' then myReg.WriteString(key + '\DefaultIcon', '', icon); myReg.WriteString(key + '\shell\open\command', '', '"' + prg + '" "%1"'); finally myReg.free; end; SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); MessageBox(Handle, PChar('Der Dateityp "*' + ft + '" wurde mit ' + ExtractFileName(Application.ExeName) + ' verknüpft.'), 'Information', mb_IconInformation); end; ////////////////////////// [edit=Chakotay1308]Delphi-Tags und Beschreibung eingefügt. Mfg, Chakotay1308[/edit] |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Hi Bert,
Zitat:
Danke, Chris [edit]Wenn du noch [delphi]- statt [code]-Tags verwenden könntest, würde sich die Lesbarkeit deutlich verbessern. Danke.[/edit] |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Hallo Chakotay1308/Chris!
Wenn ich wüsste, wie man statt Code-Tags Delphi-Tags setzt, hätte ich es wohl getan. Da ich neu hier bin - und ein 56k-Modem benutze - bin ich auch etwas "kurzangebunden". Daher "klemmt" es hin und wieder auch, wenn ich irgendwas posten will (Zeitschleife=Murmeltier, falls Du den genialen Film kennst). Du kannst/darfst meine Beitrag gerne be-/überarbeiten. ====== My famous last words ("Beschreibende Worte"): Der Sourcecode ermöglicht es, einen Dateityp mit einem Programm zu verknüpfen, d.h. bei einem Doppelklick im Explorer wird die Datei (des Dateityps) mit dem verknüpften Programm geöffnet. Im Sourcecode wird ganz brauchbar unterschieden zwischen: Windows-Versionen (Win3X, Win9X und WinNT4/Win2K/WinXP) und den Rechten der Benutzer unter Windows ab NT4 (Administrator oder Normalsterbliche). Win9X: Das Programm wird mit dem Dateityp direkt und sofort verknüpft! Ab WinNT4 (Win2K, WinXP) überprüft der Sourcecode, ob man gerade als Administrator angemeldet ist. Falls NEIN, wird der Dateityp *nur* für den gerade angemeldeten Benutzer registriert. Ansonsten: Siehe Sourcecode :wall: ====== Reicht Dir/Euch das, oder soll ich auch noch erklären, warum 2+2=5 manchmal trotzdem 2+2=4 (for normal values of 2) ist? 42 freundliche Grüße, Bert P.S. Neben dem Murmeltier gibt es auch noch einen anderen, wirklich sehr guten Zeitschleifenfilm: "12:01". |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Hi,
habe das jetzt für dich erledigt. ;) Generell kannst du deine Beiträge über den http://www.delphipraxis.net/template.../icon_edit.gif-Button editieren. Delphi-Tags kannst du als Alternative für die [code]-Tags verwenden. Also statt [ code]...[ /code] einfach [ delphi][ /delphi] (ohne die Leerzeichen natürlich) schreiben. Chris |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Dankeschön!
Bert P.S. Lieber Chakotay1308! Du hast über dreitausend Beiträge geschrieben und bist erst ma grade fufzehn Jahre alt? Glaube ich Dir irgendwie nicht so ganz... Kann ich Dich notfalls irgendwie adoptieren :shock: mfg |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
^ push (weil's so nett und hilfreich ist) ^
[...] [edit=Chakotay1308]Zitat rausgeschnitten, weil es den Beitrag unnötig lang macht und der gesamte Text bereits oben im ersten Beitrag zu finden ist. Mfg, Chakotay1308[/edit] |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Warum wird das jetzt hier bitte sehr gepusht? Der soll doch in die Code-Lib aufgenommen werden und stellt kein Problem dar oder sehe ich das falsch?
Geschlossen Edit: Ich öffnen diesen Thread wieder, damit eventuell noch weiter diskutiert werden kann. ich muss zugeben, dass ichmit dem Schließen wohl etwas voreilig war. Ich dürfte dich, notErnie, aber bitten es zu unterlassen diesen Thread noch mals zu pushen. Es handelt sich um einen Beitrag der in die Code-Lib aufgenommen werden soll. Es ist deshalb unnötig ihn zu pushen. Er wird noch ein, zwei Wochen zur Diskussion hier stehen bleiben und dann entsprechend einsortiert werden. |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Danke, Luckie.
Aber schon durch meine Antwort wird der Thread wohl schon wieder gepusht, oder? Logische Fallen erkennt man erst, wenn man drin gefangen ist :wall: notErnie sprich: Bert |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Macht dein Code sowas wie
![]() |
Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Vllt. ein paar Worte von mir, die bitte nicht falsch zu verstehen sind --
Ich habe die "TFileTypeRegistration"-Klasse u.a. geschrieben, weil ich mit dem Prinzip von Funktionen wie dieser Zitat:
Mal abgesehen davon sind Variablennamen wie "ft" nicht wirklich aussagekräftig. Dein Programm vergrößert sich nicht, wenn du stattdessen einen Klarnamen wie "Extension" o.ä. benutzt. ;) Bei meiner Klasse gibt´s dieses Problem nicht. Beginnt man mit dem Registrieren eines Dateityps, dann gelten alle darauf folgenden Aktionen auch für diesen Typ:
Delphi-Quellcode:
usw.
ftr := TFileTypeRegistration.Create;
if(ftr <> nil) then try if(ftr.RegisterType('.foo','FooFile','FOO Description', 'c:\folder\icon.ico')) then begin ftr.AddHandler('open','"c:\folder\foo.exe" "%1"'); ftr.AddHandler('print','"c:\folder\foo.exe" /p "%1"'); ftr.AddHandler('edit','notepad.exe "%1"'); { ... } end; finally FreeAndNil(ftr); end; Warum ich das erwähne? Ganz einfach: Offenbar kennst du meine Klasse, wie ich an "IsAdmin" (von Nico, btw) erkenne: Zitat:
btw: Jemand (;)) sollte mal den einzigen bisher gefundenen ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 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