PDA

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


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

TryRooM
10-09-2013, 07:50
Помогите с удалением драйвера из директории system32\drivers.Система W64.Драйвер прописывается в обе директории SysWOW64 и System32.
Пробовал через секцию [UninstallDelete] удаляется только из SysWOW64, а директорию System32 в упор не видит, хотя прописывал
{sys}\driver\drv.sys и {win}\system32\drivers\drv.sys, реакции ноль.Как победить эту напасть.

R.i.m.s.k.y.
10-09-2013, 22:47
TryRooM, читать в справке про режим x64

TryRooM
10-09-2013, 23:41
Про это Flags: 64bit я в курсе, но как прикрутить этот флаг к удалению не пойму.

Fakt_37
11-09-2013, 18:59
Здравствуйте, подскажите как сделать чтоб при нажатии на картинку открывался сайт в браузере?

YURSHAT
11-09-2013, 20:11
Здравствуйте, подскажите как сделать чтоб при нажатии на картинку открывался сайт в браузере? »


[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа
DefaultGroupName=Моя программа

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

[Files]
DestName: "Image.bmp"; Source: "compiler:WizModernSmallImage-IS.bmp"; Flags: dontcopy solidbreak

[Code_]
procedure OpenSite(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExecAsOriginalUser('open', 'http://www.innosetup.com/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure RedesignWizardForm;
begin
with TBitmapImage.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(ScaleX(25), ScaleY(313), ScaleX(55), ScaleY(55));
Cursor := crHand;
ExtractTemporaryFile('Image.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image.bmp'));
OnClick := @OpenSite;
end;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end;

Fakt_37
12-09-2013, 08:57
Пример » спасибо попробуем)

Shkutu
12-09-2013, 14:05
Привет! Вопрос, можно ли поменять заглавие у стандартной формочки, выдаваемой MsgBox? Или свою надо рисовать для этого случая?

nik1967
12-09-2013, 18:33
Shkutu, воспользоваться
function MsgBoxEx(AWnd: HWND; AText, ACaption: string; AType, AIcon: UINT; ATimeOut: Integer): Integer;
Правда она работает на инно только от китайских друзей.
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[ code]
procedure InitializeWizard();
begin
MsgBoxEx(0, 'Какое-то сообщение', 'Какой-то заголовок', MB_OK or MB_ICONINFORMATION, 0, 5{время до закрытия в сек. если 0 - таймер выкл.});
end;

Shkutu
12-09-2013, 19:22
Правда она работает на инно только от китайских друзей. »
Ну да, моя студия на эту функцию ругается. А не подскажете, где взять ту самую версию "от китайских друзей"?:)

И еще. Может кто-нибудь знает, есть ли где-нибудь список кодов ошибок?
А то приходится поневоле ковырять чужой скрипт, при попытке компиляции выдает "Internal error (20)". Не пойму, что за ошибка

nik1967
12-09-2013, 20:04
Shkutu, http://innoultra.ru/
Ну или Расширенная версия Inno Setup от Restools (http://forum.oszone.net/showthread.php?p=1201499#post1201499)

saurn
13-09-2013, 08:20
Вопрос, можно ли поменять заглавие у стандартной формочки, выдаваемой MsgBox? »
Помимо расширенного MsgBoxEx от китайских собратьев, можно использовать системные MessageBox:
[code]
#define A = (Defined UNICODE) ? "W" : "A"

//const
// MB_ICONINFORMATION = $40;
// MB_ICONEXCLAMATION = $30;
// MB_ICONQUESTION = $20;
// MB_ICONSTOP = $10;
// MB_ICONNONE = $10;
// MB_SYSTEMMODAL = $1000;


function MessageBox(AWnd: HWND; mbText, mbCaption: String; mbType: Cardinal): Integer;
external 'MessageBox{#A}@user32.dll stdcall';


function InitializeSetup(): Boolean;
begin
MessageBox(Application.Handle, 'Сообщение', 'Заголовок', MB_OK or $40);
end;

Shkutu
13-09-2013, 13:33
nik1967, попробовала поставить инно от Restools, вроде все по инструкции, но скрипт даже не компилится, внезапно ругается на неизвестные данной версии inno сообщения в default.isl.
saurn, спасибо, то, что надо!:)

