IS12: Как получить список выбранных компонентов?
От: Borg  
Дата: 22.08.07 12:28
Оценка:
Доброго времени суток.
Я работаю с InstallShield 12 версии. Стоит задача, чтобы в определенный момент (перед тем собственно как пользовтель нажмет кнопку Установить) программа-установки показала юзеру окошко, в котором вывела summary. Т.е. показала каталог, который он выбрал для установки, список компонентов, которые он собрался ставить и т.д. Конкретно проблема сейчас с тем, чтобы программно в скрипте IS получить список выбранных компонентов. Что я только не пробовал... Любой пример из самого хелпа к IS у меня не работает. Вот простой код:


#include "Ifx.h"
export prototype MyFunction(HWND);                                             

function MyFunction(hMSI)                                                 
    STRING  szTitle, szMsg;                                               
    NUMBER    listID, code;
begin                                                                     
    szTitle = "List MEDIA Features";                                      
    szMsg   = "MEDIA contains the following top-level features:";         
    // Initialize the string list.                                        
    listID = ListCreate (STRINGLIST);                                         

    // Create a list of top-level features in the specified media.        
    code = FeatureListItems (MEDIA, "", listID);
    // Display the list of top-level features.                            
    SdShowInfoList (szTitle, szMsg, listID);                              
end;



В этом коде FeatureListItems всегда возвращает ошибку -132 ("The specified media cannot be found"). В примерах везде пишут, что в качестве первого параметра надо подставлять переменную MEDIA. Я собственно так и делаю, хотя так и не могу понять, что же это такое MEDIA? Отладчик показывает, что у меня MEDIA = "DATA".

Подскажите пожалуйста, что я не так делаю, как мне все же получить список компонентов, выбранных пользователем?
Спасибо.
Re: IS12: Как получить список выбранных компонентов?
От: Аноним  
Дата: 23.08.07 08:46
Оценка:
Позвольте уточнить проблему. возможно после этого кто-нибудь сможет мне помочь?

Я провел много различных экспериментов и выяснил следующее. В InstallShield 12 существует в общем-то два основных вида проектов (для меня по крайней мере). Это InstallScript Project и Basic MSI Project. Помимо предоставляемой функциональности главное отличие собственно состоит в том, что InstallScript Project использует для инсталляции движок самого Install Shield, а Basic MSI Project использует движок MSI. В ходе проведенных экспериментов я обнаружил следующее, что в такой процедуре


function Test()
    NUMBER    listID, code;
begin                                                                     
    // Initialize the string list.                                        
    listID = ListCreate (STRINGLIST);                                         
    // Create a list of top-level features in the specified media.        
    code = FeatureListItems (MEDIA, "", listID);
end;


функция FeatureListItems работает только, если это InstallScript Project. Если же она вызывается в Basic MSI Project, то происходит ошибка code = -132 (The specified media cannot be found). Причем это касается не только данной процедуры, а целой группы FeatureXXX процедур, которые в качестве первого параметра требуют указать szFeatureSource (Specifies the media name of the ...).

Подскажите пожалуйста, с чем это может быть связано??? Может такое быть, что данная группа функций вообще недоступна к использованию в Basic MSI Project? Однако я перерыл гору документации и в инете тоже искал и нигде ничего такого не нашел. Есть кто-нибудь, кому удавалось у Basic MSI Project вызвать какую-либо процедуру группы FeatureXXX, указав в качестве первого аргумента MEDIA и чтобы это отработало? Как все-таки в Basic MSI Project получить список выбранных компонентов?
Re: IS12: Как получить список выбранных компонентов?
От: 3tone Беларусь http://333tone.livejournal.com/
Дата: 23.08.07 11:16
Оценка:
Здравствуйте, Borg, Вы писали:

B>Доброго времени суток.

B>Я работаю с InstallShield 12 версии.
...
B>Подскажите пожалуйста, что я не так делаю, как мне все же получить список компонентов, выбранных пользователем?
B>Спасибо.
во первых, разберитесь с терминами. То, что вы назвали компонентами, все-таки называется фичами(Features).
во вторых, сразу упростится поиск по форуму.
в третьих, постарайтесь не связываться с InstallScript вообще и направьте свои исследования в сторону Custom Actions.
Re[2]: IS12: Как получить список выбранных компонентов?
От: Аноним  
Дата: 23.08.07 12:09
Оценка:
Здравствуйте, 3tone, Вы писали:

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


