Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateitypen mit Programm verknüpfen (ohne Admin-Rechte) (https://www.delphipraxis.net/31934-dateitypen-mit-programm-verknuepfen-ohne-admin-rechte.html)

notErnie 15. Okt 2004 21:07


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:
//----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;

//////////////////////////
Bert

[edit=Chakotay1308]Delphi-Tags und Beschreibung eingefügt. Mfg, Chakotay1308[/edit]

CalganX 15. Okt 2004 21:12

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
 
Hi Bert,
Zitat:

Zitat von notErnie
Bin ich hier in einer Endlos-Schleife oder grüßt mich täglich das Murmeltier?

könntest du vielleicht etwas mehr zu deinem SourceCode sagen? ;) Zwar sagt dein Titel, was der SourceCode soll, aber ein paar beschreibende Worte wären schon nicht schlecht.

Danke,
Chris

[edit]Wenn du noch [delphi]- statt [code]-Tags verwenden könntest, würde sich die Lesbarkeit deutlich verbessern. Danke.[/edit]

notErnie 15. Okt 2004 22:31

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".

CalganX 15. Okt 2004 22:40

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

notErnie 15. Okt 2004 23:12

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

notErnie 16. Okt 2004 00:03

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]

Luckie 16. Okt 2004 00:04

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.

notErnie 16. Okt 2004 14:45

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

Matze 16. Okt 2004 15:41

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
 
Macht dein Code sowas wie dieser bereits vorhandene Code?

MathiasSimmack 16. Okt 2004 15:45

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:

Zitat von notErnie
Delphi-Quellcode:
procedure registerfiletype(Handle: HWnd; ft, key, desc, icon, prg: string);

nie ganz zufrieden war. Manchmal möchte/muss man für den gleichen Dateityp verschiedene Aktionen registrieren. Soll heißen: Man muss die Funktion mehrmals aufrufen. Ein Tippfehler bei der Angabe der Endung o.ä., und dann geht die Fehlersuche los. :?
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:
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;
usw.

Warum ich das erwähne? Ganz einfach: Offenbar kennst du meine Klasse, wie ich an "IsAdmin" (von Nico, btw) erkenne:
Zitat:

Delphi-Quellcode:
//----von Mathias Simmacks "IsAdmin.inc" (TFileTypeRegistration.zip) geklaut:

Du hättest also bspw. die Klasse umschreiben bzw. erweitern können, so dass eben nicht mehr in HKEY_CLASSES_ROOT, sondern in HKCU gespeichert wird. Damit wäre der Komfort erhalten geblieben, denn am Prinzip der Typregistrierung ändert sich nämlich nichts.


btw: Jemand (;)) sollte mal den einzigen bisher gefundenen Bug in der Unit mal fixen und diese dann neu anhängen. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
Seite 1 von 2  1 2      

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