AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)
Thema durchsuchen
Ansicht
Themen-Optionen

Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

Ein Thema von notErnie · begonnen am 15. Okt 2004 · letzter Beitrag vom 21. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
notErnie
(Gast)

n/a Beiträge
 
#1

Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 15. Okt 2004, 22:07
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 = '3Xthen
  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]
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 15. Okt 2004, 22:12
Hi Bert,
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]
  Mit Zitat antworten Zitat
notErnie
(Gast)

n/a Beiträge
 
#3

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 15. Okt 2004, 23:31
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
======

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".
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 15. Okt 2004, 23:40
Hi,
habe das jetzt für dich erledigt.
Generell kannst du deine Beiträge über den -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
  Mit Zitat antworten Zitat
notErnie
(Gast)

n/a Beiträge
 
#5

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 16. Okt 2004, 00:12
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

mfg
  Mit Zitat antworten Zitat
notErnie
(Gast)

n/a Beiträge
 
#6

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 16. Okt 2004, 01:03
^ 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]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 16. Okt 2004, 01:04
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
notErnie
(Gast)

n/a Beiträge
 
#8

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 16. Okt 2004, 15:45
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

notErnie sprich:

Bert
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 16. Okt 2004, 16:41
Macht dein Code sowas wie dieser bereits vorhandene Code?
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: Dateitypen mit Programm verknüpfen (ohne Admin-Rechte)

  Alt 16. Okt 2004, 16:45
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 von notErnie:
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:
//----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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz