PDA

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


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

Shift85
21-05-2014, 21:49
Этот файл есть который на скрине »
Антон_Мураткин@vk, Покажите секцию "[Files]" и "ExtractTemporaryFile"

Dodakaedr
21-05-2014, 22:01
На скрине показывается ошибка. Этот файл есть который на скрине »
Проверьте путь куда файл извлекается и откуда вызывается, но без скрипта тяжело сказать в чем именно ошибка.

nik1967
22-05-2014, 00:07
Нафиг вообще используете эту библиотеку? В расширенной Inno давно уже есть CallbackAddr - не надо с собой ни InnoCallback.dll, ни CallbackCtrl.dll таскать.

Kashtan007
22-05-2014, 00:46
Всем привет. Мне нужно реализовать 2 чекбокса на странице "Каталог" в установщике.
Т.е. у нас есть полоска выбора пути (куда устанавливать наши компоненты) и нужно чтобы под ней было 2 чекбокса.

1 чекбокс: Удаление старых компонентов. Т.е. у меня есть папка res_mods... Нужно чтобы при выборе этого чекбокса очищало папку res_mods от всего содержимого.

2 чекбокс: Бекап файлов. У меня есть папка res_mods, но допустим в ней нужные компоненты и я хочу их сохранить. То при выборе этого чекбокса будет создана копия папки res_mods которая будет называться old_res_mods.

Вот это должно выглядеть примерно так:
http://s43.radikal.ru/i101/1405/2c/c6db09dea49b.png

Буду благодарен за помощь!

Антон_Мураткин@vk
22-05-2014, 10:50
Shift85, Dodakaedr, Благодарю! Сам разобрался, просто удалил в скрипте строчку CallbackCtrl.dll и всё заработало.

habib2302
22-05-2014, 13:24
всем привет. хочу доработать свой репак adobe flash player и допустим если выбрать тихую установку перед установкой запускался деинсталлятор, а если устанавливать в ручную, то деинсталлятор не запускался.

Shkutu
22-05-2014, 13:29
Kashtan007, как-то так

var ModCheck, BackupCheck: TNewCheckBox;

procedure InitializeWizard;
begin
ModCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
ModCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
ModCheck.Parent := PageFromID(wpSelectDir).Surface;
ModCheck.Caption:='Удалить старые моды';
ModCheck.left:=wizardForm.DirEdit.left;
ModCheck.Top:=wizardForm.DirEdit.top + ScaleY(30);

BackupCheck:= TNewCheckBox.Create(PageFromID(wpSelectDir));
BackupCheck.Width := PageFromID(wpSelectDir).SurfaceWidth;
BackupCheck.Parent := PageFromID(wpSelectDir).Surface;
BackupCheck.Caption:='Сохранить резервную копию';
BackupCheck.left:=wizardForm.DirEdit.left;
BackupCheck.Top:=ModCheck.top + ScaleY(30);
end;

Shkutu
22-05-2014, 13:49
habib2302, примерно так

function InitializeSetup(): Boolean;
var ResultCode:integer;
begin
if WizardSilent then
if FileExists (ExpandConstant('{uninstallexe}')) then //имхо, если при установке вы что-то пишете в реестр, то перед удалением неплохо было бы еще проверять наличие в реестре данных об уже установленной версии
Exec(ExpandConstant('{uninstallexe}'), '/SILENT', '', SW_SHOW,ewWaitUntilTerminated, ResultCode);
result:=true;
end;

Антон_Мураткин@vk
22-05-2014, 17:36
Доброе время суток! Помогите пожалуйста.

Вот этот текст:procedure InitializeWizard();
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Çàïóñêàåì ìóçûêó
//Ìîæíî äîáàâèòü â èíñòàëë íåñêîëüêî ïåñåí
//BASS_Init(ExpandConstant('{tmp}\*')) //Ïîèñê ïî ìàñêå
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Ñîçäàåì êíîïêó âêë/âûêë
end;

Вставить вот в этот текст.procedure InitializeWizard;

begin
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash piratbit.png',700,1000,700,0,255,False,$FFFFFF,10);

ExtractTemporaryFile('Splash WhiteSmoke.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash WhiteSmoke.png',700,1000,700,0,255,False,$FFFFFF,10);

