PDA

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


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

doctor_allcome
28-04-2016, 17:45
Добрый день! Уважаемые форумчане, кто нибудь может поделиться примером проверки MD5, для нескольких файлов?
По возможности для стандартного Inno, а не для модов (ResTools).

kotyarko@fb
28-04-2016, 18:44
Уважаемые форумчане, кто нибудь может поделиться примером проверки MD5, для нескольких файлов?
По возможности для стандартного Inno, а не для модов (ResTools). » Пример:Procedure InitializeWizard();
var
TFR: TFindRec;
Filename, Msg: String;
begin
if FindFirst(ExpandConstant('{src}\*'), TFR) then
try
repeat
if (TFR.Name <> '.') and (TFR.Name <> '..') then
if TFR.Attributes <> FILE_ATTRIBUTE_DIRECTORY then
begin
Filename := ExpandConstant('{src}\') + ExpandConstant(TFR.Name);
Msg := Msg + Filename + '; MD5: ' + GetMD5OfFile(Filename) + #13#10;
end;
until not FindNext(TFR);
finally
MsgBox(Msg, mbInformation, MB_OK);
FindClose(TFR);
end;
end;

HomeBasic
05-05-2016, 16:03
собрал setup, установил программу, после запуска setup заново, setup уже не спрашивает путь для установки...

какой параметр использовать, чтобы всегда setup спрашивал путь установки, независимо от того, стоИт ли эта версия программы или нет?

doctor_allcome
05-05-2016, 17:19
Добрый день! Прошу помощи! Есть код, срабатывающий при деинсталляции. Удаляет папку приложения полностью. Необходимо что-бы одна папка (СОХРАНЕНИЯ) не удалялась. Если "СОХРАНЕНИЯ" находятся в Documents and Settings или еще где, то все срабатывает нормально. Но если "СОХРАНЕНИЯ" находятся в {app}\ , то удаляется все из {app}\ включая "СОХРАНЕНИЯ".

procedure CurUninstallStepChanged (CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usPostUninstall:
begin
DelTree(ExpandConstant('{app}'),true,true,true);

end;
end;

if CurUninstallStep=usPostUninstall then
begin
if DirExists(ExpandConstant('{app}'+'\СОХРАНЕНИЯ') then
if MsgBox('Вы хотите удалить сохранения?',mbconfirmation, mb_YesNo) = IDYES then
begin
if not DelTree(ExpandConstant('{app}')+'\СОХРАНЕНИЯ', True, True, True) then
MsgBox('Папка с сохранениями не удалена!' #13#13 'Папка не существует или используется другим приложением ...', mbError, MB_OK);
end;
end;
end;

ZVSRus
05-05-2016, 19:38
какой параметр использовать
Попробуйте так:

DirExistsWarning=yes

El Sanchez
05-05-2016, 19:43
какой параметр использовать, чтобы всегда setup спрашивал путь установки, независимо от того, стоИт ли эта версия программы или нет? »
HomeBasic,
DisableDirPage=no

Есть код, срабатывающий при деинсталляции. Удаляет папку приложения полностью. Необходимо что-бы одна папка (СОХРАНЕНИЯ) не удалялась. Если "СОХРАНЕНИЯ" находятся в Documents and Settings или еще где, то все срабатывает нормально. Но если "СОХРАНЕНИЯ" находятся в {app}\ , то удаляется все из {app}\ включая "СОХРАНЕНИЯ". »
doctor_allcome,
[Dirs]
Name: "{app}\СОХРАНЕНИЯ"; Flags: uninsneveruninstall

vint56
05-05-2016, 20:18
Привет всем прошу помощи не отображаются иконки в ComboBox при Style := csDropDownList;
; Автор примера sergey3695
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: Setup1.ico; DestDir: {tmp}; Flags: dontcopy; Attribs: hidden system;
Source: Setup2.ico; DestDir: {tmp}; Flags: dontcopy; Attribs: hidden system;

[Code]
var
ComboBoxImage: TNewComboBox;
ImageList: TImageList;


procedure ComboBox1DrawItem(Control: TWinControl; index:Integer; Rect: TRect; State: TOwnerDrawState);
begin
ComboBoxImage.Canvas.FillRect(Rect);
ImageList.Draw(ComboBoxImage.Canvas,Rect.left,Rect.top,index);
ComboBoxImage.canvas.textout(Rect.left+ImageList.Width+2,Rect.top, ComboBoxImage.items[index]);
end;


function AddIconInList(ImageList: TImageList; FileName: String): Integer;
var
Icon: TIcon;
begin
Icon := TIcon.Create;
try
Icon.LoadFromFile(FileName);
Result := ImageList.AddIcon(Icon);
finally
Icon.Free;
end;
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('Setup1.ico');
ExtractTemporaryFile('Setup2.ico');

ImageList := TImageList.Create(nil);
AddIconInList(ImageList, ExpandConstant('{tmp}\Setup1.ico'));
AddIconInList(ImageList, ExpandConstant('{tmp}\Setup2.ico'));

ComboBoxImage := TNewComboBox.Create(WizardForm);
with ComboBoxImage do
begin
Parent := WizardForm;
Left := ScaleX(15);
Top := ScaleY(322);
Width := ScaleX(190);
Height := ScaleY(31);
// Style:= csOwnerDrawVariable;
Style := csDropDownList;
Font.Color := clWindowText;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [];
ParentFont := False;
Text := 'Directx 9';
Items.Add('Directx 9');
Items.Add('Directx 11');
ItemIndex:=0;
OnDrawItem:= @ComboBox1DrawItem;
end;
end;

HomeBasic
06-05-2016, 09:27
ZVSRus,
к сожалению, ваш параметр DirExistsWarning=yes для моего случая не подходит...

El Sanchez,
спасибо, ваш параметр DisableDirPage=no - то что надо, при повторном запуске setup, он просит указать директорию установки... отлично...

doctor_allcome
06-05-2016, 10:41
El Sanchez, [Dirs]
Name: "{app}\СОХРАНЕНИЯ"; Flags: uninsneveruninstall
Не срабатывает
begin
case CurUninstallStep of
usPostUninstall:
begin
DelTree(ExpandConstant('{app}'),true,true,true);
end;
end;
Удаляет все. А должно удаляться только при при выполнении условия
if MsgBox('Вы хотите удалить сохранения?',mbconfirmation, mb_YesNo) = IDYES then ....

El Sanchez
06-05-2016, 11:46
Удаляет все. А должно удаляться только при при выполнении условия »
doctor_allcome,
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usUninstall:
if DirExists(ExpandConstant('{app}\СОХРАНЕНИЯ')) and
(MsgBox('Вы хотите удалить сохранения?', mbConfirmation, MB_YESNO) = IDYES) then
if not DelTree(ExpandConstant('{app}\СОХРАНЕНИЯ'), True, True, True) then
MsgBox('Папка с сохранениями не удалена!'#13#10'Папка используется другим приложением...', mbError, MB_OK);
end;
end;

не отображаются иконки в ComboBox при Style := csDropDownList; »
vint56, при данном стиле и не должны.

vint56
06-05-2016, 13:27
El Sanchez, я хотел сделать вот так но не чего не вышло с ComboBox
http://s018.radikal.ru/i513/1605/82/75d7f0efa23dt.jpg (http://radikal.ru/fp/f003004e87504f76b836b4b3cf9c6407)

El Sanchez
06-05-2016, 16:21
но не чего не вышло с ComboBox »
vint56, либо субклассировать ComboBox и его ListBox и рисовать все, что душе угодно, в их оконных процедурах, либо использовать ComboBoxEx (https://msdn.microsoft.com/en-us/library/windows/desktop/bb775738%28v=vs.85%29.aspx). Пример:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
WM_USER = $0400;
WC_COMBOBOXEX = 'ComboBoxEx32';
WS_CHILD = $40000000;
WS_VISIBLE = $10000000;
WS_TABSTOP = $10000;
CBS_DROPDOWNLIST = $0003;
CBS_SORT = $0100;
ILC_COLOR24 = $0018;
CBEIF_TEXT = $1;
CBEIF_IMAGE = $2;
CBEIF_SELECTEDIMAGE = $4;
CBEM_INSERTITEM = (WM_USER + {#ifndef UNICODE}1{#else}11{#endif});
CBEM_SETIMAGELIST = (WM_USER + 2);
CB_SETCURSEL = $014E;

type
TComboBoxExItem = record
mask: UINT;
iItem: INT_PTR;
pszText: string;
cchTextMax: Integer;
iImage: Integer;
iSelectedImage: Integer;
iOverlay: Integer;
iIndent: Integer;
lParam: Longint;
end;

function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
function ImageList_Create(cx, cy: Integer; flags: UINT; cInitial, cGrow: Integer): THandle; external 'ImageList_Create@comctl32.dll stdcall';
function ImageList_Destroy(himl: HIMAGELIST): BOOL; external 'ImageList_Destroy@comctl32.dll stdcall';
function ImageList_ReplaceIcon(himl: HIMAGELIST; i: Integer; hIcon: HICON): Integer; external 'ImageList_ReplaceIcon@comctl32.dll stdcall';
function SendMessageCBEI(hWnd: HWND; Msg: UINT; wParam: Longint; var lParam: TComboBoxExItem): Longint; external 'SendMessage{#A}@user32.dll stdcall';

var
GImageList: HIMAGELIST;
GComboBoxEx: HWND;

//////////////////////////////////////////////////////////
procedure CreateComboBoxExItem(Text: string; Icon: HICON);
var
ImageIndex: Integer;
CBItem: TComboBoxExItem;
begin
ImageIndex := ImageList_ReplaceIcon(GImageList, -1, Icon);
with CBItem do
begin
mask := CBEIF_TEXT or CBEIF_IMAGE or CBEIF_SELECTEDIMAGE;
iItem := -1;
pszText := Text;
iImage := ImageIndex;
iSelectedImage := ImageIndex;
end;
SendMessageCBEI(GComboBoxEx, CBEM_INSERTITEM, 0, CBItem);
end;

///////////////////////////
procedure CreateComboBoxEx;
begin
{ create comboex }
GComboBoxEx := CreateWindowEx(0, WC_COMBOBOXEX, '', WS_VISIBLE or WS_CHILD or WS_TABSTOP or CBS_DROPDOWNLIST or CBS_SORT, 0, 0, 320, 320, WizardForm.Handle, 0, HInstance, 0);

{ create imagelist }
GImageList := ImageList_Create(32, 32, ILC_COLOR24{ use ILC_COLOR32 for 32-bit icons }, 0, 0);

{ add items }
CreateComboBoxExItem('Test entry 1', Application.Icon.Handle);
CreateComboBoxExItem('Test entry 2', Application.Icon.Handle);

{ assign imagelist }
SendMessage(GComboBoxEx, CBEM_SETIMAGELIST, 0, GImageList);

{ set selected item }
SendMessage(GComboBoxEx, CB_SETCURSEL, 0, 0);
end;

////////////////////////////
procedure DestroyComboBoxEx;
begin
if GImageList <> 0 then
ImageList_Destroy(GImageList);
if GComboBoxEx <> 0 then
DestroyWindow(GComboBoxEx);
end;

///////////////////////////
procedure InitializeWizard;
begin
WizardForm.OuterNotebook.Hide;
CreateComboBoxEx;
end;

////////////////////////////
procedure DeinitializeSetup;
begin
DestroyComboBoxEx;
end;

vint56
06-05-2016, 16:27
El Sanchez, Большое тебе спасибо за пример

sergey3695
06-05-2016, 19:00
El Sanchez, спасибо. немного дополнил пример.
[Setup]
AppName=Example
AppVerName=Example 1.0
DefaultDirName={pf}\Example
OutputDir=.

[Files]
Source: Setup1.ico; DestDir: {app}; Check: IsChecked(0);
Source: Setup2.ico; DestDir: {app}; Check: IsChecked(1);

[code ]
#define A = (Defined UNICODE) ? "W" : "A"
const
WM_USER = $0400;
WC_COMBOBOXEX = 'ComboBoxEx32';
WS_CHILD = $40000000;
WS_VISIBLE = $10000000;
WS_TABSTOP = $10000;
CBS_DROPDOWNLIST = $0003;
CBS_SORT = $0100;
ILC_COLOR24 = $0018;
ILC_COLOR32 = $0020;
CBEIF_TEXT = $1;
CBEIF_IMAGE = $2;
CBEIF_SELECTEDIMAGE = $4;
CBEM_INSERTITEM = (WM_USER + {#ifndef UNICODE}1{#else}11{#endif});
CBEM_SETIMAGELIST = (WM_USER + 2);
CB_SETCURSEL = $014E;
WM_COMMAND = $0111;
CBN_SELCHANGE = 1;
CB_GETCURSEL = $0147;
CB_GETCOUNT = $0146;
WM_GETTEXT = $D;
WM_GETTEXTLENGTH = $E;
CB_GETLBTEXT = $0148;
CB_GETLBTEXTLEN = $0149;
//
type
TComboBoxExItem = record
mask: UINT;
iItem: INT_PTR;
pszText: string;
cchTextMax: Integer;
iImage: Integer;
iSelectedImage: Integer;
iOverlay: Integer;
iIndent: Integer;
lParam: Longint;
end;

function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
function DeleteObject(hObject: THandle): BOOL; external 'DeleteObject@gdi32.dll stdcall';
function ImageList_Create(cx, cy: Integer; flags: UINT; cInitial, cGrow: Integer): THandle; external 'ImageList_Create@comctl32.dll stdcall';
function ImageList_Destroy(ImageList: HImageList): Bool; external 'ImageList_Destroy@comctl32.dll stdcall';
function ImageList_ReplaceIcon(himl: HIMAGELIST; i: Integer; hIcon: HICON): Integer; external 'ImageList_ReplaceIcon@comctl32.dll stdcall';
function SendMessageCBEI(hWnd: HWND; Msg: UINT; wParam: Longint; var lParam: TComboBoxExItem): Longint; external 'SendMessage{#A}@user32.dll stdcall';

var
GImageList: HIMAGELIST;
GComboBoxEx: HWND;
Icon1: TNewIcon;

function IsChecked(const Index: Integer): Boolean;
begin
Result:= False;
if GComboBoxEx<>0 then
if SendMessage(GComboBoxEx, CB_GETCURSEL, 0, 0)=Index then
Result:= True;
end;

//////////////////////////////////////////////////////////
procedure CreateComboBoxExItem(Text, FileName: string);
var
ImageIndex: Integer;
CBItem: TComboBoxExItem;
Icon: TNewIcon;
begin
Icon:= TNewIcon.Create;
ExtractTemporaryFile(FileName);
try
Icon.LoadFromFile(ExpandConstant('{tmp}\'+FileName));
ImageIndex := ImageList_ReplaceIcon(GImageList, -1, Icon.Handle);
finally
Icon.Free;
end;
with CBItem do
begin
mask := CBEIF_TEXT or CBEIF_IMAGE or CBEIF_SELECTEDIMAGE;
iItem := -1;
pszText := Text;
iImage := ImageIndex;
iSelectedImage := ImageIndex;
end;
SendMessageCBEI(GComboBoxEx, CBEM_INSERTITEM, 0, CBItem);
end;

///////////////////////////
type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;
var
OldProc: Longint;

function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';

function HiWord(L: DWORD): Word;
begin
Result := L shr 16;
end;

var
Text: String;
nIndex: Integer;

function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
case Msg of WM_COMMAND:
begin
if (lParam=GComboBoxEx) and (HIWORD(wParam) = CBN_SELCHANGE) then
begin
nIndex:= SendMessage(GComboBoxEx, CB_GETCURSEL, 0, 0);
WizardForm.NextButton.Caption:= IntToStr(nIndex); // Выбранная строка
WizardForm.CancelButton.Caption:= IntToStr(SendMessage(GComboBoxEx, CB_GETCOUNT, 0, 0)); // Количество строк
//
Text:= '';
SetLength(Text,SendMessage(GComboBoxEx, CB_GETLBTEXTLEN, nIndex, 0));
SendMessage(GComboBoxEx, CB_GETLBTEXT, nIndex, CastStringToInteger(Text));
if WizardForm.Caption<>Text then
WizardForm.Caption:= Text;
end;
end;
end;
Result := CallWindowProc(OldProc, hWnd, Msg, wParam, lParam);
end;

///////////////////////////
procedure CreateComboBoxEx;
begin
{ create comboex } // высота с учетом раскрытого списка
GComboBoxEx := CreateWindowEx(0, WC_COMBOBOXEX, '', WS_VISIBLE or WS_CHILD or CBS_DROPDOWNLIST or CBS_SORT, ScaleX(20), ScaleX(340), ScaleX(210), ScaleY(320), WizardForm.Handle, 0, HInstance, 0);

{ create imagelist } // высота в итоге свернутого 32 (учитывается ImageList_Create)
GImageList := ImageList_Create(32, 32, ILC_COLOR32{ use ILC_COLOR24 for 24-bit icons }, 0, 0);

{ add items }
CreateComboBoxExItem('Test entry 1', 'Setup1.ico');
CreateComboBoxExItem('Test entry 2', 'Setup2.ico');

{ assign imagelist }
SendMessage(GComboBoxEx, CBEM_SETIMAGELIST, 0, GImageList);

{ set selected item }
SendMessage(GComboBoxEx, CB_SETCURSEL, 0, 0);

if GComboBoxEx <> 0 then
OldProc:= SetWindowLong(WizardForm.Handle, -4, CallbackAddr('WindowProc'));
end;

////////////////////////////
procedure DestroyComboBoxEx;
begin
if GImageList <> 0 then
ImageList_Destroy(GImageList);
if GComboBoxEx <> 0 then
DestroyWindow(GComboBoxEx);
end;

///////////////////////////
procedure InitializeWizard;
begin
// WizardForm.OuterNotebook.Hide;
CreateComboBoxEx;
end;

////////////////////////////
procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.Handle, -4, OldProc);
DestroyComboBoxEx;
end;

dinis.grek
07-05-2016, 15:16
Привет. Подскажите, как проверить установлен ли в системе Adobe Flash Player, и если не установлен то предлагаем скачать.


P.S

По поводу Adobe Flash Player поиск дал ответ (http://forum.oszone.net/showthread.php?p=2518447&highlight=Adobe+Flash+Player#post2518447) хотя понятно мало что. Очень хотелось бы увидеть скрипт полностью, для изучения. AlekseyPopovv, вас ожидает корреспонденция, привет.

И если можно, поделитесь дельным примером использования ISCrypt.dll




[Setup]
AppName=Программа
AppVersion=3
AppPublisher=Программа
DefaultDirName={pf}\Программа
DefaultGroupName=Программа
ShowTasksTreeLines=yes
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
Encryption=Yes
Password=1234567

//// всем файлам, которые используются инсталлятором (библиотеки, фон) надо проставляем флаг noencryption
Source: {app}\МуПрог\*; DestDir: {app}\Программа; Flags: ignoreversion recursesubdirs createallsubdirs noencryption; Components: comp

[Code_]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = wpPassword then Result:= True;
end;



Вот что удалось получить. Это все? Или при помощи ISCrypt.dll можно серьезно установить более менее серьезную защиту на сам установщик от распаковки используя шифрование.

habib2302
08-05-2016, 11:04
sergey3695, dll файлы обычно которые заняты процессом explorer. Например aimp_menu64.dll

Sashabyren
09-05-2016, 20:31
Как удалить папку с файлами где будет устанавливаться программа ?

Папка для установки\SOFT // Нужно удалить папку SOFT не зависимо какая папки установки выбрана

P.S
Желать чтобы она удалялась в конце установки

doctor_allcome
10-05-2016, 13:22
Добрый день! Наверное неправильно выразился :) в вопросе.
Есть папка, в ней находятся подпапки, n-шт. При деинсталляции должны удаляться все подпапки кроме одной, а она должна удаляться (или нет) в зависимости от результата ответа на вопрос ... if MsgBox('Вы хотите удалить сохранения?',mbconfirmation, mb_YesNo) = IDYES then ... Если ответ ДА - удалять, НЕТ - оставить.

Serjione
10-05-2016, 16:35
Подскажите пожалуйста, как правильно прописать binary.

Root: HKCU; Subkey: "SOFTWARE\test"; ValueType: binary; ValueName: "LM"; ValueData: "00,00,00,00,94,2f,1e,e7,e6"; Flags: uninsdeletekey

Value data is not a valid value.

TryRooM
10-05-2016, 16:50
Serjione,
Наверное так.

Root: HKCU; SubKey: Software\Test\SETTINGS; ValueType: binary; ValueName: Size; ValueData: 70 05 00 00; Flags: uninsdeletekeyifempty




© OSzone.net 2001-2012