Удаление ключа реестра в качестве последнего шага процедуры установки

Будучи новичком в «Inno Setup» и «Inno Script Studio», я теперь хочу удалить с помощью Reg-Delete ключ, который был создан во время одной из установок, включенных в мой установщик. Это означает, что это должен быть самый последний шаг, потому что ключ не будет существовать в более раннее время моей процедуры установки.

На самом деле мне не хватает только правильного синтаксиса Pascalscript.

Я знаю, как я могу сделать это через часть [Registry], однако тогда я не знал бы, как это сделать в качестве последнего шага.

[Registry]
Root: "HKLM"; Subkey: "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Example"; Flags: deletekey

В разделе [Code] я попытался сделать это последним шагом, но компилятор продолжает говорить мне, что моя команда неизвестна:

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    Log('Installation finished. Deleting connection string.');
    RegDeleteKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run', 'Example');
  end;
end;

"RegDeleteKey" не является существующей командой. Просматривая команды, я нашел только «RegQueryStringValue», «RegWriteStringValue», «RegDeleteStringValue» (не будет работать) - это все не то, что я ищу. Я хочу удалить ключ, независимо от его значения. В надежде, что решение простое... заранее спасибо.


person Yauhun    schedule 03.02.2017    source источник
comment
comment
@ Скотт - нет, это не так, потому что я действительно проверил тему, на которую вы ссылаетесь. Тем не менее, я хочу удалить ключ в конце моей процедуры установки, если вы работали с Inno Setup, вы будете знать, что раздел [Реестр] всегда будет запускаться первым, что является проблемой, и нет приведенного примера [Код] в вашей связанной теме, которая мне действительно нужна. Вы знаете, что это не дубликат, проверив мой первый раздел кода выше, я продвинулся на один шаг вперед в своем вопросе - это означает, что вы действительно не нашли время, чтобы понять мою проблему, когда уже искали дубликаты.   -  person Yauhun    schedule 03.02.2017
comment
Я использую innosetup, и у меня есть несколько живых проектов, использующих его. Я не понимаю, как это не дубликат? Вам не нужно будет выполнять какие-либо команды после установки, потому что, если раздел реестра является избыточным и больше не используется, тогда не имеет значения, когда innosetup вызывает команду — это можно сделать прямо в самом начале процесса установки. Таким образом, пока объявление реестра находится вверху, он удалит нарушающий раздел реестра при запуске установки (без необходимости в каком-либо разделе [Код]), что не имеет значения для времени удаления избыточного ключа.   -  person Scott    schedule 03.02.2017
comment
@Scott ключ создается во время установки. Если я попытаюсь удалить ключ в начале моей процедуры, ключ еще даже не будет существовать, поэтому он мне нужен в качестве последнего шага. Я уже написал это в первом предложении выше. Я уже протестировал удаление с помощью команды [Registry]-part-command, однако, когда я делаю это таким образом, ключ все еще будет там после установки остальных, что имеет смысл, если установка создает ключ. Если вы посмотрите мой пример кода, вы увидите, что здесь я зашел в раздел кода только потому, что хочу объявить это последним шагом.   -  person Yauhun    schedule 06.02.2017
comment
ОК, справедливое замечание - я прочитал ваш исходный вопрос, поскольку вы создали его во время предыдущего установочного пакета, то есть более старого сценария innosetup, и вы хотели, чтобы новый сценарий удалил его.   -  person Scott    schedule 09.02.2017


Ответы (2)


Попробуйте RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run','Example');

person RN92    schedule 29.06.2017

Это RegDeleteKeyIncludingSubkeys:
https://jrsoftware.org/ishelp/index.php?topic=isxfunc_regdeletekeyвключаяподключи

