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