Как расшарить ключи реестра для неск. программ в InstShield?
От: Larev  
Дата: 28.09.04 19:39
Оценка:
Как можно расшарить ключи реестра для нескольких программ в InstallShiled X (хотя этот же вопрос и для более ранних версий)?
Ключи и параметры реестра задаю статически в окне формирования структуры реестра.
Есть 2 программы, создающие одинаковые параметры реестра.
Мне надо, чтобы они удалялись только при удалении последней пограммы. Как это можно сделать? Я нашел только галочку у ключей реестра "Shared among several applications", но это не помогает (при установке двух программы и удалении одной из них ключи удаляются). А у самих параметров есть галочка "Remove during Uninstall" (снятие ее приводит к тому, что параметры не удаляются).
Мне не очень хочется создавать параметры реестра руками, поэтому прошу совета.
Re: Как расшарить ключи реестра для неск. программ в InstShi
От: siberia Россия http://siberiaway.com
Дата: 30.09.04 07:17
Оценка:
Здравствуйте, Larev, Вы писали:

L>Как можно расшарить ключи реестра для нескольких программ в InstallShiled X (хотя этот же вопрос и для более ранних версий)?

L>Ключи и параметры реестра задаю статически в окне формирования структуры реестра.
L>Есть 2 программы, создающие одинаковые параметры реестра.
L>Мне надо, чтобы они удалялись только при удалении последней пограммы. Как это можно сделать? Я нашел только галочку у ключей реестра "Shared among several applications", но это не помогает (при установке двух программы и удалении одной из них ключи удаляются). А у самих параметров есть галочка "Remove during Uninstall" (снятие ее приводит к тому, что параметры не удаляются).
L>Мне не очень хочется создавать параметры реестра руками, поэтому прошу совета.

только дописывать инсталлятор
Григорий Цуканов
Re: Как расшарить ключи реестра для неск. программ в InstShi
От: maximilian Украина  
Дата: 01.10.04 10:25
Оценка:
Здравствуйте, 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;
Re[2]: Как расшарить ключи реестра для неск. программ в Inst
От: Larev  
Дата: 07.10.04 20:11
Оценка:
Здравствуйте, maximilian, Вы писали:

M>Здравствуйте, Larev, Вы писали:


M>Буду говорить про версию 6.22


M>...


Спасибо за совет. Хоть меня инетересовал сам принцип расшаривания ключей, но за код все равно спасибо. Мне эта идея не особо нравится, но кажется IstallShield не позволяет расшаривать ключи реестра. В InstallShied X есть возможность расшаривания ключей, но это не то, поскольку эта настройка зключается лишь в том, что после деинсталляции просто не удаляется ключ.А жаль. С этим ясно.
Re[2]: Как расшарить ключи реестра для неск. программ в Inst
От: Larev  
Дата: 07.10.04 20:12
Оценка:
Здравствуйте, siberia, Вы писали:

S>Здравствуйте, Larev, Вы писали:


S>только дописывать инсталлятор


Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.