Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: geranik
Дата сообщения: 26.11.2007 18:02
Подскажите, напишите. Нужен простенький код для проигрывания mp3 и пару кнопок, вкл,выкл. Видел на форуме код выключения wav, но в mp3 надо ещё и bass.dll впихнуть.
Как делаю кнопки, начинаются ошибки с sndPlaySound.

Ладно, я уже придумал
[more=вот так нормально...]
[Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=none
[files]
;файл звука
Source: "C:\1.mp3"; DestDir: "{tmp}"; Flags: dontcopy
[code]
const
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_SAMPLE_LOOP = 4;//повторять


function mciSendString(lpstrCommand: string; lpstrReturnString: string; uReturnLength:integer; hwndCallback:integer):integer;
external 'mciSendStringA@winmm.dll stdcall';

procedure StopSound(Sender: TObject);
begin
mciSendString(ExpandConstant('stop {tmp}\1.mp3'),'NULL',0,0)
end;

procedure playSound(Sender: TObject);
begin
mciSendString(ExpandConstant('play {tmp}\1.mp3'),'NULL',0,0)
end;

procedure InitializeWizard();
var
ButtonStop: TButton;
ButtonPlay: TButton;
begin
ExtractTemporaryFile(ExpandConstant('1.mp3'))
mciSendString(ExpandConstant('stop {tmp}\1.mp3'),'NULL',0,0)
mciSendString(ExpandConstant('play {tmp}\1.mp3'),'NULL',0,0)
ButtonStop := TButton.Create(WizardForm);
ButtonPlay := TButton.Create(WizardForm);
with ButtonStop do
begin
Parent := WizardForm;
Caption :='стоп';
Left := ScaleX(8);
Top :=320
Width := ScaleX(43);
Height := ScaleY(33);
TabOrder := 0;
OnClick:=@StopSound
end;
with ButtonPlay do
begin
Parent := WizardForm;
Caption :='игра';
Left := ScaleX(8);
Top :=190
Width := ScaleX(43);
Height := ScaleY(33);
TabOrder := 0;
OnClick:=@playSound
end;
end;
[/more]
Автор: Ivanyusha
Дата сообщения: 26.11.2007 18:02
Genri
Объявил глобально, всё равно валится. А чем глобальная переменная отличается от локальной для PeekMessage?

Ну и вообще не хочется засорять программу глобальными переменными. Я бы в куче выделил место под структуру, если уж с локальными переменными что-то не в порядке. Только синтаксис new/delete не помню и книги по паскалю под рукой нет. Подскажите, пожалуйста.

Хотя не уверен что это поможет. Мне кажется что что-то не так с экспортом, хотя тип вызова вроде правильный стоит.
Автор: Genri
Дата сообщения: 26.11.2007 18:32
Ivanyusha -- Если локальную не забыл убрать - валится не должно. Дай весь код в личку
Автор: Victor_Dobrov
Дата сообщения: 27.11.2007 11:18
Вопрос к спецам: Имеется [more=скрипт, рисующий на WizardForm иконку]
[Setup]
AppName=Inno Setup
AppVerName=Inno Setup
CreateAppDir=false

[Code]
var Rect: TRect; hIcon: LongInt;

function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32.dll stdcall';
function DrawIconEx(hdc: LongInt; xLeft, yTop: Integer; hIcon: LongInt; cxWidth, cyWidth: Integer; istepIfAniCur, hbrFlickerFreeDraw, diFlags: LongInt): LongInt; external 'DrawIconEx@user32.dll stdcall';

Procedure CurPageChanged(CurPageID: Integer);
Begin    if CurPageID <> wpWelcome then Exit;

hIcon:= ExtractIcon(GetModuleHandle(0), ExpandConstant('{sys}\shell32.dll'), 15);
with TBitmapImage.Create(WizardForm) do begin
    Width:= 48; Height:= 48; //BackColor:= $FF00FF
with Bitmap do begin
    Width:= 32; Height:= 32; Rect.Right:= 32; Rect.Bottom:= 32; Rect.Left:= 0; Rect.Top:= 0;
    Canvas.Brush.Color:= WizardForm.Color;    {цвет по значком}
    Canvas.FillRect(Rect);
    DrawIconEx(Canvas.Handle, 0, 0, hIcon, 32, 32, 0, 0, 3);
    end;
Parent:= PageFromID(wpWelcome).Surface;
end;
End;
[/more] через API-DrawIconEx. 1) Как сделать, чтобы фон под иконкой был прозрачным? 2) Иконка берётся 32х32, а как выбрать 48х48?
Автор: EagleSH
Дата сообщения: 27.11.2007 17:10
Господа, подскажите код для регистрации иконки под расширение

