PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 [134] 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

R.i.m.s.k.y.
14-08-2011, 17:02
Devils Night,

//**проверка наличия фреймворка 3.5
function netfw35(): Boolean;
begin
if ( RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5') )
then Result := True else Result := False;
end;

//** проверка на установку MS Visual C++ 2008
Function isvcredist():boolean;
var b1,b2,b3 : boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED') then b1 := True;
if IsWin64 then begin
if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED') then b2 := True;
if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED') then b3 := True;
end;
if (b1 or b2 or b3) then Result := True else Result := False;
end;

Function InitializeSetup: Boolean;
begin
...
if (not isvcredist) then MsgBox('Не установлен Microsoft Visual C++ 2008', mbInformation, MB_OK);
if (not netfw35) then MsgBox('Не установлен FrameWork 3.5', mbInformation, MB_OK);
...
end;

Rikill
14-08-2011, 17:09
R.i.m.s.k.y., я думаю ещё можно привязать к Check, было бы удобнее

R.i.m.s.k.y.
14-08-2011, 17:13
я думаю ещё можно привязать к Check, было бы удобнее »
такой вариант можно использовать, к примеру, чтобы сделат неснимаемые галки если компонента не хватает
пример неснимаемых галок давал Serega

VASYAKRN
14-08-2011, 17:35
прикрутите к моему скрипту .png иконку папки на странице папки и меню пуск через ботву

скрипт (http://inno.at.ua/TMP/undercover_bratherhood_lite.7z)
иконка (http://inno.at.ua/TMP/2.png)

Rikill
14-08-2011, 17:47
VASYAKRN, неблагодарное быдло
прикрутите к моему скрипту .png иконку папки на странице папки и меню пуск через ботву »
не имеешь уважения к форумчанам, никто не поможет, это весь скрипт переписывать.

El Sanchez
14-08-2011, 19:13
нужно чтобы сам инсталятор проверял на наличие установленных компонентов »
Devils Night, и это правильно.

Может будут, какие другие варианты? »
dotnetfx3_x86, vcredist_x86, xliveredist - сердцем этих установщиков является msi-документ, а значит используем возможности API системы, а именно функцию MsiQueryProductState.


[code]
const
INSTALLSTATE_DEFAULT = 5;

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

function MsiQueryProductState(szProduct: String): Integer;
external 'MsiQueryProductState{#A}@msi.dll stdcall';

function IsMsiProductInstall(ProductCode: String): Boolean;
begin
Result := MsiQueryProductState(ProductCode) = INSTALLSTATE_DEFAULT;
end;

//к примеру определяем установлен ли Microsoft Visual C++ 2010 x86 Redistributable, ProductCode которого {196BB40D-1578-3D01-B289-BEFC77A11A1E}
procedure InitializeWizard();
begin
if IsMsiProductInstall('{196BB40D-1578-3D01-B289-BEFC77A11A1E}') then
MsgBox('vcredist 2010 installed for current user', mbInformation, MB_OK)
else
MsgBox('vcredist 2010 not installed', mbInformation, MB_OK);
end;


ProductCode можно посмотреть в msi-документе с помощью Orca (таблица Property, свойство ProductCode)

Rikill
14-08-2011, 21:16
El Sanchez, помнишь мы говорили про appmutex, можно ли сделать так, чтобы на деинсталлятор правило не действовало, например если у меня ошибка распаковки вызывается деинсталлятор, и выдаётся сообщение "вы уже запустили одну копию этой программы"

VASYAKRN
14-08-2011, 23:10
обєдините Install И PostInstall на одной странице или просто удалите Install
troyan90 зарание спасиба.Етот скрипт я делал по ево Hitman - Blood Money весии непомню
скрипт (http://inno.at.ua/TMP/Fenixx_Dead_Spase_2_ISdone0.6.7z)

Gugle
15-08-2011, 09:43
Доброго времени суток!

Гуру, подскажите пожалуйста, как получить информацию о всех сетевых интерфейсах установленных на локальном ПК?
Никак не могу разобраться с этим.

insombia
15-08-2011, 10:35
Подскажите как сделать чтобы весь текст был только белом фоне http://images.bcm.net.ua/images/70456503070116723403.jpg?
P.S. Копирование файлов не в счет

Imitri7
15-08-2011, 10:58
insombia, ну придется почти всю страницу переписывать, и потом уже двигать текст, пример из старого скрипта злого деда вот :

[Setup]
AppName=Mirror's Edge
AppVerName=Mirror's Edge
DefaultDirName={pf}\EA Games\Mirror's Edge
WizardImageFile=WizardImg.bmp
WizardSmallImageFile=WizardSmallImg.bmp

[code]
var
WLabel1, WLabel2,
FLabel1, FLabel2: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;
procedure InitializeWizard();
//WizardImageFile
begin
WizardForm.Caption:='Программа установки игры "Mirrors Edge"';
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedHeadingLabel.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.WizardBitmapImage.Width := 497;
WizardForm.WizardBitmapImage.Height := 313;
WizardForm.WizardSmallBitmapImage.Left:=0;
WizardForm.WizardSmallBitmapImage.Width:=497;
WizardForm.WizardSmallBitmapImage.Height:=58;
WizardForm.PageDescriptionLabel.Width:=300;
WizardForm.PageNameLabel.Width:=300;
WizardForm.FileNameLabel.Visible:=False;
WizardForm.ProgressGauge.Top:=ScaleY(100);
WizardForm.StatusLabel.Top:=ScaleY(80);
WLabel1 := TLabel.Create(WizardForm);
WLabel1.Left := ScaleX(176);
WLabel1.Top := ScaleY(16);
WLabel1.Width := ScaleX(301);
WLabel1.Height := ScaleY(54);
WLabel1.AutoSize := False;
WLabel1.WordWrap := True;
WLabel1.Font.Size := 11;
WLabel1.Font.Style := [fsBold];
WLabel1.Font.Color:= clBlack;

WLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WLabel1.Transparent := True;
WLabel1.Parent := WizardForm.WelcomePage;
WLabel2 :=TLabel.Create(WizardForm);
WLabel2.Top := ScaleY(76);
WLabel2.Left := ScaleX(176);
WLabel2.Width := ScaleX(301);
WLabel2.Height := ScaleY(234);
WLabel2.AutoSize := False;
WLabel2.WordWrap := True;
WLabel2.Font.Color:= clBlack;

WLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
WLabel2.Transparent := True;
WLabel2.Parent := WizardForm.WelcomePage;
WizardForm.WizardBitmapImage2.Width := 497;
WizardForm.WizardBitmapImage2.Height := 313;
FLabel1 := TLabel.Create(WizardForm);
FLabel1.Left := ScaleX(176);
FLabel1.Top := ScaleY(16);
FLabel1.Width := ScaleX(301);
FLabel1.Height := ScaleY(54);
FLabel1.AutoSize := False;
FLabel1.WordWrap := True;
FLabel1.Font.Size := 11;
FLabel1.Font.Style := [fsBold];
FLabel1.Font.Color:= clBlack;

FLabel1.Caption := WizardForm.FinishedHeadingLabel.Caption;
FLabel1.Transparent := True;
FLabel1.Parent := WizardForm.FinishedPage;
FLabel2 :=TLabel.Create(WizardForm);
FLabel2.Top := ScaleY(76);
FLabel2.Left := ScaleX(176);
FLabel2.Width := ScaleX(301);
FLabel2.Height := ScaleY(53);
FLabel2.AutoSize := False;
FLabel2.WordWrap := True;
FLabel2.Font.Color:= clBlack;


FLabel2.Caption := 'Программа установлена на Ваш компьютер.' #13#13
'Нажмите «Завершить», чтобы выйти из программы установки.';
FLabel2.Transparent := True;
FLabel2.Parent := WizardForm.FinishedPage;
begin
PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clBlack;
Font.Style := [fsBold];
Transparent := True;
Parent := WizardForm.MainPanel;
end;

PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left := ScaleX(15);
Top := ScaleY(25);
Width := ScaleX(400);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := clBlack;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
end;
end;
если не разберешься, задавай вопросы подскажу =)

to all кто нибудь может проверить на 64х разрядной системе программу? ссылка вот (http://rghost.ru/users/imitri7/releases/GreyLinkDC-049x86-i-048x64-RePack) (желательно скинуть скрин папки программы)

insombia
15-08-2011, 11:12
ну придется почти всю страницу переписывать, и потом уже двигать текст, пример из старого скрипта злого деда вот :
читать дальше » »
Жаль не пашет только текст весь стал корявый

Imitri7
15-08-2011, 11:27
insombia, скинь скрин, можт я подскажу че сделать чтоб все пучком было )

insombia
15-08-2011, 12:01
Imitri7 вот именно что скрипта у меня нету я хочу сделать что-то похожее

El Sanchez
15-08-2011, 12:13
помнишь мы говорили про appmutex, можно ли сделать так, чтобы на деинсталлятор правило не действовало, например если у меня ошибка распаковки вызывается деинсталлятор, и выдаётся сообщение "вы уже запустили одну копию этой программы" »
Rikill, не совсем понял, что требуется. При ошибке распаковки на этапе установки и так выводится соответствующее сообщение и производится откат.

как получить информацию о всех сетевых интерфейсах установленных на локальном ПК? »
Gugle, может какую конкретную инфу, типа MAC, IP, название? Всех - это с минипортами, ассинхронными адаптерами и т.д.?

Gugle
15-08-2011, 12:22
El Sanchez, мне нужны MAC, IP, Description всех ethernet адаптеров установленных на ПК.

Пока, все что нашел это работа с "cmd.exe", через команду "ipconfig /all". Оттуда, конечно, можно вытащить информацию, но я предполагаю, что это можно сделать более изящно, чем парсить вывод cmd.exe.

El Sanchez
15-08-2011, 13:30
Gugle, добавил MAC в этот код, еще и ошибку исправил:


[Code]
type
IP_ADDR_INFO = array of record
Description: String;
IPv4: String;
IPv6: String;
MAC: String;
end;

function GetLocalIP(var IPAddrInfo: IP_ADDR_INFO): Boolean;
var
objSWbemLocator, objSWbemServices, objSWbemObjectSet, objRegExp, objRegExpMatches: Variant;
IndexCount, i: Byte;
strBuf, ptrnIPv4, ptrnIPv6: String;
begin
try
objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
objRegExp := CreateOleObject('VBScript.RegExp');
except
ShowExceptionMessage;
Exit;
end;
ptrnIPv4 := '(\d{1,3}[.]){3}\d{1,3}'; //IPv4 regexp
ptrnIPv6 := //IPv6 regexp
'(([0-9a-fA-F]{1,4}:){1,1}(:[0-9a-fA-F]{1,4}){1,6})|(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5})|' +
'(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4})|//(([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3})|' +
'(([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2})|(([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}){1,1})|' +
'((([0-9a-fA-F]{1,4}:){1,7}|:):)|(:(:[0-9a-fA-F]{1,4}){1,7})|(((([0-9a-fA-F]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}))|' +
'((([0-9a-fA-F]{1,4}:){5}[0-9a-fA-F]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}))|' +
'(([0-9a-fA-F]{1,4}:){5}:[0-9a-fA-F]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|' +
'(([0-9a-fA-F]{1,4}:){1,1}(:[0-9a-fA-F]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|' +
'(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|' +
'(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})';

objSWbemServices := objSWbemLocator.ConnectServer();
objSWbemServices.Security_.ImpersonationLevel := 3;
IndexCount := objSWbemServices.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration').Count;
objSWbemObjectSet := objSWbemServices.ExecQuery('SELECT Description,IPAddress,MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE');

for i := 1 to IndexCount do
try
SetArrayLength(IPAddrInfo, GetArrayLength(IPAddrInfo)+1);
strBuf := objSWbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(i)).GetObjectText_;
IPAddrInfo[GetArrayLength(IPAddrInfo)-1].Description := objSWbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(i)).Properties_.Item('Description').Value;
objRegExp.Pattern := ptrnIPv4;
if objRegExp.Test(strBuf) then
begin
objRegExpMatches := objRegExp.Execute(strBuf);
IPAddrInfo[GetArrayLength(IPAddrInfo)-1].IPv4 := objRegExpMatches.Item[0].Value;
end;
objRegExp.Pattern := ptrnIPv6;
if objRegExp.Test(strBuf) then
begin
objRegExpMatches := objRegExp.Execute(strBuf);
IPAddrInfo[GetArrayLength(IPAddrInfo)-1].IPv6 := objRegExpMatches.Item[0].Value;
end;
IPAddrInfo[GetArrayLength(IPAddrInfo)-1].MAC := objSWbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(i)).Properties_.Item('MACAddress').Value;
except
GetExceptionMessage;
SetArrayLength(IPAddrInfo, GetArrayLength(IPAddrInfo)-1);
end;
Result := (GetArrayLength(IPAddrInfo) > 0);
end;