ExtractTemporaryFile('Splash Game.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash Game.png',700,1000,700,0,255,False,$FFFFFF,10);
WizardForm.Position:=poScreenCenter;
IsMyFont;
wzform;
btn;
welcom;
SelectDir;
Components;
ProgramGroup;
ProgramTask;
CreateControls;
Finish;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
var
ResCode: integer;
begin
ExtractTemporaryFile('Skin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:= true

if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('IsMyFont.dll');
Result:=True;
end;

А то у меня выходит ошибка то на end; то на ExtractTemporaryFile('BASS.dll');

З.Ы. Вставлял в другой скрипт всё нормально было. А в другом вот ошибки вылазиют.
Заранее благодарю.

Dodakaedr
22-05-2014, 17:55
Антон_Мураткин@vk, Так пробовали?

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

function InitializeSetup:boolean;
var
ResCode: integer;
begin
ExtractTemporaryFile('Skin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:= true

if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('IsMyFont.dll');
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');
Result:=True;
end;

procedure InitializeWizard;
begin
BASS_Init('{tmp}\Music.mp3')
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Ñîçäàåì êíîïêó âêë/âûêë

ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash piratbit.png',700,1000,700,0,255,False,$FFFFFF,10);
ExtractTemporaryFile('Splash WhiteSmoke.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash WhiteSmoke.png',700,1000,700,0,255,False,$FFFFFF,10);
ExtractTemporaryFile('Splash Game.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash Game.png',700,1000,700,0,255,False,$FFFFFF,10);
WizardForm.Position:=poScreenCenter;
IsMyFont;
wzform;
btn;
welcom;
SelectDir;
Components;
ProgramGroup;
ProgramTask;
CreateControls;
Finish;
end;

Kashtan007
22-05-2014, 18:09
Shkutu, добавил это в свой скрипт. Чекбоксы появились, но функции не работают.

Антон_Мураткин@vk
22-05-2014, 18:10
Dodakaedr, ДА пробовал, ошибка уже получается на
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash piratbit.png',700,1000,700,0,255,False,$FFFFFF,10);

Shkutu
22-05-2014, 18:12
Приветствую всех!
Ситуация следующая: в коде используется функция из dll. Выглядит примерно так

[Files]
...
Source: "mslib.dll"; Flags: dontcopy
Source: "dblib.dll"; Flags: dontcopy
Source: "libiconv.dll"; Flags: dontcopy
;2 последние длл требуются для работы функции из 1й длл, я их просто кладу рядом с 1й

[Сode]

function GetCRMUserGuid(dbname, host, user, pass:PansiChar):PansiChar;
external 'GetCRMUserGuid@files:mslib.dll stdcall delayload setuponly';

procedure InitializeWizard;
var s: string;
begin
ExtractTemporaryFile('dblib.dll');
ExtractTemporaryFile('libiconv.dll');
s:=GetCRMUserGuid('DB', '127.0.0.1:1433', 'sa', '111');
...
end;


Когда доходит до строчки, где происходит вызов функции, падает с ошибкой "Could not call proc". Похоже на ошибку инициализации, но если смотреть в дебагере, то на этот момент все длл уже извлечены.
Не подскажете, в чем может быть проблема?

Антон_Мураткин@vk,

не очень понимаю, в чем проблема скопировать то, что в функции в 1м тексте между begin и end и вставить в procedure InitializeWizard из второго текста?

procedure InitializeWizard;

begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('Music.mp3');

BASS_Init('{tmp}\Music.mp3') //Çàïóñêàåì ìóçûêó
//Ìîæíî äîáàâèòü â èíñòàëë íåñêîëüêî ïåñåí
//BASS_Init(ExpandConstant('{tmp}\*')) //Ïîèñê ïî ìàñêå
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Ñîçäàåì êíîïêó âêë/âûêë
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash piratbit.png',700,1000,700,0,255,False,$FFFFFF,10);

ExtractTemporaryFile('Splash WhiteSmoke.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash WhiteSmoke.png',700,1000,700,0,255,False,$FFFFFF,10);

ExtractTemporaryFile('Splash Game.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash Game.png',700,1000,700,0,255,False,$FFFFFF,10);
WizardForm.Position:=poScreenCenter;
IsMyFont;
wzform;
btn;
welcom;
SelectDir;
Components;
ProgramGroup;
ProgramTask;
CreateControls;
Finish;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
var
ResCode: integer;
begin
ExtractTemporaryFile('Skin.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
Result:= true

if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('IsMyFont.dll');
Result:=True;
end;

Не уверена, что вставлять надо именно в начало, ибо не знаю, что за функции у вас используются и, соответственно, в каком порядке их лучше выполнять.

Kashtan007, не понимаю, какие функции вы имеете в виду?
Вы просили добавить чекбоксов, в моем примере как раз это. Их обработку надо прописывать отдельно. Выглядеть может примерно так:

procedure CurStepChanged (CurStep: TSetupStep);
begin
if (CurStep==ssInstall) then
begin
if BackupCheck.Checked then
begin
//бэкапите старые моды
end;
if ModCheck.Checked then
begin
//Удаляете старые моды
end;
end;
end;

Kashtan007
22-05-2014, 18:25
Shkutu, спасибо.
Я указывал, что мне нужно не только чекбоксы а еще чтобы они выполняли функции. Удаления и бекапа.

Есть ли полный код на бекап папки и удаление папки. Заранее спасибо!

Антон_Мураткин@vk
22-05-2014, 18:32
Shkutu, Если было бы так просто я бы не написал чтобы помогли. Пробовал я так ошибка идёт на end;

Shkutu
22-05-2014, 18:52
Kashtan007, у меня к сожаление полного кода на подобные вещи нету. Попробуйте поискать по форуму, потому что, насколько я помню, подобный вопрос уже обсуждался.
http://forum.oszone.net/post-2307050-2242.html - здесь что-то похожее, но можно еще поискать.
Антон_Мураткин@vk, хм.. я копировала не глядя, так что в моем примере не хватает нескольких точек с запятой. Если их добавить, то на end; ругаться не должен. И извините за возможно глупый вопрос, но у вас точно все необходимые функции объявлены? Просто в вашем примере объявлено всего несколько функций, а используется их гораздо больше. И тот факт, что компилятор на них ругается, чаще говорит о том, что функции не объявлены. А вообще, вы бы хоть тект ошибки приводили, а то "получается ошибка" это как-то расплывчато.

Kashtan007
22-05-2014, 18:55
Shkutu, ок спасибо поищу.

Irenis
22-05-2014, 19:19
Всем привет)) Вроде бы немного научилась создавать установщики. Но опять возникли трудности. Объясню на примере. Есть игровая компания Game Net. При установке их игр, сначала устанавливается игровой клиент GameNet, а через него уже грузится игра. Подскажите пожалуйста, как создавать такие установщики? Пробовала отдельно делать установщик GameNet и установщик нужной мне игры. Но они естественно друг друга не видят. То есть, если зайти в клиент GameNet, то он просто начинает загружать игру снова. Клиент же самой игры так же работает не корректно.

Другой пример. Игры от компании Game XP. Тут в принципе так же, сначала устанавливается клиент Game XP, а из него уже–игра. Сделала установщик самой игры. Игра запускается только если запускать ее из папки с игрой. Если же запускать с рабочего стола, то постоянно не хватает какого то файла ***.dll и игра не запускается. Если поместить этот ***.dll на рабочий стол, то требует какого то другого ***.dll. В общем как то так :sorry: И как с этим бороться не знаю, и в инете что то ничего не могу найти по этому поводу.

audiofeel
22-05-2014, 19:57
То есть, если зайти в клиент GameNet, то он просто начинает загружать игру снова. Клиент же самой игры так же работает не корректно. »
надо наверняка отследить какие изменения вносит в реестр веб установщик- (я делаю так, просто в реестре ищу по поиску искомое значение -например название издателя или название самой игры)
Игра запускается только если запускать ее из папки с игрой. Если же запускать с рабочего стола, то постоянно не хватает какого то файла ***.dll и игра не запускается. Если поместить этот ***.dll на рабочий стол, то требует какого то другого ***.dll. В общем как то так И как с этим бороться не знаю, и в инете что то ничего не могу найти по этому поводу. »
было у меня такое года 3 -4 назад, со сталкером, нужно было "правильно" указать рабочую папку для файла запуска, в свойствах ярлыка (проще говоря изменить ее)
параметр = WorkingDir: {app} указывает на то, что рабочая папка для создаваемого ярлыка будет как и по умолчанию, то есть это папка приложения, но во многих играх особенно на движке unreal, папка где хранится файл запуска находится в подпапке, обычно Bin, Binaries и тд

[Icons]

Name: {userdesktop}\Название игры; Filename: {app}\файл запуска игры; WorkingDir: место где расположен файл запуска игры

Irenis
22-05-2014, 21:24
audiofeel, спасибо :) Только вроде бы и понятно, но не совсем. Я честно говоря, обычно создаю установщик через мастера, а в получившемся скрипте уже дописываю то что мне нужно, точнее копирую и вставляю необходимые коды. У меня сейчас вот так

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon

То есть ничего не убирать, а просто ниже дописать эту строчку?
Игра World of Dragons. Значит просто написать World of Dragons?
Не совсем поняла, что писать там, где файл запуска игры.
Место где расположен файл запуска игры: "C:\GameXP\AccessPoint\installed\World of Dragons\WOD.exe". То есть так и прописать путь?




© OSzone.net 2001-2012