к примеру на C:\Eagle\eagle.ico лежит иконка, код должен зарегистрировать ее под расширение .avi

чтоб видео файлы в системе моей были с моей иконкой к примеру.
Автор: Sampron
Дата сообщения: 27.11.2007 17:53
EagleSH
Примерно так:

[Registry]
Root: HKCR; SubKey: .avi; ValueType: string; ValueName: ; ValueData: MyVideoIcon
Root: HKCR; SubKey: MyVideoIcon\DefaultIcon; ValueType: string; ValueName: ; ValueData: C:\MyIcon.ico
Root: HKCR; SubKey: MyVideoIcon\shell\open\command; ValueType: string; ValueName: ; ValueData: C:\Program Files\Winamp\Winamp.exe
Автор: EagleSH
Дата сообщения: 27.11.2007 17:55
Sampron
спасибо, но сделай плиз на примере скрипт
то шота с этим Root: HKCR; SubKey башня ща не варит.
Автор: Sampron
Дата сообщения: 27.11.2007 18:56
EagleSH
Так это и есть скрипт, изменяй путь к своей иконке и укажи путь своего проигрывателя avi.
Автор: EagleSH
Дата сообщения: 27.11.2007 19:10
Sampron
ага понял, вроде работает, ток 2 вопроса:

1. как сделать чтоб оно сразу применилось, типа рефреш произошёл и иконки поменялись в проводнике, то моя иконка присваевается, а на файле старая остаётся.
2. так мона с любыми расширениями делать? типа поменять .avi на .mp3 и тд?
Автор: Sampron
Дата сообщения: 27.11.2007 19:28
EagleSH

Цитата:
2. так мона с любыми расширениями делать? типа поменять .avi на .mp3 и тд?

Да, можно с любыми.
Цитата:
1. как сделать чтоб оно сразу применилось, типа рефреш произошёл и иконки поменялись в проводнике, то моя иконка присваевается, а на файле старая остаётся.

Это я незнаю как сделать но по этому вопросу у меня есть вопрос к спецам:
Как в инно можно реализовать такой код:

!define SHCNE_ASSOCCHANGED 0x8000000
!define SHCNF_IDLIST 0

System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'

это код из нсис он отвечает за обновление (вступление в силу) занесённых данных в реестр сразу же после установки, чтоб не приходилось перезапускать эксплорер.
Автор: Genri
Дата сообщения: 27.11.2007 21:51
EagleSH
Sampron

Цитата:
ChangesAssociations
Valid values:
yes or no
Default value:
no

Description:
When set to yes, Setup will tell Explorer to refresh its file associations information at the end of the installation, and Uninstall will do the same at the end of uninstallation.

If your installation creates a file association but doesn't have ChangesAssociations set to yes, the correct icon for the file type likely won't be displayed until the user logs off or restarts the computer.
Автор: EagleSH
Дата сообщения: 27.11.2007 21:59
Genri
так просто, спасибо.
Автор: Sampron
Дата сообщения: 27.11.2007 22:02
Блин надо почаще справку читать.
Автор: The Unforgiven
Дата сообщения: 27.11.2007 22:39
Ребят, если не сложно, ответьте кто-нибудь на мой вопрос.
Автор: Sampron
Дата сообщения: 28.11.2007 11:42
Victor_Dobrov

Цитата:
hIcon:= ExtractIcon(GetModuleHandle(0), ExpandConstant('{sys}\shell32.dll'), 15);

