Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]
всем привет!
Мне нужно из установщика создать архив 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] что-то меняют? У меня нескольподобных повторяющихся штук.
Лександерисправлю.
Лександер, будьте немного сдержаны в высказываниях...
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
Ребят, нужно чтобы во время установки, путь автоматически определялся, т.е. что бы установщик искал нужную папку на компьютере и производил в неё установку. можно как нибудь реализовать?
андрейка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:
Можете подсказать как заставить инсталятор создать ярык нужного файла? »
Почитайте Справку, раздел [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, можно поподробнее?
Блин, никак не могу решить проблему с указанием рабочей папки в скрипте, вроде и скрипт правильно написан, но тем не менее строка в свойствах ярлыка всеравно пустая. Подскажите что не так????
[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
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".
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.