|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 8] |
|
Скрипты Inno Setup. Помощь и советы [часть 8]
|
Ветеран Сообщения: 1264 |
Профиль | Отправить PM | Цитировать
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы (Archive Pack 1):
Скрипты Inno Setup. Помощь и советы [часть 6] Скрипты Inno Setup. Помощь и советы [часть 7] |
|
Отправлено: 08:52, 02-02-2015 |
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Dodakaedr, Мне долго экспериментировать не пришлось, цифра 15 подошла.
|
Отправлено: 06:20, 22-03-2016 | #1451 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1264
|
Профиль | Отправить PM | Цитировать Цитата Dodakaedr:
CreateSolidBrush
function CreateSolidBrush(crColor: DWORD): THandle; external 'CreateSolidBrush@gdi32.dll stdcall'; function DeleteObject(hObject: Longint): BOOL; external 'DeleteObject@gdi32.dll stdcall'; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function DlgProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): Longint; var ps: PAINTSTRUCT; rc: TRect; begin case uMsg of WM_INITDIALOG: begin GBgndBrush := CreateSolidBrush(clFuchsia{или в формате $BBGGRR}); Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; WM_ERASEBKGND: begin GetUpdateRect(hWnd, rc, False); FillRect(wParam, rc, GBgndBrush); Result := 1; end; WM_PAINT: begin BeginPaint(hWnd, ps); FillRect(ps.hdc, ps.rcPaint, GBgndBrush); EndPaint(hWnd, ps); end; WM_CTLCOLORBTN, WM_CTLCOLORSTATIC: begin SetBkMode(wParam, TRANSPARENT); Result := GBgndBrush; end; WM_DESTROY: begin DeleteObject(GBgndBrush); RemoveWindowSubclass(hWnd, GDlgProc, 0); Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; else Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; end; CreatePatternBrush
function CreatePatternBrush(hbmp: HBITMAP): THandle; external 'CreatePatternBrush@gdi32.dll stdcall'; function DeleteObject(hObject: Longint): BOOL; external 'DeleteObject@gdi32.dll stdcall'; function WindowFromDC(hDC: THandle): HWND; external 'WindowFromDC@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 DlgProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): Longint; var ps: PAINTSTRUCT; rc: TRect; pt: TPoint; H: HWND; begin case uMsg of WM_INITDIALOG: begin GBgndBrush := CreatePatternBrush(WizardForm.WizardSmallBitmapImage.Bitmap.Handle); Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; WM_ERASEBKGND: begin H := WindowFromDC(wParam); if H <> 0 then begin MapWindowPoints(H, hWnd, pt, 1); SetBrushOrgEx(wParam, -pt.x, -pt.y, pt); end; GetUpdateRect(hWnd, rc, False); FillRect(wParam, rc, GBgndBrush); Result := 1; end; WM_PAINT: begin BeginPaint(hWnd, ps); FillRect(ps.hdc, ps.rcPaint, GBgndBrush); EndPaint(hWnd, ps); end; WM_CTLCOLORBTN, WM_CTLCOLORSTATIC: begin H := WindowFromDC(wParam); if H <> 0 then begin MapWindowPoints(H, hWnd, pt, 1); SetBrushOrgEx(wParam, -pt.x, -pt.y, pt); end; SetBkMode(wParam, TRANSPARENT); Result := GBgndBrush; end; WM_DESTROY: begin DeleteObject(GBgndBrush); RemoveWindowSubclass(hWnd, GDlgProc, 0); Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; else Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; end; |
|
Отправлено: 09:17, 22-03-2016 | #1452 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Цитата Dodakaedr:
Мне нужно, что бы установщик СНАЧАЛА сохранял в архив файлы, которые уже лежат на компе, а только потом производилась установка. В случае, если установка произошла не удачно, то можно было бы эти все файлы во становить из архива. Я сам так и не смог найти нормальный пример этого |
|
Отправлено: 16:51, 22-03-2016 | #1453 |
Старожил Сообщения: 284
|
Профиль | Отправить PM | Цитировать Цитата vovann01:
В справке как сделать Backup (Создать резервную копию оригинальных файлов) я насчитал около 10 примеров. Где искать смотри на картинке. |
|
------- Последний раз редактировалось ZVSRus, 28-03-2016 в 21:39. Отправлено: 13:55, 24-03-2016 | #1454 |
Новый участник Сообщения: 1
|
Помогите пожалуйста реализовать прилипание мастер формы к краям экрана отрисованной через ботву. Установлена расширенная юникод версия инно 5.5.1. Заранее благодарна
|
Отправлено: 08:42, 26-03-2016 | #1455 |
Ветеран Сообщения: 1264
|
Профиль | Отправить PM | Цитировать Цитата Naomi:
Скрытый текст
[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 SPI_GETWORKAREA = $0030; WM_WINDOWPOSCHANGING = $0046; type TWindowPos = record hwnd: HWND; hwndInsertAfter: HWND; x: Integer; y: Integer; cx: Integer; cy: Integer; flags: UINT; end; function SetWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall'; function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall'; function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint): Longint; external 'DefSubclassProc@comctl32.dll stdcall'; function SystemParametersInfo(uiAction, uiParam: UINT; var pvParam: TRect; fWinIni: UINT): BOOL; external 'SystemParametersInfo{#A}@user32.dll stdcall'; function ReadProcessMemory(hProcess: THandle; lpBaseAddress: Longint; out lpBuffer: TWindowPos; nSize: DWORD; out lpNumberOfBytesRead: DWORD): BOOL; external 'ReadProcessMemory@kernel32.dll stdcall'; function WriteProcessMemory(hProcess: THandle; lpBaseAddress: Longint; var lpBuffer: TWindowPos; nSize: DWORD; out lpNumberOfBytesWritten: DWORD): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall'; function GetCurrentProcess: THandle; external 'GetCurrentProcess@kernel32.dll stdcall'; var GWndProc: Longint; GSnapBuffer: Integer; /////////////////////////////////////////////////////////////////////////// procedure HandleEdge(var Edge: Integer; SnapToEdge, SnapDistance: Integer); begin if (Abs(Edge + SnapDistance - SnapToEdge) < GSnapBuffer) then Edge := SnapToEdge - SnapDistance; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function WndProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): Longint; var LRect: TRect; WindowPos: TWindowPos; NumberOfBytesRead, NumberOfBytesWritten: DWORD; begin case uMsg of WM_WINDOWPOSCHANGING: begin SystemParametersInfo(SPI_GETWORKAREA, 0, LRect, 0); ReadProcessMemory(GetCurrentProcess, lParam, WindowPos, SizeOf(WindowPos), NumberOfBytesRead); HandleEdge(WindowPos.x, LRect.Left, 0); HandleEdge(WindowPos.y, LRect.Top, 0); HandleEdge(WindowPos.x, LRect.Right, WizardForm.Width); HandleEdge(WindowPos.y, LRect.Bottom, WizardForm.Height); WriteProcessMemory(GetCurrentProcess, lParam, WindowPos, SizeOf(WindowPos), NumberOfBytesWritten); Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; else Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; end; /////////////////////////// procedure InitializeWizard; begin GSnapBuffer := 50; if GWndProc = 0 then GWndProc := CallbackAddr('WndProc'); SetWindowSubclass(WizardForm.Handle, GWndProc, 0, 0); end; //////////////////////////// procedure DeinitializeSetup; begin if ExpandConstant('{wizardhwnd}') = '0' then Exit; RemoveWindowSubclass(WizardForm.Handle, GWndProc, 0); end; |
|
Отправлено: 11:39, 27-03-2016 | #1456 |
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Цитата ZVSRus:
|
|
Отправлено: 17:07, 28-03-2016 | #1457 |
Старожил Сообщения: 284
|
Профиль | Отправить PM | Цитировать Цитата vovann01:
Скрытый текст
[Setup] AppName=MyProg AppVerName=MyProg DefaultDirName={pf}\MyProg DefaultGroupName=MyProg OutputDir=. [code] var MyTask: TCheckBox; function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall'; procedure CurStepChanged(CurStep: TSetupStep); var FindFiles: TFindRec; i: integer; MyFiles: array of string; MyDir, BackDir: string; begin if CurStep=ssInstall then begin if MyTask.Checked then begin MyFiles:=['TS3.exe','gameplay.package','*.precomp','*.jpg']; // указать файлы или маски нужные для бакупа через запятую. при указании маски '*' бакупятся все файлы с вложенными папками MyDir:=ExpandConstant('{app}'+'\Game\Bin\'); //папка откуда бакупить BackDir:=ExpandConstant('{app}'+'\Backup\'); // папка куда бакупить for i:=0 to GetArrayLength(MyFiles)-1 do begin if FindFirst(MyDir+MyFiles[i], FindFiles) then begin repeat if not DirExists(BackDir) then begin CreateDir(BackDir); end; MoveFile(MyDir+FindFiles.Name, BackDir+FindFiles.Name); until not FindNext(FindFiles); FindClose(FindFiles); end; end; end; end; end; procedure InitializeWizard(); begin MyTask:=TCheckBox.Create(WizardForm); with MyTask do begin Parent:=WizardForm.SelectDirPage; Caption:='Сделать Бэкап'; Left:=ScaleX(0); Top:=ScaleY(100); Width:=ScaleX(400); Height:=ScaleY(15); TabOrder:=0; Checked:=True; end; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var FindFiles: TFindRec; MyDir, BackDir: string; begin if CurUninstallStep = usPostUninstall then begin MyDir:=ExpandConstant('{app}'+'\Game\Bin\'); //папка куда возвращать файлы BackDir:=ExpandConstant('{app}'+'\Backup\'); // папка откуда брать файлы if DirExists(BackDir) then begin if MsgBox('Восстановить данные из бэкапа?', mbConfirmation, MB_YESNO) = IDYES then begin if FindFirst(BackDir+'*', FindFiles) then begin repeat MoveFile(BackDir+FindFiles.Name, MyDir+FindFiles.Name); until not FindNext(FindFiles); FindClose(FindFiles); RemoveDir(BackDir); end; end; end; end; end; Скрытый текст
Цитата:
Скрытый текст
Пример скрипта, автоматически создающего бэкапы в папки с именем по дате/времени. Кол-во бэкапов задается в скрипте. При превышении кол-ва, самые старые будут удалены. Цитата:
|
|||
------- Отправлено: 21:01, 28-03-2016 | #1458 |
Пользователь Сообщения: 76
|
Профиль | Отправить PM | Цитировать Вопрос по поводу модуля get_hw_caps.dll. Можно ли увеличить объём определяемой видео памяти (в модуле) таким образом
VidRam:=GetVidMemLocal/1000000; if (VidRam<63) or (VidRam>1100) then vr:=VidRam else if VidRam<100 then vr:=64 else if VidRam<200 then vr:=128 else if VidRam<300 then vr:=256 else if VidRam<400 then vr:=384 else if VidRam<600 then vr:=512 else if VidRam<800 then vr:=792 else if VidRam>800 then vr:=1024 else if VidRam<1500 then vr:=1280 else if VidRam<2100 then vr:=2048 else if VidRam<2600 then vr:=2550 else if VidRam<3100 then vr:=3072; |
Отправлено: 21:37, 28-03-2016 | #1459 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать Помогите решить проблему. Как сделать взаимоисключающий выбор для кнопок из 8 состояний (аналог CheckBox из botva) Если пользователь активирует мышкой кнопку-3, то кнопки-1 или 2 (в зависимости от того, что было выбрано ранее) автоматически меняют свое состояние, т.е. становятся не активными. Всегда должно быть активно не более одной кнопки.
|
------- Отправлено: 14:07, 29-03-2016 | #1460 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты Inno Setup. Помощь и советы [часть 7] | El Sanchez | Автоматическая установка приложений | 2499 | 02-02-2015 08:59 | |
Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
Скрипты Inno Setup. Помощь и советы [часть 5] | El Sanchez | Автоматическая установка приложений | 1999 | 28-03-2013 19:09 | |
Скрипты Inno Setup. Помощь и советы [часть 4] | El Sanchez | Автоматическая установка приложений | 2099 | 22-05-2012 23:16 | |
Скрипты Inno Setup. Помощь и советы [часть 3] | Serega | Автоматическая установка приложений | 3755 | 26-10-2011 17:58 |
|