procedure InitializeWizard();
var
i: Byte;
arr: IP_ADDR_INFO;
begin
if GetLocalIP(arr) then for i := 0 to GetArrayLength(arr)-1 do
MsgBox(
'Description: ' + arr[i].Description + #13#10 +
'IPv4: ' + arr[i].IPv4 + #13#10 +
'IPv6: ' + arr[i].IPv6 + #13#10 +
'MAC: ' + arr[i].MAC, mbInformation, MB_OK);
end;

Gugle
15-08-2011, 13:40
El Sanchez, спасибо. Пошел разбиться со скриптом.

Появились вопросы:
1. На строке:
strBuf := objSWbemObjectSet.Item('Win32_NetworkAdapterConfiguration.Index=' + IntToStr(i)).GetObjectText_;
Вываливается с ошибкой:
SWbemObjectSet: Не найден.

2. Где и/или как можно посмотреть весь список столбцов ... (что такое ту мы используем?) для формирования своего запроса типа:
objSWbemObjectSet := objSWbemServices.ExecQuery('SELECT Description,IPAddress,MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE');

Все понятно откуда это! Пояснять не надо. )))



3. А можно еще и DeviceID вытащить?
Начал поиск, но если знаешь название в скрипте, то напиши плз. Я пока очень медленно в этом разбираюсь.

Rikill
15-08-2011, 14:29
El Sanchez, отката не происходит, ибо выводится сообщение что уже запущен один вариант установки из-за AppMutex нужно сделать исключение для деинсталлятора, чтобы можно было запустить setup.exe один раз, но чтобы можно было вместе запускать setup.exe/unins000.exe

Imitri7
15-08-2011, 14:47
insombia, не так уж и сложно сделать такой инстал, есть примеры даже, просто переделывай под себя)




© OSzone.net 2001-2012