B>>Доброго времени суток.

B>>Я работаю с InstallShield 12 версии.
3>...
B>>Подскажите пожалуйста, что я не так делаю, как мне все же получить список компонентов, выбранных пользователем?
B>>Спасибо.
3>во первых, разберитесь с терминами. То, что вы назвали компонентами, все-таки называется фичами(Features).
3>во вторых, сразу упростится поиск по форуму.
3>в третьих, постарайтесь не связываться с InstallScript вообще и направьте свои исследования в сторону Custom Actions.

Да,действительно вы правы, я напутал в терминах — замотался. Тем не менее поиск ответов на мой вопрос не дает. Я попробую еще раз сформулировать свою проблему:


Как в Install Shield 12 для проекта типа Basic MSI Project во время выполнения инсталляции (runtime) получить список features, которые выбрал пользователь?



Нужен какой-то аналог функции FeatureListItems, но только работающей для Basic MSI Project. Я слышал, что можно как-то напрямую в таблицы MSI лезть и доставать оттуда информацию, но у меня не получается. Буду признателен, если кто-нибудь покажет мне код такой функции на языке InstallScript.

Спасибо.
Re[2]: IS12: Как получить список выбранных компонентов?
От: Аноним  
Дата: 10.09.07 15:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Позвольте уточнить проблему. возможно после этого кто-нибудь сможет мне помочь?


Просто в ИШ можно использовать свои функции в проэкте ИнсталлШилд и только "обработанные" мсай функции в базовый мсай проэкте обычно в справке по каждой функции указываеться к какому проэкту она идет
Re[3]: IS12: Как получить список выбранных компонентов?
От: Аноним  
Дата: 10.09.07 15:34
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>Как в Install Shield 12 для проекта типа Basic MSI Project во время выполнения инсталляции (runtime) получить список features, которые выбрал пользователь? 
А>



А>Нужен какой-то аналог функции FeatureListItems, но только работающей для Basic MSI Project. Я слышал, что можно как-то напрямую в таблицы MSI лезть и доставать оттуда информацию, но у меня не получается. Буду признателен, если кто-нибудь покажет мне код такой функции на языке InstallScript.


А>Спасибо.


Есть функции MsiGetProperty и сет проперти с помощью них можно получить и изменить любую мсай свойство определенное в проперти менеджере
Если только надо что-б они выводились в сумарри экране то такой экран есть в стандартном наборе — надо посмотреть документацию на него
А вобще очень советую сначала посмотреть возможность реализации вашего вопроса через визуальный интерфейс потому что в ИШ скрипт — лучше не лезть
Re: IS12: Как получить список выбранных компонентов?
От: Yarik11  
Дата: 06.11.07 10:07
Оценка:
В Basic MSI проэктах эта функция не работает. Сам потратил много времени. Удалось решить эту проблему только следующим образом (напрямую читая из таблицы из MSI базы):

#include "Ifx.h"

export prototype GetAllFeatures(HWND);

function GetAllFeatures(hMSI)
HWND hDB, hViewlist;
HWND hViewprop, hRecordprop;
NUMBER nBuffer, nInstState, nActionState;
STRING svFeatureName, svPropvalue, AddLocal;
begin
hDB = MsiGetActiveDatabase(hMSI);
// open view into Feature table
MsiDatabaseOpenView(hDB,"SELECT * FROM `Feature`", hViewlist);
MsiViewExecute(hViewlist, NULL);
while (MsiViewFetch(hViewlist, hRecordprop) != ERROR_NO_MORE_ITEMS)
nBuffer = 256; // set size buffer
//в данном сучае svFeatureName отображает название фичи. дальше можно узнать action и т.д.
MsiRecordGetString(hRecordprop, 1, svFeatureName, nBuffer);
//.........................................................

endwhile;

MsiViewClose(hViewlist);
end;
Re[2]: IS12: Как получить список выбранных компонентов?
От: Borg  
Дата: 14.11.07 03:28
Оценка:
Здравствуйте, Yarik11, Вы писали:

Y>В Basic MSI проэктах эта функция не работает. Сам потратил много времени. Удалось решить эту проблему только следующим образом (напрямую читая из таблицы из MSI базы):


Большое спасибо, я попробую думаю такое решение меня устроит на все 100%
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.