PDA

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


Страниц : 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

R.i.m.s.k.y.
18-06-2010, 11:28
Даже не менял ничего »
Чудесато, я брал этот скрипт из шапки этой темы и все робит, попробуйте, все должно работать изначально

[_Code]
type
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;

TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of char;
Support, cDestinations: DWord;
end;

// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 2200;
NeedVideoRAM = 256;
NeedSoundCard = 'Realtek HD';
NeedMB = 1024;
NeedPageFile = 2048;

var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
Version: TWindowsVersion;
MemoryEx: TMemoryStatusEx;
n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';

// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;

// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
if not noMB then
Result := FloatToStr(Int(Bytes)) + ' Мб'
else
if Bytes < 1024 then
Result := FloatToStr(Int(Bytes)) + ' Бт'
else
if Bytes/1024 < 1024 then
Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
else
if Bytes/oneMB < 1024 then
Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
else
if Bytes/oneMB/1000 < 1024 then
Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
else
Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
StringChange(Result, ',', '.')
end;

// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1)
Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) // Количество ядер
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;

procedure CreateCheckForm();
begin

TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
Parent := InfoPage.Surface
Left := 0
AutoSize := True
end

BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
Parent := InfoPage.Surface
Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее»'
Font.Color := clGray
Left := 0
Top := 200
AutoSize := True
end

SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
Text := 'Система'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := clBlack
end

SystemVersionPanel := TMemo.Create(InfoPage)
with SystemVersionPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
Text := 'Процессор'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := clBlack
end

ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
Text := 'Видеоадаптер'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := clBlack
end

VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
Text := 'Звуковая карта'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := clBlack
end

AudioNamePanel := TMemo.Create(InfoPage)
with AudioNamePanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
Text := 'Объём памяти'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := clBlack
end

RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
Text := 'Файл подкачки'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := clBlack
end;

PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

end;

procedure UpdateInfo();
var
DeviceName, DeviceKey: String;
begin
ChangeText := False

GetWindowsVersionEx(Version)

// Операционная система:
SystemVersionPanel.Color := clBlack
SystemVersionPanel.Font.Color := clGreen

DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
DeviceName := DeviceName + ' ' + DeviceKey
StringChange(DeviceName, 'Microsoft ', '')
SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
'.' + IntToStr(Version.Build)

