|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 8] |
|
|
Скрипты Inno Setup. Помощь и советы [часть 8]
|
|
Ветеран Сообщения: 1274 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме 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 |
|
Ветеран Сообщения: 1274
|
Профиль | Отправить 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 |
|
Старожил Сообщения: 292
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 1274
|
Профиль | Отправить 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 |
|
Старожил Сообщения: 292
|
Профиль | Отправить 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 | |
|