Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verknüpfung mit Dateitypen (https://www.delphipraxis.net/31483-verknuepfung-mit-dateitypen.html)

notErnie 10. Okt 2004 02:04


Verknüpfung mit Dateitypen
 
Hallo Delphi-Fachleute,

ich bräuchte mal Eure Hilfe.

Mein ZIP-Programm soll mit ZIP-Dateien verknüpft werden, sprich: Bei einem Doppelklick im Explorer auf eine ZIP-Datei soll die ZIP-Datei mit meinem Programm geöffnet werden.

Kein Problem, wenn ich als Administrator angemeldet bin, da kann ich nach HKEY_CLASSES_ROOT schreiben.

Wenn ich jedoch nur als Normalsterblicher angemeldet bin, natürlich (leider) nicht! :wall:

Programme wie WinZip oder IrfanView schaffen es aber trotzdem irgendwie, sich mit Dateitypen zu verknüpfen: Wie? :gruebel:

Besorgen sich die Programme mal kurzfristig höhere Rechte oder wie mogeln die sonst?

Bitte um Aufklärung!

vielen Dank für Eure Hilfe im Voraus,

Bert

Christian Seehase 10. Okt 2004 02:28

Re: Verknüpfung mit Dateitypen
 
Moin Bert,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Zitat:

Zitat von notErnie
Kein Problem, wenn ich als Administrator angemeldet bin, da kann ich nach HKEY_CLASSES_ROOT schreiben.
Wenn ich jedoch nur als Normalsterblicher angemeldet bin, natürlich (leider) nicht!

Seit Windows 2000 schon.

HKEY_CLASSES_ROOT setzt sich, seit W2K, aus den beiden Keys HKEY_LOCAL_MACHINE\Software\Classes und HKEY_CURRENT_USER\Software\Classes zusammen.
In letzterem sollte der Anwender grundsätzlich Schreibrechte haben.

Wir hatten auch erst vor kurzem einen Thread zu diesem Thema.

notErnie 11. Okt 2004 18:31

Re: Verknüpfung mit Dateitypen
 
Danke, habe den Thread gefunden, darin geht's auch nur mit/um
HKEY_CLASSES_ROOT :(

Bert

notErnie 13. Okt 2004 23:43

Re: Verknüpfung mit Dateitypen
 
Danke für Eure wohlwollende Hilfe!

Daß Ihr - wie ich - keine Ahnung habt...

Mal schauen, wie Irfan das macht.

Bert

Christian Seehase 14. Okt 2004 18:45

Re: Verknüpfung mit Dateitypen
 
Moin Bert,

wo ist das Problem?

:gruebel:

In HKEY_CURRENT_USER\Software\Classes hat der normale Anwender Schreibrechte.

notErnie 15. Okt 2004 17:27

Re: Verknüpfung mit Dateitypen
 
Naamd Chris.

War meine eigene Schusseligkeit, ich habe zip statt .zip in der Registry eintragen lassen :wall:

Funktioniert unter Win2k, aber Win98 zickt bei HKEY_CURRENT_USER\Software\Classes noch herum. Muß wohl noch eine OS-Versionsüberprüfung dazubasteln.

Danke nochmals für den Tip!

Gruß,
Bert

notErnie 15. Okt 2004 20:22

Re: Verknüpfung mit Dateitypen
 
Also jetzt klappts :zwinker:

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

//////////////////////////
HTH. Lässt sich aber sicher noch optimieren.

Ich hoffe mal, daß ich die "Delphi-Tags" richtig gesetzt habe :gruebel:

Dank an Mathias Simmack für sein IsAdmin.inc!

Ab damit in die Code-Library, damit's andere etwas leichter haben als ich :angel2:

Schönes Wochenende noch,
Bert

P.S. Wie markiert man eine Frage/ein Problem als gelöst?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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