PDA

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


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

al1511
16-03-2012, 11:59
всем привет!
Мне нужно из установщика создать архив mpq для варкрафта.
Я решил использовать Stormlib.dll
Для начала хотел создать просто пустой архив, даже это не получилось.
На сайте создателя Stormlib.dll есть описание функции SFileCreateArchive

Вот оно:

bool WINAPI SFileCreateArchive(
const char * szMpqName, // Archive file name
DWORD dwFlags, // Additional flags to specify creation details
DWORD dwMaxFileCount, // Limit for file count
HANDLE * phMPQ // Pointer to result HANDLE
);

А вот мой скрипт:

function SFileCreateArchive(szMpqName:string;dwFlagds:Dword;dwMaxFileCount:Dword):BOOL; external 'SFileCreateArchive@files:StormLib.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
begin

if CurStep = ssInstall then begin
repeat
if not SFileCreateArchive (ExpandConstant('{src}\new.mpq'), 2, 4) then break;
until true;
end;
end;


Ошибок никаких не выдаёт, но и файл не создаётся...
Пожалуйста, если кто разбирается, помогите :-)

Вот ссылка на офф. сайт StormLib.dll:
http://www.zezula.net/en/mpq/stormlib/sfilecreatearchive.html

rasim933
16-03-2012, 13:29
Johny7772 раза написанные [Files] что-то меняют? У меня нескольподобных повторяющихся штук.
Лександерисправлю.

Serega
16-03-2012, 17:44
Лександер, будьте немного сдержаны в высказываниях...