Johny777
13-09-2013, 16:39
saurn, Shkutu, до кучи имплементация WinApi функции MessageBoxIndirect
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645511%28v=vs.85%29.aspx
входные аргументы по большей части вынес в перечисляемые типы. Так будет проще, чем с флагами
У этого диалогового окна есть возможности настройки, которых нет у встроенных диалоговых окон китайской версии:

#define A = (Defined UNICODE) ? "W" : "A"
const
MB_ICONHAND = $00000010;
MB_ICONQUESTION_ = $00000020;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERISK = $00000040;
MB_USERICON = $00000080;
MB_HELP = $00004000;
MB_CANCELTRYCONTINUE = $00000006;

MB_DEFBUTTON4 = $00000300;

MB_APPLMODAL = $00000000;
MB_SYSTEMMODAL = $00001000;
MB_TASKMODAL = $00002000;

IDTRYAGAIN = 10;
IDCONTINUE = 11;




type
Pointer = Longint;

_HELPINFO = record { Structure pointed to by lParam of WM_HELP }
cbSize: UINT; { Size in bytes of this struct }
iContextType: Integer; { Either HELPINFO_WINDOW or HELPINFO_MENUITEM }
iCtrlId: Integer; { Control Id or a Menu item Id. }
hItemHandle: THandle; { hWnd of control or hMenu. }
dwContextId: DWORD_PTR;{ Context Id associated with this item }
MousePos: TPoint; { Mouse Position in screen co-ordinates }
end;

HINST = THandle;

TPRMsgBoxCallback = Pointer;

_MSGBOXPARAMS = record
cbSize: UINT;
hwndOwner: HWND;
hInstance: HINST;
lpszText: String;
lpszCaption: String;
dwStyle: DWORD;
lpszIcon: String;
dwContextHelpId: DWORD_PTR;
lpfnMsgBoxCallback: TPRMsgBoxCallback;
dwLanguageId: DWORD;
end;


////////////////////////////////////////////////////////////////////


_MBOX_EX_BTNSET =
(
_mb_Abort_Retry_Ignore,
_mb_Cancel_TryAgain_Continue,
_mb_Ok,
_mb_Ok_Cancel,
_mb_Retry_Cancel,
_mb_Yes_No,
_mb_Yes_No_Cancel
);

_MBOX_EX_BTN =
(
_btn_Abort,
_btn_Retry,
_btn_Ignore,
_btn_TryAgain,
_btn_Continue,
_btn_Ok,
_btn_Cancel,
_btn_Yes,
_btn_No
);


_MBOX_EX_ICON =
(
_ico_Warning,
_ico_Error,
_ico_Information,
_ico_Question
);

_MBOX_EX_SHOW =
(
_mb_Modal_App,
_mb_Modal_System,
_mb_Modal_Task
);


function MessageBoxIndirect(const MsgBoxParams: _MSGBOXPARAMS): Integer; external 'MessageBoxIndirect{#A}@user32.dll stdcall';


procedure MessageBoxExDefHelpProc(var lpHelpInfo: _HELPINFO);
begin
MsgBox('Help', mbInformation, MB_OK);
end;