if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
(Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
(Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and // Windows XP SP3
(Pos('Vista', SystemVersionPanel.Text) = 0) then // Windows Vista (c любым SP или без него)
begin
SystemVersionPanel.Color := clBlack
SystemVersionPanel.Font.Color := clRed
ChangeText := True
end

// Процессор:
ProcessorMHzPanel.Color := clBlack
ProcessorMHzPanel.Font.Color := clGreen

if not CheckCPU(NeedMHz) then
begin
ProcessorMHzPanel.Color := clBlack
ProcessorMHzPanel.Font.Color := clRed
ChangeText := True
end

ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

// Видеокарта:
VideoRAMPanel.Color := clBlack
VideoRAMPanel.Font.Color := clGreen

lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
DeviceKey := ''
n := 0
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Ключ драйвера получаем из API
StringChange(DeviceKey, '\Registry\Machine\', '')
errCode := 1
DeviceValue := 0
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
for n := 1 to Length(DeviceName) do
begin
DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
errCode := errCode*$100
end
else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
DeviceName := ''
for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

if DeviceName <> '' then
if DeviceValue > 0 then
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
else
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
else
begin
VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
VideoRAMPanel.Color := clBlack
VideoRAMPanel.Font.Color := clRed
ChangeText := True
end
if (DeviceValue/oneMB < NeedVideoRAM) then
begin
VideoRAMPanel.Color := clBlack
VideoRAMPanel.Font.Color := clRed
ChangeText := True
end
VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

// Звуковая карта:
AudioNamePanel.Color := clBlack
AudioNamePanel.Font.Color := clGreen

// for errCode := 0 to 1 do // Вывод основного звукового устройства
for errCode := 0 to mixerGetNumDevs do
begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceName := ' '
for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
Delete(DeviceName, Pos(' [', DeviceName), 31)
StringChange(DeviceName, 'SB ', 'Creative ')
Delete(DeviceName, Pos(' Audio', DeviceName), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceName
end

if GetArrayLength(Keys) > 1 then
begin
AudioPanel.Text := 'Звуковые карты'
// AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNamePanel.Text := ''
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
AudioNamePanel.Color := clBlack
AudioNamePanel.Font.Color := clRed
ChangeText := True
end
else
AudioNamePanel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'

// Объём памяти:
RAMTotalPanel.Color := clBlack
RAMTotalPanel.Font.Color := clGreen
if not CheckMemorySize(NeedMB) then
begin
RAMTotalPanel.Color := clBlack
RAMTotalPanel.Font.Color := clRed
ChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'

// Виртуальная память:
PageFileTotalPanel.Color := clBlack
PageFileTotalPanel.Font.Color := clGreen
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
PageFileTotalPanel.Color := clBlack
PageFileTotalPanel.Font.Color := clRed
ChangeText := True
end

if ChangeText = True then
begin
TopText.Top := 0
TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям игры.' #13
'Пожалуйста, проверьте позиции, выделенные красным цветом.'
TopText.Font.Color := clRed
// WizardForm.NextButton.Enabled := False
end
else
begin
TopText.Caption := 'Все компоненты соответствуют минимальным требованиям игры.'
TopText.Font.Color := clGreen
TopText.Top := 8
// WizardForm.NextButton.Enabled := True
end
end;

procedure InitializeWizard();
begin
InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие наобходимые компоненты.')
CreateCheckForm() // Создание объектов TMemo, в которых будет выводится информация о системе
UpdateInfo() // Обновление информации о системе
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then UpdateInfo() // Обновление информации о системе
end;


данные об игре попали в реестр »
Что? Куда? Зачем? Какие данные?

-S.S.V.-
18-06-2010, 11:57
Параметры тихой установки PsysX я не знаю. Запустите установщик PsysX с ключом /? (PsysX.exe /?) - он должен написать какой параметр для тихой установки, его и пропишите вместо ???
{src} - путь к файлу вашего скомпилированного установщика. Рядом с этим установщиком должны лежать папки DirectX и PsysX »

Спасибо огромное

R.i.m.s.k.y.
18-06-2010, 12:04
Спасибо огромное »
Огромное пожалуйста!

Чтобы сказать спасибо надо внизу сообщения, за которое благодарите, нажать "полезное сообщение"

tema47
18-06-2010, 12:51
Ну например установил я игру. В реестре появились данные о ней. Например
http://10pix.ru/img1/2491/1674374.jpg (http://10pix.ru/)
Я сделал репак, но этих данных в реестре нет и игра получается на англ. языке.
Как сделать чтобы эти данные добавлялись автоматически?

Модератор: Пользуйтесь тегами форума. Такие огромные картинки мешают другим читать форум.

R.i.m.s.k.y.
18-06-2010, 13:23
Как сделать чтобы эти данные добавлялись автоматически »

00. Если неизвестны ключи реестра:
01. Ищем качаем утилитку RegShot - сильно облегчает жизнь
02. Удаляем игру/прогу, чистим реестр, и потом с помощью регшота делаем список необходимых ключей + получаем reg файлик с изменениями
03. Запускаем ISTool, загружаем inno-проект, в меню Progect - Import From File - Registry... выбираем reg файлик
04. Проходим глазами по секции [Registry] в проекте, все пути к программе заменяем на {app}\путь, удаляем явный шлак.
05. ЕСЛИ ПРОГА ПРИ УСТАНОВКЕ ПИШЕТ КЛЮЧИ FILTERDATA С ОГРОМНЫМИ ЗНАЧЕНИЯМИ - экспортируем из реестра руками и в секции [Run] руками импортируем эти ключи, RegShot не переваривает здоровые строки и обрубает их.

[Files]
Source: FilterData.reg; DestDir: {tmp}; Flags: ignoreversion
[Run]
Filename: {sys}\reg.exe; Parameters: " import ""{tmp}\FilterData.reg"""; StatusMsg: Регистрация; Flags: runhidden waituntilterminated

10. Если известно наверняка какие ключи пишет прога - экспортируем их и Go To 03, но лучше предположить что мы ключи не знаем, мало ли что прога пишет.

После этого уже можно понять что и как в Inno в секции [Registry], если нет - Go To справка по ключевому слову [Registry] и прочим непонятным словам, встречающимся в коде Inno. Рекомендую бесплатный словарик Dicto. В шапке есть ссылка на русифицированную справку, она староватая, но годится.

Cinot
18-06-2010, 17:39
R.i.m.s.k.y., что касается моего вопроса, он снимается - я уже помудрил и создал-таки цикл.
Меня интересует шифрование. Я предполагал, что им можно защитить инсталлятор от декомпилляции, а получается, что этот пароль спрашивается у самого пользователя в процессе установки.
Есть ли средство шифрования именно инсталлятора (входящих в него файлов и самого кода ISS) от всяких декомпиляторов, чтобы без задания пароля пользователем?

paravozik2009
18-06-2010, 18:43
Что не кто не скажет ?! Есть,ли скрипт что CAB распаковует?

semiono
19-06-2010, 19:47
Нужен хелп! И просьба не динамить, так как очень нужно.

Вот код который граббит реестр (REG_NONE) и пишет в файл результат.

const
KEY_QUERY_VALUE = 1;

function RegOpenKeyEx(
hKey: Integer;
const lpSubKey: String;
ulOptions: Integer;
samDesired: Integer;
var hkeyResult: Integer
): Integer;
external 'RegOpenKeyExA@AdvAPI32.DLL stdcall';

function RegCloseKey(
hKey: Integer
): Integer;
external 'RegCloseKey@AdvAPI32.DLL stdcall';

type
Data = array [0..259] of Byte;

function RegQueryValueEx(
hKey: Integer;
const lpValueName: String;
lpReserved: Integer;
var lpType: Integer;
var lpData: Data;
var lpcbData: Integer
): Integer;
external 'RegQueryValueExA@AdvAPI32.DLL stdcall';

function InitializeSetup(): Boolean;
var
hKey, ValueType, ValueDataLen, i, j: Integer;
ValueData: Data;
Value: String;
begin
RegOpenKeyEx(HKLM, 'SOFTWARE\Classes\Trilogy', 0, KEY_QUERY_VALUE, hKey);
for i := 1 to 3 do begin
Value := Format('Value%u', [i]);
ValueDataLen := SizeOf(ValueData);
RegQueryValueEx(hKey, Value, 0, ValueType, ValueData, ValueDataLen);
Value := Format('HKLM,"SOFTWARE\Classes\Trilogy","%s",0x20001', [Value]);
for j := 0 to ValueDataLen-1 do
Value := Value+Format(',%.2x', [ValueData[j]]);
SaveStringToFile('C:\test.txt', Value+#13#10, i>1);
end;
RegCloseKey(hKey);
Result := False;
end;

Вот мой незатейливый код
[_Code]
procedure DeinitializeSetup();
var
S: TArrayOfString;
F: String;
begin
F := ExpandConstant('{reg:HKLM32\Software\VST,VSTPluginsPath|{syswow64}\Plugins}\Trilogy\Trilogy.inf');
SetArrayLength(S, 9);
// -------------------------------------------------------------------------------------------------------------------------------------
S[00] := '[Version]'
S[01] := 'Signature=$Windows NT$'
S[02] := ''
S[03] := '[DefaultInstall]'
S[04] := 'AddReg=Add.Reg'
S[05] := ''
S[06] := '[Add.Reg]'
S[07] := 'HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\Trilogy.exe",,0x4000,"' + ExpandConstant('{reg:HKLM32\Software\VST,Proton.exe|{syswow64}\Proton}') + '\Trilogy\Trilogy.exe"'
S[08] := 'HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\Trilogy.exe","Path",0x4000,"' + ExpandConstant('{reg:HKLM32\Software\VST,Proton.exe|{syswow64}\Proton}') + '\Trilogy"'
// -------------------------------------------------------------------------------------------------------------------------------------
SaveStringsToFile(F, S, False);
end;

Мне нужно к моему коду привязать то, что было выше для того, чтобы дописать
экспортируемые значения из реестра в конец этого файла:
ExpandConstant('{reg:HKLM32\Software\VST,VSTPluginsPath|{syswow64}\Plugins}\Trilogy\Trilogy.inf')

Причём это должно неизменно выполниться под процедурой DeinitializeSetup();

Экспорт происходит с тремя значениями Value1, Value2 и Value3, если нужно то можно явно
это указать в коде экспорта вместо индексов типа i>1.

Одним словом проблема в том, что SaveStringToFile() переписывает весь файл,
а мне надо прибавить к моему файлу эти строки в таком виде:

SetArrayLength(S, 12);
...

S[09] :=...
S[10] :=...
S[11] :=...

Так как я в этом нибум-бум, помогите преобразовать? Только желательно целиком код напишите.
Напомню, то что было http://j.imagehost.org/0295/Snap1_1.png

Serega
20-06-2010, 20:53
Привет всем, извиняюсь кому не ответил, просто меня давно не было, со свободным временем туго стало...
Есть ли средство шифрования именно инсталлятора »
Почитайте в справке описание Password и Encryption, эти параметры должныы быть в инсталляторе (секция Setup)...

Есть,ли скрипт что CAB распаковует? »
скрипта, я такого не видел, но если не ошибаюсь, в NT должна присутствовать extrac32.exe, которая отвечает за распаковку cab архивов...

Одним словом проблема в том, что SaveStringToFile() переписывает весь файл,
а мне надо прибавить к моему файлу эти строки в таком виде »
извиняюсь, за бестактность, но бред полнейший, вы почитайте описание данной функции:
function SaveStringsToFile(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;
в принципе видно даже из самой функции, Append - о чём это говорит? да о том, что вы можете задать, перезаписать файл или создать заново...
из вашего примера выходит, что вы даёте команду создать новый файл:
SaveStringsToFile(F, S, False);
если хотие дописать:
SaveStringsToFile(F, S, True);

Habetdin
20-06-2010, 21:54
Есть ли средство шифрования именно инсталлятора (входящих в него файлов и самого кода ISS) от всяких декомпиляторов, чтобы без задания пароля пользователем? »
Смотрите в PM ;)

Cinot
21-06-2010, 00:21
Habetdin, большое спасибо за помощь!

SeDmY
21-06-2010, 08:49
Помогите! Как исправить!?

http://www.imagepost.ru/thumbs/158/h3EV8j7eJKkL.PNG (http://www.imagepost.ru/?v=158/h3EV8j7eJKkL.PNG)

Полностью: http://rghost.ru/1944098

vint56
21-06-2010, 11:35
SeDmY, скрипт рабочий вот проверил на этой версий ispack-5.3.10 Последний стабильный релиз (http://files.jrsoftware.org/ispack/ispack-5.3.10.exe)

SeDmY
21-06-2010, 12:28
SeDmY, скрипт рабочий вот проверил на этой версий ispack-5.3.10 Последний стабильный релиз »

Странно, вчера поставил расширенную версия Inno Setup от Restools, собраную на основе версии 5.3.10, запустил в ней и такая фигня лезет, на обычной та же байда((( Может у меня чего из дополнительного софта не хватает - что скрипт этот использует...

Не может же без косяков быть такое, что у одного человека скрипт работает, а у другого - нет((

vint56
21-06-2010, 13:26
SeDmY, у тебя стоит Unicode а скрипт Ansi потому ошибка

МИШАНЧИК
21-06-2010, 13:29
Serega, посмотрите пожалуйста ЛС.

SeDmY
21-06-2010, 14:10
SeDmY, у тебя стоит Unicode а скрипт Ansi потому ошибка »

Так, ясно! Поставлю вечером Ansi))) А в чем собственно у них отличия!? Я думал, что Unicode расширенная версия какая-нибудь...

SeDmY
22-06-2010, 18:45
Действительно, заработал скрипт)))))))

CrOsP
22-06-2010, 19:15
Подскажите пожалуйста как исправить ошибку вот такую
http://s04.radikal.ru/i177/1006/17/6381d13e8a9at.jpg (http://radikal.ru/F/s04.radikal.ru/i177/1006/17/6381d13e8a9a.png.html)
Вот скрипт

[Setup]
Compression=lzma
AppCopyright=DNET
AppName=Counter Strike 1.6 (47) DNET
AppVerName=Counter Strike 1.6 (47) DNET
DefaultDirName=D:\Counter Strike 1.6 (47) DNET v 8.0
DefaultGroupName=Counter Strike 1.6 (47) DNET v 8.0
MergeDuplicateFiles=true
OutputBaseFilename=cs_dnet_v8.0
DisableReadyPage=true
Uninstallable=true
AppPublisher=© DNET
AppPublisherURL=http://game.dnet.com.ua
AppSupportURL=http://game.dnet.com.ua
AppUpdatesURL=http://game.dnet.com.ua
AppVersion=v8.0 (MyAC)
VersionInfoVersion=8.0
VersionInfoDescription=Counter Strike 1.6 (47) DNET
OutputDir=D:
SetupIconFile="Q:\Инсталяторы Counter Strike\Дистрибутив\cstrike-16.ico"
WizardImageFile=C:\Program Files\Inno Setup 5\cs2.bmp
WizardSmallImageFile=C:\Program Files\Inno Setup 5\cs.bmp

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Components]
Name: lang; Description: Выберете язык игры; Types: custom; Flags: fixed
Name: lang/rus; Description: Русский язык; Flags: exclusive
Name: lang/eng; Description: Английский язык; Flags: exclusive
Name: game; Description: Выберете тип игры; Types: custom; Flags: fixed
Name: game/lan; Description: Сетевая версия; Flags: exclusive
Name: game/inet; Description: Интернет версия; Flags: exclusive
Name: rad; Description: Выберете язык радиокоманд; Types: custom; Flags: fixed
Name: rad/rus; Description: Русский язык; Flags: exclusive
Name: rad/eng; Description: Английский язык; Flags: exclusive