al1511, с данной библиотекой не работал, делаю выводы прочитав по вашей ссылке...
А вот мой скрипт:
function SFileCreateArchive( »
Прежде всего, функция должна выглядеть так:

function SFileCreateArchive(szMpqName: PAnsiChar; dwFlagds: DWORD; dwMaxFileCount: DWORD; var phMPQ: THandle): BOOL; external 'SFileCreateArchive@files:StormLib.dll stdcall';

Ошибок никаких не выдаёт »
из кода не видно, где проверка на ошибку? Вы ведь не проверяете if not ... then GetLastError, а так же если всё нормально, то phMPQ должен быть > 0

Stable19
16-03-2012, 23:11
Здравствуйте. Возникла проблема - не удается создать в инсталляторе выбор типов установки. Мне нужно привести их к примерно такому виду:
http://www.imageup.ru/img266/thumb/image_2904817.jpg (http://www.imageup.ru/img266/904817/image_2.jpg.html)
Чтобы был именно такой вид.
Но после изучения некоторой доп. литературы удалось лишь вот это:
http://www.imageup.ru/img266/thumb/image_4904818.jpg (http://www.imageup.ru/img266/904818/image_4.png.html)
Мне нужно чтобы при выборе, например, установки полной версии устанавливались одни файлы, а при выборе портативной версии - другие.
Так вот, может быть у кого найдется скрипт с подобным содержанием или ссылка на документацию, объясняющая решение данной проблемы? Или может кто-нибудь любезно согласится подсказать его? С Inno работаю почти полгода, но выбор типов установки делаю впервые, поэтому и вызвались проблемы. Спасибо.

андрейка43
16-03-2012, 23:26
Ребят, нужно чтобы во время установки, путь автоматически определялся, т.е. что бы установщик искал нужную папку на компьютере и производил в неё установку. можно как нибудь реализовать?

al1511
17-03-2012, 00:25
андрейка43, можно, если путь к этой "нужной папке" прописан в реестре.

Johny777
17-03-2012, 03:13
Stable19,
вот это в первую очередь посмотри (из примеров InnoUltra)
http://rghost.ru/37063112
и это

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:My Program.

[----code]

var
NewPage: TWizardPage;
NewRadio1, NewRadio2: TNewRadioButton;

procedure CreatePage();
var
Header, Button1, Button2: TNewStaticText;
begin
NewPage := CreateCustomPage(wpWelcome, 'Выбор типа установки', 'Эта программа позволяет выбирать тип установки');

Header := TNewStaticText.Create(NewPage);
Header.Parent := NewPage.Surface;
Header.SetBounds(0, 0, WizardForm.InnerNotebook.Width, ScaleY(50));
Header.Autosize := False;
Header.WordWrap := True;
Header.Caption := 'Эта программа позволяет выбирать тип установки, удобно будет как простым юзерам, так и очень опытным хакерам, программерам и иже с ними.';

NewRadio1 := TNewRadioButton.Create(NewPage);
NewRadio1.Parent := NewPage.Surface;
NewRadio1.SetBounds(ScaleX(20), ScaleY(60), ScaleX(250), ScaleY(14));
NewRadio1.Caption := 'Быстрая установка';
NewRadio1.Checked := True;

Button1 := TNewStaticText.Create(NewPage);
Button1.Parent := NewPage.Surface;
Button1.SetBounds(ScaleX(40), ScaleY(80), WizardForm.InnerNotebook.Width - ScaleX(40), ScaleY(40));
Button1.Autosize := False;
Button1.WordWrap := True;
Button1.Caption := 'Быстрая установка - предназначена для обычных юзеров.';

NewRadio2 := TNewRadioButton.Create(NewPage);
NewRadio2.Parent := NewPage.Surface;
NewRadio2.SetBounds(ScaleX(20), ScaleY(120), ScaleX(250), ScaleY(14));
NewRadio2.Caption := 'Выборочная установка';

Button2 := TNewStaticText.Create(NewPage);
Button2.Parent := NewPage.Surface;
Button2.SetBounds(ScaleX(40), ScaleY(140), WizardForm.InnerNotebook.Width - ScaleX(40), ScaleY(40));
Button2.Autosize := False;
Button2.WordWrap := True;
Button2.Caption := 'Выборочная установка - Предназначена для очень продвинутых юзеров, а так же тех, кто себя такими считает.';
end;

procedure InitializeWizard();
begin
CreatePage();
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = wpSelectDir then
begin
if NewRadio1.Checked then
Result := True;
end;
end;

rasim933
17-03-2012, 17:01
Можете подсказать как заставить инсталятор создать ярык нужного файла?

Так:
Name: "{commondesktop}\Spider-Man 2. Enter Electro (PS1)"; Filename: "{app}\psxfin.exe"; Tasks: desktopicon?

FX-DENIS
17-03-2012, 17:25
Привет еще раз новому поколению знатоков инно.Так как помощи на мой вопрос не дали,то перечитал все 3 архива форума :drug: около 4тысяч страниц за 3 дня.Конечно ветераны как Serega,A1EXXX,BlackSelf и другие много помогали,писали людям примеры скриптов,но тогда было как,то доброжелательнее всё.И вот внимательно,долго перечитав архивы,я снова попрошу помогите,как сделать чтобы размер текущего файла был мегабайтах например 25.8 МБ ,вопрос я задал в сообщении и код скрипта тут (http://forum.oszone.net/post-1874550-946.html) и наглядный скриншотhttp://forum.oszone.net/attachment.php?attachmentid=78825&d=1331153224 с обведенной проблемкой.Если не трудно выложете мой скрипт исправленный,буду оооочень благодарен. :sorry:

Serega
17-03-2012, 20:36
Можете подсказать как заставить инсталятор создать ярык нужного файла? »
Почитайте Справку, раздел [Icons]
как сделать чтобы размер текущего файла был мегабайтах например 25.8 МБ »


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

[CustomMessages]
ru.Bt=Бт
ru.Kb=Кб
ru.Mb=Мб
ru.Gb=Гб
ru.Tb=Тб
ru.Pb=Пб
ru.Eb=Эб

[Code]
var
ProgressLabel, SizeLabel: TLabel;

function BytesToReadable(Bytes: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
ABytes: Extended;
i: Integer;
begin
i := 0;
ABytes := Bytes;
while Int(ABytes) >= 1024 do
begin
ABytes := ABytes/1024;
i := i + 1;
end;
case i of
0: Result := FloatToStr(Int(ABytes)) + Padl(ExpandConstant('{cm:Bt}'), 1); // Байт
1: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Kb}'), [ABytes]); // Килобайт
2: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Mb}'), [ABytes]); // Мегабайт
3: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Gb}'), [ABytes]); // Гигабайт
4: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Tb}'), [ABytes]); // Терабайт
// больше Терабайта конечно не пригодится, покрайней мере в ближайшее время, но всё же...
5: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Pb}'), [ABytes]); // Петабайт
6: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Eb}'), [ABytes]); // Эксабайт
end;
StringChange(Result, ',', '.');
end;