function MessageBoxEx(
const _hwnd: HWND; // хэнл окна - если равен 0 и включена кнопка "справка" сообщение о нажатии кнопки передаётся в каллбэк процедуру MessageBoxExDefHelpProc; если хэндл не 0, то обрабатывам хелп сообщении WM_HELP окну с хэндлом _hwnd
const Message: String; // текст сообщения
const Caption: String; // заголовок окна
const Buttons: _MBOX_EX_BTNSET; // набор кнопок
const FocusButton: _MBOX_EX_BTN; // на какой из кнопок должен быть фокус
const AddHelpButton: Boolean; // булев значение, добавление кнопки "Справка"
const FocusHelpButton: Boolean; // установить фокус на кнопку "справка". Если True, то значение в FocusButton игнорируется
const Icon: _MBOX_EX_ICON; // тип иконки
const Modal: _MBOX_EX_SHOW // тип отображения окна
): _MBOX_EX_BTN; // возвращает нажатую кнопку
var
mp: _MSGBOXPARAMS;
dwFlags: DWORD;
begin
case Buttons of
_mb_Abort_Retry_Ignore:
begin
dwFlags := MB_ABORTRETRYIGNORE;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON4
else
case FocusButton of
_btn_Abort: dwFlags := dwFlags or MB_DEFBUTTON1;
_btn_Retry: dwFlags := dwFlags or MB_DEFBUTTON2;
_btn_Ignore: dwFlags := dwFlags or MB_DEFBUTTON3;
else
dwFlags := dwFlags or MB_DEFBUTTON1;
end;
end;
_mb_Cancel_TryAgain_Continue:
begin
dwFlags := MB_CANCELTRYCONTINUE;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON4
else
case FocusButton of
_btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON1;
_btn_TryAgain: dwFlags := dwFlags or MB_DEFBUTTON2;
_btn_Continue: dwFlags := dwFlags or MB_DEFBUTTON3;
else
dwFlags := dwFlags or MB_DEFBUTTON1;
end;
end;
_mb_Ok:
begin
dwFlags := MB_OK;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON2
end;

_mb_Ok_Cancel:
begin
dwFlags := MB_OKCANCEL;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON3
else
case FocusButton of
_btn_Ok: dwFlags := dwFlags or MB_DEFBUTTON1;
_btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON2;
else
dwFlags := dwFlags or MB_DEFBUTTON1;
end;
end;
_mb_Retry_Cancel:
begin
dwFlags := MB_RETRYCANCEL;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON3
else
case FocusButton of
_btn_Retry: dwFlags := dwFlags or MB_DEFBUTTON1;
_btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON2;
else
dwFlags := dwFlags or MB_DEFBUTTON1;
end;
end;
_mb_Yes_No:
begin
dwFlags := MB_YESNO;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON3
else
case FocusButton of
_btn_Yes: dwFlags := dwFlags or MB_DEFBUTTON1;
_btn_No: dwFlags := dwFlags or MB_DEFBUTTON2;
else
dwFlags := dwFlags or MB_DEFBUTTON1;
end;
end;
_mb_Yes_No_Cancel:
begin
dwFlags := MB_YESNOCANCEL;
if AddHelpButton and FocusHelpButton then dwFlags := dwFlags or MB_DEFBUTTON4
else
case FocusButton of
_btn_Yes: dwFlags := dwFlags or MB_DEFBUTTON1;
_btn_No: dwFlags := dwFlags or MB_DEFBUTTON2;
_btn_Cancel: dwFlags := dwFlags or MB_DEFBUTTON3;
else
dwFlags := dwFlags or MB_DEFBUTTON1;
end;
end;
end;

case Icon of
_ico_Warning: dwFlags := dwFlags or MB_ICONEXCLAMATION;
_ico_Error: dwFlags := dwFlags or MB_ICONHAND;
_ico_Information: dwFlags := dwFlags or MB_ICONASTERISK;
_ico_Question: dwFlags := dwFlags or MB_ICONQUESTION;
end;

if _hwnd <> 0 then
case Modal of
_mb_Modal_App: dwFlags := dwFlags or MB_APPLMODAL;
_mb_Modal_System: dwFlags := dwFlags or MB_SYSTEMMODAL;
_mb_Modal_Task: dwFlags := dwFlags or MB_TASKMODAL;
end;