[Types]
Name: custom; Description: Custom installation; Flags: iscustom

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: Styles\Office2007.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: Q:\Инсталяторы Counter Strike\Дистрибутив\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Q:\Инсталяторы Counter Strike\Варианты на выбор\Интернет или Сеть\Lan\*; DestDir: {app}; Components: game/lan; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Q:\Инсталяторы Counter Strike\Варианты на выбор\Интернет или Сеть\Internet\*; DestDir: {app}; Components: game/inet; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Q:\Инсталяторы Counter Strike\Варианты на выбор\Язык\Russian\*; DestDir: {app}; Components: lang/rus; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Q:\Инсталяторы Counter Strike\Варианты на выбор\Язык\English\*; DestDir: {app}; Components: lang/eng; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Q:\Инсталяторы Counter Strike\Варианты на выбор\Радиокоманды\Русские\*; DestDir: {app}; Components: rad/rus; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Q:\Инсталяторы Counter Strike\Варианты на выбор\Радиокоманды\English\*; DestDir: {app}; Components: rad/eng; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: {commondesktop}\MyAC 1.6.0; Filename: {app}\MyAC_1.6.0\myAC.exe; Tasks: desktopicon
Name: {commondesktop}\Counter Strike 1.6 (47) DNET v8.0 MyAC; Filename: {app}\hl.exe; Parameters: -game cstrike ;IconFilename: {app}\cstrike-16.ico Tasks: desktopicon
Name: {commondesktop}\CS_Scaner 4.0; Filename: {app}\CS_Scaner_4.0\CS_Scan.exe; Tasks: desktopicon
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {group}\Counter Strike 1.6 DNET v8.0 (MyAC); Filename: {app}\hl.exe; Parameters: -game cstrike ; IconFilename: {app}\cstrike-16.ico
Name: {group}\CS_Scaner 4.0; Filename: {app}\CS_Scaner_4.0\CS_Scan.exe;
Name: {group}\MyAC 1.6.0; Filename: {app}\MyAC_1.6.0\myAC.exe;

