Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
audiofeel
22-05-2014, 21:32
если игра устанавливается по умолчанию в C:\GameXP\AccessPoint\installed\World of Dragons\, а файл запуска "лежит" по пути
C:\GameXP\AccessPoint\installed\World of Dragons\WOD.exe, то и "рабочая папка у него находится там же = C:\GameXP\AccessPoint\installed\World of Dragons
а что у вас указанно в #define {#MyAppName} ?????
; Ñêðèïò ñîçäàí ÷åðåç Ìàñòåð Inno Setup Script.
; ÈÑÏÎËÜÇÓÉÒÅ ÄÎÊÓÌÅÍÒÀÖÈÞ ÄËß ÏÎÄÐÎÁÍÎÑÒÅÉ ÈÑÏÎËÜÇÎÂÀÍÈß INNO SETUP!
#define MyAppName "World of Dragons"
#define MyAppVersion "1.5"
#define MyAppPublisher "GameXP"
#define MyAppURL "http://www.ñàéò.com/"
#define MyAppExeName "WOD.exe"
[Setup]
; Ïðèìå÷àíèå: Çíà÷åíèå AppId èäåíòèôèöèðóåò ýòî ïðèëîæåíèå.
; Íå èñïîëüçóéòå îäíî è òîæå çíà÷åíèå â ðàçíûõ óñòàíîâêàõ.
; (Äëÿ ãåíåðàöèè çíà÷åíèÿ GUID, íàæìèòå Èíñòðóìåíòû | Ãåíåðàöèÿ GUID.)
AppId={{5579DEF8-4821-43B2-B20A-F0768A5F1284}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\GameXP\AccessPoint\installed\World of Dragon
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
; Ïðèìå÷àíèå: Íå èñïîëüçóéòå "Flags: ignoreversion" äëÿ ñèñòåìíûõ ôàéëîâ
Source: WOD.exe; DestDir: {app}
[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
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
[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent
http://file.sampo.ru/nkz7n3/
надо наверняка отследить какие изменения вносит в реестр веб установщик »
То есть нужно просто все, что найду в реестре, связанное в веб установщиком, экспортировать и потом вставить в скрипт? Или что то еще делать? Просто насчет реестра мне тоже не все понятно. Я уже выше писала, что уроки всякие смотрела и читала про создание установщиков. Так где то говорится, что файлы (или значения правильно?) реестра просто вставить в скрипт. А где то сказано, что этот реестр нужно вставлять через ISTool и еще там какие то команды выполнять. :unsure:
а что у вас указанно в #define {#MyAppName} ????? »
#define MyAppName "World of Dragons"
audiofeel
22-05-2014, 21:53
вот честно, про эту игру я ни чего не знаю, иногда достаточно указать один ключь, иногда необходимо наличие пристутствия определенного файла в какой нить папке, чаще скрытой
давайте сперва разберемся почему ярлык не работает, а потом уже нужно разбираться почему не видит веб установщик что игра уже установленна
выложите скрипт на файлообменник
если игра устанавливается по умолчанию в C:\GameXP\AccessPoint\installed\World of Dragons\ »
давайте сперва разберемся почему ярлык не работает »
Знаете, вы меня натолкнули на мысль, что я изначально все неправильно сделала. Просто у меня уже в C:\GameXP\AccessPoint куча папок и файлов, а сама игра ведь и правда в C:\GameXP\AccessPoint\installed\World of Dragons, а то что в AccessPoint это файлы веб установщика, я так понимаю. И архивировать нужно было все что в папке World of Dragons, а не в папке AccessPoint, как сделала я. Может поэтому не работает?
Irenis, audiofeel, рабочая папка указывает на то, какая папка будет сделана текущей при запуске приложения, в которой рассположены определенные файлы. И это не всегда та папка, в которой находится ексишник.
Dodakaedr
22-05-2014, 22:28
Всем привет. Мне нужно реализовать 2 чекбокса на странице "Каталог" в установщике.
Т.е. у нас есть полоска выбора пути (куда устанавливать наши компоненты) и нужно чтобы под ней было 2 чекбокса.
1 чекбокс: Удаление старых компонентов. Т.е. у меня есть папка res_mods... Нужно чтобы при выборе этого чекбокса очищало папку res_mods от всего содержимого.
2 чекбокс: Бекап файлов. У меня есть папка res_mods, но допустим в ней нужные компоненты и я хочу их сохранить. То при выборе этого чекбокса будет создана копия папки res_mods которая будет называться old_res_mods. »
Попробуйте вот так:
#include "SHFileOperation.iss"
[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа
[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
[ Code]
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;
procedure CurStepChanged (CurStep: TSetupStep);
begin
if CurStep=ssInstall then
if BackupCheck.Checked then
begin
CopyDir(ExpandConstant('{app}\res mods\'),ExpandConstant('{app}\old res mods'));
end;
if ModCheck.Checked then
begin
DelTree(ExpandConstant('{app}\res mods\*'), False, True, True);
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\old res mods\'), ExpandConstant('{app}\res mods'));
RemoveDir(ExpandConstant('{app}\old res mods'));
end;
end;
Kashtan007
23-05-2014, 00:02
Dodakaedr, спасибо большое)
saneksanek
23-05-2014, 05:48
Уважаемые форумчане.Может кто-то помочь из данного кода вырезать код плеера.Как не ковырял все с ошибкой идет
Что требуется http://s006.radikal.ru/i214/1405/ed/abaa971a0aae.png
Сам код:http://yadi.sk/d/wSVC64JhR47hf
Dodakaedr
23-05-2014, 07:51
saneksanek, Выложите все файлы необходимые для работы вашего скрипта, потому что никто не будет сам искать всякие dll-ки, mp3 файлы и т.д.
Dodakaedr
23-05-2014, 08:14
Как место серых окон (Inner Notebook и Inner Page) на страницах установщика поставить изображение (фон)? »
А легче способа нету? »
Возможно такой подойдет:
#include "WizardFormResise.iss"
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
WizardImageFile=Fon.bmp
OutputBaseFilename=2
[Files]
Source: IsPicture_for_all.dll; Flags: dontcopy
Source: Fon.bmp; Flags: dontcopy
[ Code]
procedure Initialize(AhWnd,BhWnd:hWnd);external 'Initialize@{tmp}\IsPicture_for_all.dll stdcall delayload';
procedure Deinitialize;external 'Deinitialize@{tmp}\IsPicture_for_all.dll stdcall delayload';
function NewFont(Height:Integer;thickness,italic,underline,strikeout:DWORD;name:String):hWnd;external 'NewFont@{tmp}\IsPicture_for_all.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
const
TfonColor = $000008; // Цвет фона $000008 - не изменять!
TfontColor = $ffffff; // Цвет тeкста
Var Font1,Font2:hWnd;
function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('IsPicture_for_all.dll');
ExtractTemporaryFile('fon.bmp');
Result:=True;
end;
procedure InitializeWizard();
begin
Font1:= NewFont(16,600,0,0,0,'Comic Sans MS');
Font2:= NewFont(24,900,0,0,0,'Tahoma');
WizardForm.WizardSmallBitmapImage.Hide;
WizardForm.WizardBitmapImage2.Hide;
WizardForm.DirEdit.AutoSelect:=False;
WizardForm.WelcomePage.Color:=TfonColor;// не изменять!
WizardForm.FinishedPage.Color:=TfonColor;
WizardForm.InnerPage.Color:=TfonColor;
WizardForm.DirEdit.Color:=TfonColor;
WizardForm.ReadyMemo.Color:=TfonColor;
WizardForm.MainPanel.Color:=TfonColor;
WizardForm.Font.Handle:=Font1;
WizardForm.WelcomeLabel1.Font.Handle := Font2;
WizardForm.FinishedHeadingLabel.Font.Handle := Font2;
WizardForm.PageNameLabel.Font.Handle := Font1;
WizardForm.PageNameLabel.Font.Color := clGreen;
WizardForm.Font.Color:=TfontColor;
WizardForm.SelectDirBitmapImage.BackColor := clNone;
WizardForm.SelectDirBitmapImage.ReplaceColor := clBtnFace;
WizardForm.WizardBitmapImage.Parent := MainForm;
WizardForm.WizardBitmapImage.SetBounds(0, 0, WizardForm.ClientWidth, WizardForm.ClientHeight);
Initialize(WizardForm.Handle,MainForm.Handle);
end;
procedure DeinitializeSetup();
begin
Deinitialize;
end;
Dodakaedr
23-05-2014, 08:42
saneksanek, Есть вот такой пример по вашему вопросу:
#include "botva2.iss"
#include "BASS_Module.iss"
[Setup]
AppName=BassExample
AppVerName=BassExample
DefaultDirName={pf}\BassExample
[Files]
Source: compiler:Dll Pack\BASS.dll; Flags: dontcopy
Source: compiler:Dll Pack\CallbackCtrl.dll; Flags: dontcopy
Source: compiler:Dll Pack\botva2.dll; Flags: dontcopy
Source: BASS_Files\*; Flags: dontcopy
//Source: music.mp3; DestDir: {tmp}; Flags: dontcopy
[ code]
procedure InitializeWizard();
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('volmax.png');
ExtractTemporaryFile('volmin.png');
ExtractTemporaryFile('volpb.png');
ExtractTemporaryFile('voldote.png');
//ExtractTemporaryFile('Music.mp3');
//BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
//Можно добавить в инсталл несколько песен
//BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске
//Создаем регулятор громкости
BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 20, 325)
end;
procedure DeinitializeSetup();
begin
//BASS_DeInit; //Освобождаем процесс
gdipShutdown
end;
файлы.rar (http://dodakaedr.spaces.ru/files/?r=main%2Fview&Li=690572&Lii=50204624&Link_id=721177&Lt=1&Read=50204624&Sn=1&sid=::sid::)
El Sanchez
23-05-2014, 10:13
Как место серых окон (Inner Notebook и Inner Page) на страницах установщика поставить изображение (фон)? »
Способов несколько:
1. Самый распространенный способ - скрыть OuterNotebook, влепить фоновую картинку на форму, сверху создать аналоги скрытых статиков (TNewStaticText -> TLabel), менять родителя остальных контролов (TBitmapImage, TEdit, TNewCheckListBox и т.д.) в нужное время для имитации перехода между страницами.
2. Сабклассинг (http://ru.wikipedia.org/wiki/Сабклассинг). Переопределить оконные процедуры WizardForm, страниц OuterNotebook (включая вложенные) на свои и отрисовывать фон самому. В TWizardForm и TNewNotebookPage фон рисуется с помощью системной кисти цвета clBtnFace, которую можно представить как узорчастую кисть цвета clBtnFace размером в 1х1 пикселя. Имея картинку, можно создать узорчастую кисть на ее основе, и рисовать фон ею вместо системной в своей оконной процедуре. В примере создается кисть на основе картинки (я не стал создавать кисть на основе картинки с размерами клиентской части формы, взял WizardSmallBitmapImage, чтобы увидеть воочию как система заливает фон кистью), переопределяются оконные процедуры для TWizardForm и TNewNotebookPage, в оконных процедурах фон рисуется созданной кистью при получении сообщения WM_ERASEBKGND.
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
GWL_USERDATA = (-21);
GWL_WNDPROC = (-4);
WM_ERASEBKGND = $0014;
GA_ROOT = 2;
var
g_hBackgroundBrush: THandle;
g_pWndProc, g_pNotebookPageWndProc: Longint;
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
function CreatePatternBrush(hbmp: HBITMAP): THandle; external 'CreatePatternBrush@gdi32.dll stdcall';
function DeleteObject(hObject: THandle): BOOL; external 'DeleteObject@gdi32.dll stdcall';
function GetUpdateRect(hWnd: HWND; var lpRect: TRect; bErase: BOOL): BOOL; external 'GetUpdateRect@user32.dll stdcall';
function GetAncestor(hwnd: HWND; gaFlags: UINT): HWND; external 'GetAncestor@user32.dll stdcall';
function FillRect(hDC: Longint; const lprc: TRect; hbr: Longint): Integer; external 'FillRect@user32.dll stdcall';
function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints: TPoint; cPoints: UINT): Integer; external 'MapWindowPoints@user32.dll stdcall';
function SetBrushOrgEx(hdc: Longint; nXOrg, nYOrg: Integer; var lppt: TPoint): BOOL; external 'SetBrushOrgEx@gdi32.dll stdcall';
//////////////////////////////////////////////////////////////////////////
function WndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
rc: TRect;
begin
case Msg of
WM_ERASEBKGND: begin
GetUpdateRect(hWnd, rc, False);
FillRect(wParam, rc, g_hBackgroundBrush);
Result := 1;
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;
//////////////////////////////////////////////////////////////////////////////////////
function NotebookPageWndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
pt: TPoint;
rc: TRect;
begin
case Msg of
WM_ERASEBKGND: begin
MapWindowPoints(hWnd, GetAncestor(hWnd, GA_ROOT), pt, 1);
SetBrushOrgEx(wParam, -pt.x, -pt.y, pt);
GetUpdateRect(hWnd, rc, False);
FillRect(wParam, rc, g_hBackgroundBrush);
Result := 1;
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;
//////////////////////////////////////////////////////////
procedure SubclassControlProc(const Control: TWinControl);
var
i: Integer;
begin
for i := 0 to Control.ControlCount-1 do if Control.Controls[i] is TWinControl then
begin
// subclass notebook page
if Control.Controls[i] is TNewNotebookPage then with TNewNotebookPage(Control.Controls[i]) do
if GetWindowLong(Handle, GWL_USERDATA) = 0 then
SetWindowLong(Handle, GWL_USERDATA, SetWindowLong(Handle, GWL_WNDPROC, g_pNotebookPageWndProc));
if TWinControl(Control.Controls[i]).ControlCount > 0 then
SubclassControlProc(TWinControl(Control.Controls[i]));
end;
end;
///////////////////////////////////
procedure SubclassWizardFormProc();
begin
// callback proc
if g_pWndProc = 0 then g_pWndProc := CallbackAddr('WndProc');
if g_pNotebookPageWndProc = 0 then g_pNotebookPageWndProc := CallbackAddr('NotebookPageWndProc');
// subclass WizardForm
if GetWindowLong(WizardForm.Handle, GWL_USERDATA) = 0 then
SetWindowLong(WizardForm.Handle, GWL_USERDATA, SetWindowLong(WizardForm.Handle, GWL_WNDPROC, g_pWndProc));
// subclass controls
SubclassControlProc(WizardForm);
end;
////////////////////////////////////////////////////////////
procedure UnSubclassControlProc(const Control: TWinControl);
var
i: Integer;
begin
for i := 0 to Control.ControlCount-1 do if Control.Controls[i] is TWinControl then
begin
// unsubclass notebook page
if (Control.Controls[i] is TNewNotebookPage) then with TNewNotebookPage(Control.Controls[i]) do
if GetWindowLong(Handle, GWL_USERDATA) > 0 then
SetWindowLong(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_USERDATA));
if TWinControl(Control.Controls[i]).ControlCount > 0 then
UnSubclassControlProc(TWinControl(Control.Controls[i]));
end;
end;
/////////////////////////////////////
procedure UnSubclassWizardFormProc();
begin
// unsubclass controls
UnSubclassControlProc(WizardForm);
// unsubclass WizardForm
if GetWindowLong(WizardForm.Handle, GWL_USERDATA) > 0 then
SetWindowLong(WizardForm.Handle, GWL_WNDPROC, GetWindowLong(WizardForm.Handle, GWL_USERDATA));
end;
/////////////////////////////
procedure InitializeWizard();
begin
// create pattern brush
g_hBackgroundBrush := CreatePatternBrush(WizardForm.WizardSmallBitmapImage.Bitmap.Handle);
// subclass
SubclassWizardFormProc();
end;
//////////////////////////////
procedure DeinitializeSetup();
begin
// unsubclass
UnSubclassWizardFormProc();
// delete pattern brush
if g_hBackgroundBrush <> 0 then DeleteObject(g_hBackgroundBrush);
end;
Когда доходит до строчки, где происходит вызов функции, падает с ошибкой "Could not call proc". Похоже на ошибку инициализации, но если смотреть в дебагере, то на этот момент все длл уже извлечены.
Не подскажете, в чем может быть проблема? »
Shkutu, с типами параметров что-то напутали в GetCRMUserGuid. Попробуйте сменить PAnsiChar на String.
El Sanchez, в каком смысле напутала?) Библиотека моя, и в качестве параметров там pchar, который в инно как раз pansichar. А в самой библиотеке (она на fpc) юзать стринги не получается
Shkutu, залейте скрипт с дллками. Гляну.
saurn, вот, несколько обрезанный, а то там много было
http://www.ex.ua/290099597218
Shkutu
[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@{tmp}\mslib.dll stdcall delayload setuponly';
procedure InitializeWizard;
var s: string;
begin
ExtractTemporaryFile('dblib.dll');
ExtractTemporaryFile('libiconv.dll');
ExtractTemporaryFile('mslib.dll');
s:=GetCRMUserGuid('DB', '127.0.0.1:1433', 'sa', '111');
...
end;
Приветствую всех! Уважаемые, подскажите как реализовать задачу:
Вообщем инсталлятор двуязычный: русский/английский (выберается сразу).
Необходимо как-то определить какой язык был выбран и в соответствие с этим выбором дать знать инсталлятору какой из файлов грузить в "InfoBeforeFile"
#ifdef InfoBefore
#if {language} = "english"
InfoBeforeFile=InfoB_E.rtf
#if {language} = "russian"
InfoBeforeFile=InfoB_R.rtf
#endif
что то типо это.. надеюсь вы поняли мою мысль. Помогите разобраться пожалуйста. Заранее спасибо
altef_4, вместо files {tmp} указать? Так я уже пробовала, не помогает
Alloc, попробуйте так
[Languages]
Name: "English"; MessagesFile: "compiler:Default.isl"; InfobeforeFile: "InfoB_E.rtf"
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"; InfobeforeFile:"InfoB_R.rtf
Shkutu, смотрите в сторону библиотеки, что то вы напутали, при ее создании.
El Sanchez
23-05-2014, 16:21
Библиотека моя, и в качестве параметров там pchar »
Shkutu, почитайте здесь (http://www.cyberguru.ru/delphi/strings-details-page8.html), пример в конце как раз ваш случай.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC