Как можно расшарить ключи реестра для нескольких программ в InstallShiled X (хотя этот же вопрос и для более ранних версий)?
Ключи и параметры реестра задаю статически в окне формирования структуры реестра.
Есть 2 программы, создающие одинаковые параметры реестра.
Мне надо, чтобы они удалялись только при удалении последней пограммы. Как это можно сделать? Я нашел только галочку у ключей реестра "Shared among several applications", но это не помогает (при установке двух программы и удалении одной из них ключи удаляются). А у самих параметров есть галочка "Remove during Uninstall" (снятие ее приводит к тому, что параметры не удаляются).
Мне не очень хочется создавать параметры реестра руками, поэтому прошу совета.
Здравствуйте, Larev, Вы писали:
L>Как можно расшарить ключи реестра для нескольких программ в InstallShiled X (хотя этот же вопрос и для более ранних версий)?
L>Ключи и параметры реестра задаю статически в окне формирования структуры реестра.
L>Есть 2 программы, создающие одинаковые параметры реестра.
L>Мне надо, чтобы они удалялись только при удалении последней пограммы. Как это можно сделать?
Буду говорить про версию 6.22
Shared работает кое-как для файлов, с ключами реестра не эксперементировал. Предлагаю такой вариант: поскольку программы инеют общие ключи реестра, нужно запись в реестр производить после установки общей компоненты обеих программ и в этом же ключике хранить счетчик установленных общих компонент.
В процессе деинсталляции в ответ на событие удаления общей компоненты уменьшать счетчик. И как только он станет равным нулю, убивать ключ.
Примерный код:
ComponentEvents.rul
export prototype Core_Installed();
function Core_Installed()
NUMBER nvSize, nCounter, nvType;
STRING szValueName, szValue, szKey;
begin
szValueName = "Counter";
nvType = REGDB_NUMBER;
nvSize = -1;
// читаем из общей ветки значение счетчика и увеличиваем его
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szKey = "Software" ^ @COMPANY_NAME ^ @PRODUCT_COMMON;
if (RegDBGetKeyValueEx(szKey, szValueName, nvType, szValue, nvSize) < 0) then
// значение не найдено, т.е. это первая копия, поэтому счетчик установим в 1
nCounter = 1;
else
StrToNum(nCounter, szValue);
nCounter = nCounter + 1;
endif;
NumToStr(szValue, nCounter);
RegDBSetKeyValueEx(szKey, szValueName, nvType, szValue, nvSize);
end;
export prototype Core_UnInstalled();
function Core_UnInstalled()
NUMBER nvSize, nCounter, nvType;
STRING szValueName, szValue, szKey;
begin
szValueName = "Counter";
nvType = REGDB_NUMBER;
nvSize = -1;
// читаем из общей ветки значение счетчика и уменьшаем его
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szKey = "Software" ^ @COMPANY_NAME ^ @PRODUCT_COMMON;
RegDBGetKeyValueEx(szKey, szValueName, nvType, szValue, nvSize);
StrToNum(nCounter, szValue);
nCounter = nCounter - 1;
if (nCounter > 0) then
// обновим значение счетчика
NumToStr(szValue, nCounter);
RegDBSetKeyValueEx(szKey, szValueName, nvType, szValue, nvSize);
else
// Последняя копия программы, использующей общий ключ
RegDBDeleteKey(szKey);
endif;
end;
Здравствуйте, siberia, Вы писали:
S>Здравствуйте, Larev, Вы писали:
S>только дописывать инсталлятор
Спасибо.