const PlayerExts = 'SOFTWARE\testing\';
const WMPOpenMaxExt = 52;
var
WMPCount: Integer;
procedure WMPOpenSemiEnd;
var
WMPNum: TArrayOfString;
WMPExt: string;
I: Integer;
begin
//entries ending with a semicolon will break WMP
if RegGetValueNames(HKLM, PlayerExts + 'Types', WMPNum) then
for I := 0 to GetArrayLength(WMPNum)-1 do
if RegQueryStringValue(HKLM, PlayerExts + 'Types', WMPNum[I], WMPExt) then
while WMPExt[Length(WMPExt)] = ';' do
begin
Delete(WMPExt, Length(WMPExt), 1);
RegWriteStringValue(HKLM, PlayerExts + 'Types', WMPNum[I], WMPExt);
end;
end;
function WMPOpenCount: Integer;
var
WMPNum: TArrayOfString;
WMPExt: string;
I: Integer;
begin
Result := 0;
if RegGetValueNames(HKLM, PlayerExts + 'Types', WMPNum) then
for I := 0 to GetArrayLength(WMPNum)-1 do
if RegQueryStringValue(HKLM, PlayerExts + 'Types', WMPNum[I], WMPExt) then
begin
if WMPExt <> '' then
begin
Result := Result+1;
while Pos(';', WMPExt) > 0 do
begin
Result := Result+1;
Delete(WMPExt, Pos(';', WMPExt), 1);
end;
end;
end;
end;
procedure WMPOpenExt(Name: string; Exts: string; Desc: string; AddCount: Integer);
var
WMPNum: TArrayOfString;
WMPExt: string;
TempExt: string;
I: Integer;
begin
if WMPCount < WMPOpenMaxExt then
begin
//current naming used in CCCP, no one else follows this scheme so it should be safe
if RegValueExists(HKLM, PlayerExts + 'Types', Uppercase(Name)) then Exit;
if RegGetValueNames(HKLM, PlayerExts + 'Types', WMPNum) then
for I := 0 to GetArrayLength(WMPNum)-1 do
begin
RegQueryStringValue(HKLM, PlayerExts + 'Types', WMPNum[I], WMPExt);
//searching within current strings for generic Name
if Pos('.' + Name + ';', Lowercase(WMPExt)) > 0 then Exit;
if Pos('.' + Name, Lowercase(WMPExt)) > 0 then
if Length(WMPExt) = (Pos('.' + Name, Lowercase(WMPExt))+Length(Name)) then Exit;
end;
//parses Exts input if there are too many extensions and removes off the end
while ((WMPCount+AddCount) > WMPOpenMaxExt) and (AddCount > 0) do
begin
TempExt := '';
for I := 1 to (AddCount-1) do
begin
TempExt := TempExt+Copy(Exts, 1, Pos(';', Exts));
Delete(Exts, 1, Pos(';', Exts));
end;
if TempExt[Length(TempExt)] = ';' then
Delete(TempExt, Length(TempExt), 1);
AddCount := AddCount-1;
Exts := TempExt;
end;
if (WMPCount+AddCount) <= WMPOpenMaxExt then
begin
WMPCount := WMPCount+AddCount;
RegWriteStringValue(HKLM, PlayerExts + 'Types', Uppercase(Name), Exts);
RegWriteStringValue(HKLM, PlayerExts + 'Descriptions', Uppercase(Name), Desc + ' (' + Exts + ')');
RegWriteStringValue(HKLM, PlayerExts + 'MUIDescriptions', Uppercase(Name), Desc);
end;
end;
end;
procedure ExUsage;
begin
WMPOpenSemiEnd;
WMPCount := WMPOpenCount;
WMPOpenExt('mkv', '*.mkv;*.mka', 'Matroska Media file');
WMPOpenExt('ogm', '*.ogm', 'Ogg Media file');
end;