mp.cbSize:= SizeOf(mp);
mp.hInstance:= hInstance;
mp.hwndOwner:= _hwnd;
mp.lpszText:= Message;
mp.lpszCaption:= Caption;

if AddHelpButton then
begin
dwFlags := dwFlags or MB_HELP;
if _hwnd = 0 then mp.lpfnMsgBoxCallback := CallBackAddr('MessageBoxExDefHelpProc');
end;

mp.dwStyle:= dwFlags;

case MessageBoxIndirect(mp) of
IDABORT: Result := _btn_Abort;
IDRETRY: Result := _btn_Retry;
IDIGNORE: Result := _btn_Ignore;
IDTRYAGAIN: Result := _btn_TryAgain;
IDCONTINUE: Result := _btn_Continue;
IDOK: Result := _btn_Ok;
IDCANCEL: Result := _btn_Cancel;
IDYES: Result := _btn_Yes;
IDNO: Result := _btn_No;
end;
end;





function NextButtonClick(CurPageID: Integer): Boolean;
begin
repeat
until MessageBoxEx(0, 'Test message', 'Test Caption', _mb_Cancel_TryAgain_Continue, _btn_TryAgain, True, False, _ico_Warning, _mb_Modal_Task) <> _btn_TryAgain;
end;

El Sanchez
13-09-2013, 17:29
можно ли поменять заглавие у стандартной формочки, выдаваемой MsgBox? »
Shkutu, Inno названия заголовка и текст сообщения стандартных окон берет из языковых файлов isl, поэтому стоит воспользоваться секцией Messages. Например, меняем заголовок и текст диалового окна при выходе из инсталлятора:

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

[Messages]
ru.ExitSetupTitle=Выход
ru.ExitSetupMessage=Выйти?

Shkutu
13-09-2013, 18:54
текст сообщения стандартных окон берет из языковых файлов isl »
El Sanchez, текст сообщения - да. А вот что касается свойства Сaption у формы, выдаваемой MsgBox - я там такого не нашла, собственно, потому и спросила. Хотя может просто недостаточно внимательно искала.

El Sanchez
13-09-2013, 19:04
Shkutu, тю, до меня только сейчас дошло, что вам нужно :). Тогда используйте то, что ребята выше насоветовали.

Shkutu
13-09-2013, 19:52
El Sanchez, да, уже:))

Johny777
15-09-2013, 22:51
У меня вопрос
как например та же WinApi функция MessageBox(Ex) обрабатывает входные флаги?
вот например мы отправляем туда флаги := MB_ICONINFORMATION or MB_TASKMODAL or MB_CANCELTRYCONTINUE
or складывает эти значения, если не ошибаюсь. Получается новое. А каким макаром теперь из этого числа выдрать те 3 флага назад?
спрашиваю, потому что не понимаю, но хочу понять, тк поняв смогу использовать ( плагиатъ ) тот же подход для своих процедур/функций значительно укоротив при этом их прототипы

и просьба: у кого есть мануал, хорошая книга (посоветуйте пожалуйста), где для самых тупых описана побитавая работа с числами (shr shl xor) или момет мне кто тут всё объяснить?
для меня это темнейший лес и гугл не помогает, я до сих пор эту тему не жую :(
PS: Подозреваю эта тема имеет прямое отношение к моему пред. вопросу

UPD по первому вопросу понял, но к полному пониманию побитовых операций это не привело
http://teran.karelia.pro/articles/item_4464.html

Mat_y
16-09-2013, 12:52
Приветствую всех.
А где можно подробненько почитать, как создать инсталлятор, который сам обновляется с сети и подгружает свежие файлы?

Painkiller
16-09-2013, 21:40
Приветствую всех.
А где можно подробненько почитать, как создать инсталлятор, который сам обновляется с сети и подгружает свежие файлы? »
В шапке все есть




© OSzone.net 2001-2012