![]() |
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 |
Re: Verknüpfung mit Dateitypen
Moin Bert,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Zitat:
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. |
Re: Verknüpfung mit Dateitypen
Danke, habe den Thread gefunden, darin geht's auch nur mit/um
HKEY_CLASSES_ROOT :( Bert |
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 |
Re: Verknüpfung mit Dateitypen
Moin Bert,
wo ist das Problem? :gruebel: In HKEY_CURRENT_USER\Software\Classes hat der normale Anwender Schreibrechte. |
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 |
Re: Verknüpfung mit Dateitypen
Also jetzt klappts :zwinker:
Code:
HTH. Lässt sich aber sicher noch optimieren.
//----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; ////////////////////////// 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