Не подскажешь как извлечь .bmp из ресурсов?
Автор: Ivanyusha
Дата сообщения: 28.11.2007 19:31
Genri, отправил в личные сообщения вам полный текст примера с PeekMessage. Не уверен, но проблема похожа на повреждение стека после вызова, то есть что-то не так с импортом. Есть какие-нибудь соображения?
Автор: Victor_Dobrov
Дата сообщения: 29.11.2007 01:21

Цитата:
Не подскажешь как извлечь .bmp из ресурсов?

Возможно, подойдёт LoadBitmap или LoadImage, подробности на MSDN.

function LoadBitmap(hInst: LongInt; lpBitmapName: PChar): HBITMAP; external 'LoadBitmapA@user32.dll stdcall';
function LoadImage(hInst: LongInt; lpszExeFileName: PChar; uType: DWord; cxDesired, cyDesired: LongInt; fuLoad: DWord): hWnd; external 'LoadImageA@user32.dll stdcall';
Автор: war2906
Дата сообщения: 30.11.2007 10:22
Напишите пример скрипта с одновременным использованием слайд-шоу и музыки с кнопками паузы и игры. для старого и нового оформления инсталятора
Автор: GRom V
Дата сообщения: 01.12.2007 15:27
Подскажите плизз как сделать чтобы перед инсталляцией инсталлятор проверял - если операционка 64-разрядная, то запускал файл1.ехе А если 32-разрядная, то файл2.ехе ?!
Автор: serg_aka_lain
Дата сообщения: 01.12.2007 18:13
GRom V

Setup
ArchitecturesAllowed=x86 x64
ArchitecturesInstallIn64BitMode=x64

Files
Source: File_32.exe; DestDir: {app}; DestName: File.exe; Check: not Is64BitInstallMode;
Source: File_64.exe; DestDir: {app}; DestName: File.exe; Check: Is64BitInstallMode;



Автор: GRom V
Дата сообщения: 02.12.2007 02:15
serg_aka_lain
Спасибочки!

Добавлено:
serg_aka_lain
Прошу просчения но это немного НЕ ТО!
Мне нужно чтобы инсталлятор ПЕРЕД НАЧАЛОМ ИНСТАЛЛЯЦИИ - если система 32-разрядная, то запускал File_32.exe, а если 64-разрядная, то File_64.exe.
То есть это както в секции код делать надо.
Автор: serg_aka_lain
Дата сообщения: 02.12.2007 04:27
GRom V


Цитата:
Мне нужно чтобы инсталлятор ПЕРЕД НАЧАЛОМ ИНСТАЛЛЯЦИИ - если система 32-разрядная, то запускал File_32.exe, а если 64-разрядная, то File_64.exe.


Если эти файлы внешние то так попробуй
--------------------------------------------------
function InitializeSetup : Boolean;
var error : Integer;

begin
if IsWin64 then
begin
Exec(ExpandConstant('{src}') + '\File_64.exe', '', '', sw_show, ssInstall, error);
Result:= True;
end
else
begin
Exec(ExpandConstant('{src}') + '\File_32.exe', '', '', sw_show, ssInstall, error);
Result:=True;
end
end;
------------------------------------------------

если внутренние то через ExtractTemporaryFile(' .exe');
Автор: geranik
Дата сообщения: 02.12.2007 09:49
Мне надо, чтобы после проверки установки, чекбоксы компонентов выбирались автоматически. В зависимости от результата. А потом можно скрыть и само окно выбора.
Это возможно?
Вот код для редактирования.
[more]
[Setup]
AppName=prog
AppVerName=1
DefaultDirName={sd}\1
[Code]
function NextButtonClick(CurPage: Integer): Boolean;
var
sz:Integer;
s:string;
s1:string;
begin
Result:=True;
If CurPage=6 then
//Проверка файлов
begin
If (FileSearch('game.exe', ExpandConstant('{app}'))='')
then
begin
//если нету
s:='В директории '+ExpandConstant('{app}')+'' #13 'не обнаружены файлы игры.' #13#13 'Исп. полную установку';
MsgBox(s, mbinformation, mb_Ok);
//...автовыбор компонента vse...//
Result:= true
end
else
begin
//если есть
s1:='Игра обнаружена' #13#13 'только регистрировать.'
MsgBox(s1, mbInformation, mb_Ok);
begin
//...автовыбор компонента update...(без распаковки архива)//
Result:= true
end
end
end
end;