[Run]
Filename: {app}\hl.exe; Parameters: -game cstrike; Description: {cm:LaunchProgram,Counter Strike 1.6 DNET v8.0 (MyAC)}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKCU; Subkey: Software\Valve\Half-Life\Settings; ValueType: string; ValueName: ValveKey; ValueData: 5RP2E-EPH3K-BR3LG-KMGTE-FN8PY; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 0; ValueData: 149
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 1; ValueData: 123
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 2; ValueData: 171
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 3; ValueData: 89
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 4; ValueData: 56
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 5; ValueData: 47
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 6; ValueData: 144
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 7; ValueData: 49
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 8; ValueData: 151
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: 9; ValueData: 75
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Path; ValueData:
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Path2; ValueData: {app}\hl.exe
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: cdp; ValueData: {app}\MyAC_1.6.0\cdeath.exe
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: CDRun; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: AutoS; ValueData: 0
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Param; ValueData: -game cstrike
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Param2; ValueData:
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Left; ValueData: 183
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Top; ValueData: 251
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Height; ValueData: 242
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: PHeight; ValueData: 524
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: conf; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: ip1; ValueData: 172
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: ip2; ValueData: 16
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: subF; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: subT; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: compF; ValueData: 100
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: compT; ValueData: 102
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Rus; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Eoc; ValueData: 0
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: CD; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Sot; ValueData: 0
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Per; ValueData: 1
Root: HKCU; Subkey: CS_Scaner\settings\settings; ValueType: string; ValueName: Brc; ValueData: 0