person Martin Prikryl    schedule 03.02.2017
comment
Я понимаю. Все еще получая ошибку в той же строке, я думаю, мне также нужно добавить, что это строка? - person Yauhun; 03.02.2017
comment
В случае, если это поможет: Ошибка компилятора говорит о недопустимом количестве параметров. Я все еще что-то упускаю? - person Yauhun; 03.02.2017
comment
На самом деле ключ Microsoft\Windows\CurrentVersion\Run не содержит подразделов. Он содержит только значения. Итак, почему вы пытаетесь удалить ключ? Разве Example на самом деле не является значением? Используйте RegDeleteValue. - person Martin Prikryl; 03.02.2017
comment
Хорошо, ни одна из команд у меня не сработала, в конце установки Example все еще там. Однако теперь компилятор не жалуется. Однако до сих пор нет решения. Reg-путь правильный... EXE выполняется от имени администратора. У меня снова нет идей. - person Yauhun; 07.02.2017
comment
Покажите нам экспорт реестра Run, чтобы мы, наконец, узнали, что именно вы пытаетесь удалить (ключ или значение) + Покажите нам свой код, используя RegDeleteValue (я все еще предполагаю, что Example является значением, если вы не показать иначе). - person Martin Prikryl; 07.02.2017
comment
Да, извините, мой плохой, забыл добавить, что это ценность. Приведенный выше пример остается прежним (в [Code]), я просто заменил, как вы рекомендовали, RegDeleteValue. С помощью обходного пути я могу решить эту проблему, запустив небольшой скрипт в конце процедуры установки, который удаляет значение, полностью удаляя [Code]-Section, однако это не то решение, которое я хотел... - person Yauhun; 07.02.2017
comment
Я проверил ваш точный код сейчас. И это работает. Покажите нам экспорт раздела реестра Run. - person Martin Prikryl; 07.02.2017
comment
Вы протестировали эту часть кода, и да, она работает автономно, просто кажется, что она запускается в неподходящее время, поэтому не имеет никакого эффекта, если значение не существует в это время. Setup.exe запускает несколько установок и запускается одна за другой. 1-й: создание папки, вставка всех файлов, 2-й: запуск Installer1 (создает строку реестра!), 3-й: запуск Installer2, 4-й: предполагается удаление ключа на этом этапе всей процедуры установки, 5-й: конец, больше никаких действий . Возможно ли, что это все еще работает не в том месте, даже CurStep = ssPostInstall? (Надеюсь, я передам то, что хочу сказать...) - person Yauhun; 07.02.2017
comment
Если вы знаете, что код работает, и просто вызывается не вовремя, вы должны были сказать нам об этом в самом начале! Но в любом случае, если ваш код плохо спроектирован, CurStep = ssPostInstall должно быть одним из самых последних событий. Но мы вряд ли сможем узнать, если вы не покажете нам соответствующий код. - person Martin Prikryl; 07.02.2017
comment
Я просто пришел к такому выводу, не скрывая информации. Когда вы тестировали, я делал. В разделе [Code] больше нет кода для отображения. Две предыдущие установки находятся под [Run], а дальше ничего нет. Я использовал тот же код раньше, чтобы создать ключ в конце установки, поэтому я ожидал, что это будет работать для удаления наоборот, и не ожидал проблемы в порядке. Готов показать вам больше, если вы все еще хотите помочь, извините за отсутствие опыта и понимания, просто занимаюсь этим для хобби. Система говорит мне перенести обсуждение в чат - если вы еще не устали. - person Yauhun; 07.02.2017
comment
С одной стороны, вы пишете, что он работает автономно, с другой стороны, вы пишете, что больше нечего показывать. Это звучит противоречиво для меня. Опубликуйте минимально воспроизводимый пример. - person Martin Prikryl; 07.02.2017
comment
Под этим я подразумеваю, что если я запущу эту часть отдельно, вручную, после всей установки как второй EXE-файл только с этим заданием, он удалит значение, которое я хочу удалить. Тем не менее, в разделе [Code] это все, что у меня есть, так что да, и то, и другое я сказал правильно, говоря только о разделе кодирования, я показал вам все, что у меня есть. Даже мой английский не идеален, думаю, это понятно. Если мы не можем найти решение здесь, это не проблема, это была просто попытка. Я все еще думаю об этом дальше, и пока мой обходной путь приемлем. - person Yauhun; 08.02.2017
comment
Поэтому начните с полного кода установщика и продолжайте сокращать его, пока не найдете минимальный код, который все еще воспроизводит проблему. Просто дикая догадка: запись Example создается каким-то субустановщиком, верно? Вы уверены, что ждете, пока подустановщик полностью завершит работу? Разве это не все еще работает в фоновом режиме, пока основной (Inno Setup) установщик завершает работу (и вызывает RegDeleteValue? - Что произойдет, если вы задержите удаление, используя Sleep(10000) перед RegDeleteValue? - person Martin Prikryl; 08.02.2017