[Files]
[Types]
Name: "выборочная!"; Description: "Выбрано в ручную"; Flags: iscustom
[Components]
Name: "vse"; Description: "полная"; Flags: exclusive
Name: "update"; Description: "регистрация"; Flags: exclusive
;запуск архива при полной установке
[Run]
Filename: "{src}\архив.exe"; WorkingDir: "{src}"; Parameters: "-y -o""{app}\"""; StatusMsg: "Распаковка"; Components: vse; Flags: waituntilterminated

[_EndOfScript]
;[Registry]...................
[/more]

Добавлено: Вот другой принцип. Распакует если надо, но до установки.

[more]
[Setup]
AppName=prog
AppVerName=1
DefaultDirName={sd}\1
[Code]
function NextButtonClick(CurPage: Integer): Boolean;
var
res:Integer;
s3,s5:string;
begin
Result:=True;
If CurPage=6 then
//Проверка файлов
begin
If (FileSearch('game.exe', ExpandConstant('{app}'))='')
then
//нет и распаковка
begin
s3:=ExpandConstant('{src}')+'\архив.exe';
s5:=ExpandConstant('{app}');
Exec(s3, '-y -o"'+ s5 + '"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, res);
end;
Result:= true
end
else
//есть и ничего
begin
Result:= true
end
end;
[/more]
Автор: GRom V
Дата сообщения: 02.12.2007 12:26
serg_aka_lain
Спасибки...вроде то
Автор: putes
Дата сообщения: 03.12.2007 22:49
По ходу инсталляции нужно распаковать архив 7-zip, можно ли такой трюк провернуть?
Про SFX 7-zip знаю как
а вот 7-zip нет

Автор: GRom V
Дата сообщения: 04.12.2007 04:42
А как сделать чтоб ПЕРЕД НАЧАЛОМ ИНСТАЛЛЯЦИИ - если система ХР, то запускал File1.exe, а если Vista, то File2.exe.............?
Автор: namchik
Дата сообщения: 04.12.2007 04:48
putes
как вариант, указать в секции [Run] путь к консольному 7za.exe либо 7zG.exe с параметрами
Автор: Vitalliano
Дата сообщения: 04.12.2007 10:42
Ребята подскажите пожалуйста, как правильно сформировать скрипт, чтобы серийник вводился по групам (4 цифры на групу, всего 5 груп) и при этом кнопка далее была Enabled только в случае ввода всех груп цифр и букв, не бльше не меньше, а в реестр заносился как обычный ключ без груп, целиком?
Автор: EagleSH
Дата сообщения: 04.12.2007 10:51
Господа, нужен код, который при запуске уходит в цикл и проверяет появление определённого процесса (тоесть зацикливается и ждёт, пока не появится нужный процесс). Когда необходимый процесс появляется (eagle.exe к примеру) он запускает внешнюю программу и закрывает процесс этой внешней программы (тоесть прибивает ее).

подскажите, Гуру кодинга
Автор: GRom V
Дата сообщения: 04.12.2007 14:48
Есть такой скриптик

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=False;
Confirm:=False;
sndPlaySound(ExpandConstant('{tmp}\soundexit.wav'), $0001);
if CurPage = wpInstalling then
begin
if MsgBox('Ты действительно хочешь навинтить?', mbError, MB_YESNO) = idYes
then
Cancel:=true
end else
begin
if MsgBox('Ты действительно хочешь навинтить?', mbError, MB_YESNO) = idYes
then Cancel:=true
else sndPlaySound(ExpandConstant(''), $0001);
end;
end;


Как мне добавить сюда (чтоб при ПОДТВЕРЖДЕНИИ выхода из инсталляции) вот этот код:
mciSendString('Close AVIFile',0,0,0) { закрыть AVI-файл}
    BackgroundForm.Free

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.