procedure Progress();
var
size: Integer;
begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%';
FileSize(ExpandConstant(CurrentFileName), size);
SizeLabel.Caption := BytesToReadable(size, 1);
end;

procedure InitializeWizard();
begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left := Left + Width/2 - ScaleX(8);
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;

SizeLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
SizeLabel.Top := Top + Height + ScaleY(8);
SizeLabel.Left := Left;
SizeLabel.AutoSize := True;
SizeLabel.Parent := WizardForm.InstallingPage;
end;
end;



не удается создать в инсталляторе выбор типов установки. Мне нужно привести их к примерно такому виду »
Вам необходимо создать свою страницу, в которой вы пропишите типы установки, а при копировании файлов просто проверяете отмечен ли тот или иной тип, с помощью Check

Stable19
17-03-2012, 21:11
rasim933, так будет правильнее:
Name: "{commondesktop}\Spider-Man 2. Enter Electro (PS1)"; Filename: "{app}\psxfin.exe"; WorkingDir: "{app}"; Tasks: desktopicon

Serega, можно поподробнее?

Photon9
17-03-2012, 22:15
Блин, никак не могу решить проблему с указанием рабочей папки в скрипте, вроде и скрипт правильно написан, но тем не менее строка в свойствах ярлыка всеравно пустая. Подскажите что не так????

[Icons]
Name: "{group}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; WorkingDir: "{app}"
Name: "{group}\{cm:UninstallProgram,Zumas Revenge}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; Tasks: desktopicon

alert30
17-03-2012, 22:24
Photon9, по-моему нету лагов.

Stable19
17-03-2012, 22:32
Photon9, указанием рабочей папки в ярлыке? Если да, то вам нужно добавить WorkingDir: "{app}" в конец каждой строки, т.е. скрипт должен в вашем случае выглядеть примерно так:
Name: "{group}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; WorkingDir: "{app}"
Name: "{group}\{cm:UninstallProgram,Zumas Revenge}"; Filename: "{uninstallexe}"; WorkingDir: "{app}"
Name: "{commondesktop}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; WorkingDir: "{app}"; Tasks: desktopicon
Вторая строка отвечает за ярлык удаления игры и если у вас файл uninst000.exe и uninst000.dat будет содержаться в папке, например, {app}\uninstall то и в WorkingDir должно указано быть {app}\uninstall".

Photon9
17-03-2012, 22:42
Stable19, выручил спасибо, а я все первую строку мучил, перебрал уже н-нное количество вариантов, а оказывается вон оно что. Теперь ярлык вышел как положено, и не приходится в ручную дописывать

FX-DENIS
18-03-2012, 14:21
как сделать чтобы размер текущего файла был мегабайтах например 25.8 МБ »
Serega оооогромное спасибо мастеру как вы, в скрипте который вы мне написали,пришлось изменитьSource: F:\Test Drive Unlimited 2\*; DestDir: {app}; AfterInstall: ExtLog() на Progress() ; Flags: ignoreversion recursesubdirs createallsubdirs
и все заработало,вот только одна мелочь странная,если мелкие файлы ,то их размер пишется правильно например 24.4 кб или 26.8мб,а крупные файлы почему,то 512.000000000БТ :closed-to или это так и должно быть при таком скрипте?Может как,то это исправить можно?Используется библиотека innocallback.dll,может надо другой файл?
Скриншот прикрепил

Spell1999
18-03-2012, 14:50
пацаны я тут видел страницу готовых скриптов и потерял ссылку на неё и немогу найти. скиньте плиз ссылку

alex_13_15
18-03-2012, 15:16
Подскажите как обозначить , что исполняемый файл игры находиться не в самой папке где игра установлена, а находиться в подпапках

Johny777
18-03-2012, 15:27
alex_13_15,
Description: Half-Life 2; Filename: {app}\common\half-life 2\hl2.exe; WorkingDir: {app}\common\half-life 2; Parameters: -steam -game hl2 -appid 220;

?

Spell1999,
в шапке темы оно?

alex_13_15
18-03-2012, 19:44
Как изменить иконку Uninstall.exe




© OSzone.net 2001-2012