Код автоматической правки реестра Windows. - вопрос №3084632

Здравствуйте, мне нужна помощь в разборе небольшого примера кода автоматической правки реестра Windows. Вот этот код. Точнее, пример кода, куда как я понимаю вместо переменных нужно вставить свои значения и пути. Задача кода — править в реестре Windows 4 байта в блоке данных под названием Filterdata. Эти байты отвечают за приоритет (merit) одного системного сплиттера отвечающего за воспроизведение видео в Mpeg 2. Особенность кода в том, что он правит только эти 4 байта в блоке, а не заменяет его весь целиком как при стандартной операции импорта данных в реестр. Такое точечное редактирование требуется в связи с тем, что в разных версиях Windows блок Filterdata содержит немного разные данные, а байты приоритета (merit) и их расположение всегда одинаковые, поэтому правятся только они.

procedure SetMeritHelper(rootkey: Integer; clsid: String; b1, b2, b3, b4: Byte);
var
filterdata: AnsiString;
begin
if RegQueryBinaryValue(rootkey,
'CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86}\Instance\' + clsid,
'FilterData', filterdata) then begin
if Length(filterdata) < 16 then begin
Log('Invalid filterdata for ' + clsid);
exit;
end;
filterdata[5] := Chr(b1);
filterdata[6] := Chr(b2);
filterdata[7] := Chr(b3);
filterdata[8] := Chr(b4);
RegWriteBinaryValue(rootkey, CLSID_ACTIVEMOVIE_INSTANCE + clsid,
'FilterData', filterdata);
end;
end;
end;

procedure SetMerit32(clsid: String; b1, b2, b3, b4: Byte);
begin
SetMeritHelper(HKCR32, clsid, b1, b2, b3, b4);
end;

procedure SetMeritUnlikely32(clsid: String);
begin
SetMerit32(clsid, 0, 0, 64, 0);
end;

Проблема в том что я никак не могу заставить его работать, а работать он должен в установщике на Inno setup.

С помощью гугла и моих поверхностных знаний удалось понять что RegQueryBinaryValue в коде это у нас чтение данных ключа. В скобках по ходу самим надо прописывать вместо rootkey — HKEY_CLASSES_ROOT ну и т.д. Потом небольшое условие, если содержание параметра меньше 16, то ничего не делаем, как я понял. Дальше идёт перечисление целевых байт, ну а потом судя по всему, операция записи наших данных RegWriteBinaryValue. Вот только не понятно, что здесь делает название другого раздела CLSID_ACTIVEMOVIE_INSTANCE — думаю, оно попало сюда по ошибке. Просто человек который дал мне этот код, забыл поправить, и здесь должен быть тот же путь что и в 1-й операции. Ведь дальше идёт описание самой процедуры, ну и в конце нужно ввести свой приоритет SetMerit32(clsid, 0, 0, 64, 0) и всё.

Вообщем, не смотря на все мои усилия код так и не заработал, надеюсь местные знатоки по синтаксису Delphi подскажут что тут и как. Заранее всем благодарен.

Вот Файл целевого ключа реестра.


Дополнение автора от 08.12.18 14:52:47
HFS, да, вы правы, в таком случае это программная правка, а вот насчёт отступов, я мало что смыслю в коде и программировании, поэтому к своему стыду боюсь что корректно отступы оформить не сумею.
Хм, по правке реестра, понятно, спасибо, видимо так это и работает, тогда мне главное чтобы код правильно считывал имеющиеся данные в блоке, и записывал их обратно, изменяя при этом четыре байта с 5-8 на нужные мне значения.
08.12.18
1 ответ

Ответы

ну давайте чуть помедленнее начнем:
1 — такая правка, скорее должна бы называться «программной» а не «автоматической» (автоматизм в программировании, обычно является реакцией на какое то внешнее событие) так вас будут лучше понимать
2 — код без отступов читать практически невозможно. и это тоже к вопросу хорошего понимания
3 — реестр винды не предполагает возможности правки 4х байтов бинарного блока. читаем блок, выборочно правим, пишем обратно. как то так. можно и подробнее, но после правки по п1 и п2
08.12.18
Посмотреть всех экспертов из раздела Технологии > Delphi
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store