[Code]

// Importing LoadSkin API from ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Importing ShowWindow Windows API from User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Office2007.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Office2007.cjstyles'), 'NormalAqua.ini');
Result := True;
end;

procedure DeinitializeSetup();
begin
// Hide Window before unloading skin so user does not get
// a glimse of an unskinned window before it is closed.
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;

//вешаем ссылку на подпись
var
MouseLabel,SiteLabel: TLabel;

procedure SiteLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://game.dnet.com.ua/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=$0000C8FF
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=$000080FF
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=$0000A0FF
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=$000080FF
end;

procedure InitializeWizard();
var


//отключение о программе
WizardForm.Position:=poScreenCenter;

//вешаем ссылку
MouseLabel:=TLabel.Create(WizardForm)
MouseLabel.Width:=WizardForm.Width
MouseLabel.Height:=WizardForm.Height
MouseLabel.Autosize:=False
MouseLabel.Transparent:=True
MouseLabel.OnMouseMove:=@SiteLabelMouseMove2
MouseLabel.Parent:=WizardForm

SiteLabel:=TLabel.Create(WizardForm)
SiteLabel.Left:=10
SiteLabel.Top:=330
SiteLabel.Cursor:=crHand
SiteLabel.Font.Color:=$000080FF
SiteLabel.Caption:='Наш сайт http://game.dnet.com.ua/'
SiteLabel.OnClick:=@SiteLabelOnClick
SiteLabel.OnMouseDown:=@SiteLabelMouseDown
SiteLabel.OnMouseUp:=@SiteLabelMouseUp
SiteLabel.OnMouseMove:=@SiteLabelMouseMove
SiteLabel.Parent:=WizardForm
end;

vint56
22-06-2010, 19:43
CrOsP, должно быть begin а не var
procedure InitializeWizard();
begin




© OSzone.net 2001-2012