Войти

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


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

DA-Bro
17-11-2022, 17:52
ZVSRus,
[Setup]
MinVersion = 0.0,5.01

ShowLanguageDialog = yes

#define AppExe "{app}\Program.exe"
#define AppName "Program"
#define AppVerName = "Program 1.0"
#define AppVer "1.0"

AppName = {#AppName}
AppVerName = {#AppVerName}
AppVersion = {#AppVer}
AppPublisher = {#AppPub}
AppPublisherURL = {#AppURL}
AppId = {#AppName}
UninstallDisplayIcon = {#AppExe}
VersionInfoVersion = {#AppVer}
AppComments = "Program"

DefaultDirName = "{pf}\Program\Program"
DefaultGroupName = "Program\Program"

DisableWelcomePage = no
AlwaysUsePersonalGroup = yes
AllowNoIcons = yes

SetupIconFile = Image\Setup.ico
WizardImageFile = Image\WizardImage.bmp
WizardSmallImageFile = Image\WizardSmallImage.bmp

Alex S
17-11-2022, 18:14
где взять расширенную версию попробовать. »

Отправил ссылку в личку... Пробуй.

ZVSRus
17-11-2022, 18:26
#define AppExe "{app}\SSDToolBox.exe"
#define AppName "ADATA SSD ToolBox"
#define AppVerName = "ADATA SSD ToolBox 5.0.16"
#define AppVer "5.0.16"
#define AppPub "ADATA Technology Co., Ltd."
#define AppCopyright "Copyright © 2020-2022, ADATA Technology Co., Ltd."
#define AppDescription AppVerName

#define AppURL "https://www.adata.com/"

[Setup]
MinVersion = 0.0,5.01
ShowLanguageDialog = yes

AppName = {#AppName}
AppVerName = {#AppVerName}
AppVersion = {#AppVer}
AppPublisher = {#AppPub}
AppPublisherURL = {#AppURL}
AppSupportURL = {#AppURL}
AppUpdatesURL = {#AppURL}
AppCopyright = {#AppCopyright}
AppId = {#AppName}
UninstallDisplayIcon = {#AppExe}
VersionInfoDescription = {#AppDescription}
VersionInfoVersion = {#AppVer}
AppComments = "ADATA SSD ToolBox"

DefaultDirName = "{pf}\ADATA\SSD ToolBox"
DefaultGroupName = "ADATA\SSD ToolBox"

OutputBaseFilename = ADATA.SSD.ToolBox

DisableWelcomePage = no
AlwaysUsePersonalGroup = yes
AllowNoIcons = yes

SetupIconFile = Setup.ico
WizardImageFile = WizardImage.bmp
//WizardSmallImageFile = Image\WizardSmallImage.bmp

Alex S
17-11-2022, 18:27
SetupIconFile = Image\Setup.ico
Если рядом со скриптом есть папка, в которой лежит твой файл значка Setup.ico, то все должно работать без проблем...

DA-Bro
17-11-2022, 19:01
ZVSRus, а кусок кода можно посмотреть который Вы проверяли.
Мне надо пример полностью увидеть, так то легче соображается.

Вот вставляю я это:

procedure NewIcon;
begin
var
Icon: TNewIcon;
begin
Icon := TNewIcon.Create; ///Support True Color
Icon.LoadFromFile(ExpandConstant('Image\Icon.ico'));
Icon.Width := 16; ///Selected Icon Size (16x16 ; 32x32; 48x48 ......)
Icon.Height := 16; ///Default Size: 32x32
WizardForm.Icon.Handle := Icon.Handle;
end;

И тормозит у меня на строчке var

ZVSRus
17-11-2022, 19:16
DA-Bro
Выше var begin убери.

Иконка и без этого куска кода работает.

DA-Bro
17-11-2022, 19:50
ZVSRus,
Иконка и без этого куска кода работает.

Это понятно, только какая?

А мы об одном и том же говорим?
Иконка должна заменить картинку в правом верхнем углу.

Вот мне и попались в справке два варианта этих словами не скажешь злополучных кодов)

ZVSRus
17-11-2022, 20:06
DA-Bro
Это сообщение что Неизвестный тип TNewIcon.
Без скрипта тяжело что либо понять.
Показывай весь скрипт.

DA-Bro
17-11-2022, 20:18
ZVSRus,
#define WildcardExists(str FileName) \
((Local[0] = FindFirst(FileName, faAnyFile)) ? \
(FindClose(Local[0]), True): False)

#define FolderExists(str FolderName) \
((Local[0] = FindFirst(FolderName, faDirectory)) ? \
(FindClose(Local[0]), True): False)

#ifdef UNICODE
#define AW "W"
#define W "W"
#else
#define AW "A"
#define W ""
#endif

[Code]
{
Функции, константы и типы WinAPI
}

const
INVALID_HANDLE_VALUE = -1;

LOAD_LIBRARY_AS_DATAFILE = $2;
LOAD_LIBRARY_AS_IMAGE_RESOURCE = $20;

ERROR_SUCCESS = $0;
TH32CS_SNAPPROCESS = $2;
PROCESS_TERMINATE = $1;

SPI_SETSCREENSAVEACTIVE = $11;
SPI_SETCURSORS = $57;
SPIF_SENDCHANGE = $2;

{
GENERIC_READ = $80000000;
GENERIC_WRITE = $40000000;
GENERIC_EXECUTE = $20000000;
GENERIC_ALL = $10000000;
FILE_SHARE_READ = $1;
FILE_SHARE_WRITE = $2;
FILE_SHARE_DELETE = $4;
CREATE_NEW = $1;
CREATE_ALWAYS = $2;
OPEN_EXISTING = $3;
OPEN_ALWAYS = $4;
TRUNCATE_EXISTING = $5;
FILE_READ_ATTRIBUTES = $80;
FILE_WRITE_ATTRIBUTES = $100;
}

type
TProcessEntry32 = record
dwSize : dword;
cntUsage : dword;
th32ProcessID : dword;
th32DefaultHeapID : longint;
th32ModuleID : dword;
cntThreads : dword;
th32ParentProcessID : dword;
pcPriClassBase : longint;
dwFlags : dword;
szExeFile : Array[0..259] of Char;
end;

function CloseHandle (hObject: THandle): bool; external 'CloseHandle@kernel32.dll stdcall delayload';

function LoadLibraryEx (lpFileName: string; hFile: THandle; dwFlags: dword): THandle; external 'LoadLibraryEx{#AW}@kernel32.dll stdcall delayload';
function LoadString (hInstance: THandle; uID: longint; lpBuffer: String; nBufferMax: integer): integer; external 'LoadString{#AW}@user32.dll stdcall delayload';
function FreeLibrary (hModule: THandle): bool; external 'FreeLibrary@kernel32.dll stdcall delayload';

function CreateToolhelp32Snapshot (dwFlags, th32ProcessID: dword): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall delayload';
function Process32First (hSnapshot: THandle; var lppe: TProcessEntry32): bool; external 'Process32First{#W}@kernel32.dll stdcall delayload';
function Process32Next (hSnapshot: THandle; var lppe: TProcessEntry32): bool; external 'Process32Next{#W}@kernel32.dll stdcall delayload';
function OpenProcess (dwDesiredAccess: dword; bInheritHandle: bool; dwProcessId: dword): THandle; external 'OpenProcess@kernel32.dll stdcall delayload';
function TerminateProcess (hProcess: THandle; uExitCode: longint): bool; external 'TerminateProcess@kernel32.dll stdcall delayload';

function SystemParametersInfo (uiAction: dword; uiParam: variant; var pvParam: variant; fWinIni: dword): bool; external 'SystemParametersInfo{#AW}@user32.dll stdcall delayload';

{
function CreateFile (lpFileName: String; dwDesiredAccess: Cardinal; dwShareMode: Cardinal; lpSecurityAttributes: Cardinal; dwCreationDisposition: Cardinal; dwFlagsAndAttributes: Cardinal; hTemplateFile: Integer): Integer; external 'CreateFile{#AW}@kernel32.dll stdcall delayload';
function ReadFile (hFile: THandle; lpBuffer: String; nNumberOfBytesToRead: LongInt; var lpNumberOfBytesRead: LongInt; lpOverlapped: LongInt): Boolean; external 'ReadFile@kernel32.dll stdcall delayload';
function WriteFile (hFile: THandle; lpBuffer: String; nNumberOfBytesToWrite: LongInt; var lpNumberOfBytesWritten: LongInt; lpOverlapped: LongInt): Boolean; external 'WriteFile@kernel32.dll stdcall delayload';
}


{
Получение пути к папке Программы для константы code.
Использование:
GetProgsDir ('');
}

function GetProgramsDir (Default: String): String;
begin
if IsAdminLoggedOn() then
result:= ExpandConstant ('{commonprograms}')
else
result:= ExpandConstant ('{userprograms}');
end;


{
Адаптация ф-ции WizardGroupValue для константы code.
Использование:
GetProgsCatName ('');
}

function GetGroupDir (Default: String): String;
begin
result:= WizardGroupValue ();
end;


{
Получение текущей даты для константы code.
Использование:
GetDateTime ('yyyymmdd');
}

function GetDateTime (Default: String): String;
begin
result:= GetDateTimeString (Default, #0, #0)
end;


{
Разделение строки в массив.
Использование:
StringSplit ('Строка', 'Разделитель');
}

function StringSplit (Const Str, Splitter: String): Array of String;
var
cPos : Integer;
cStr : String;

begin
while Length (Str) > 0 do
begin

cPos:= Pos (Splitter, Str);

if not (cPos = 0) then
begin
cStr:= Copy (Str, 1, cPos - 1);
Delete (Str, 1, cPos);
end
else
begin
cStr:= Copy (Str, 1, Length (Str));
Str:= '';
end;

if Length (cStr) > 0 then
begin
SetArrayLength (result, GetArrayLength (result) + 1);
result[GetArrayLength (result) - 1]:= cStr;
end;
end;
end;


{
Получение значения бита в числе.
Использование:
GetBit (Число, бит);
}

function GetBit (Const Value, Bit: Integer): Boolean;
begin
result:= (Value and (1 shl Bit)) <> 0;
end;


{
Установка значения 1 бита в числе.
Использование:
SetBit (Переменная, бит);
}

procedure SetBit (Var Value: Integer; const Bit: Integer);
begin
Value:= Value or (1 shl Bit);
end;


{
Эмулятор типа встроенной Inc
Использование:
Inc (Переменная Integer);
}

procedure Inc (Var a: Integer);
begin
a:= a + 1;
end;


{
Удаление файла из-под текущего юзера (нужна для W7)
Использование:
FileDelete_AsUser ('путь к файлу')
}

procedure FileDelete_AsUser (Const sFileName: String);
begin
DeleteFile (ExpandConstant ('{localappdata}\VirtualStore\') + ExtractRelativePath (ExpandConstant ('{sd}'), ExpandConstant (sFileName)));
end;


{
Добавление в панель задач (Taskband на W7)
Использование:
PinToTaskband ('путь к файлу')
}

procedure PinToTaskband (sFileName: String);
var
i : Integer;
hLib : THandle;
sRealFile, sVerb, sVBSFile : String;
oShell, oFile, oVerbs : Variant;

begin
sFileName := ExpandConstant (sFileName);
sRealFile := sFileName;

if (GetWindowsVersion shr 16 < $0601) or Not FileExists (sFileName) then
Exit;

try
hLib:= LoadLibraryEx ('shell32.dll', 0, LOAD_LIBRARY_AS_DATAFILE or LOAD_LIBRARY_AS_IMAGE_RESOURCE);
SetLength (sVerb, 256);
SetLength (sVerb, LoadString (hLib, 5386, sVerb, 255 {#(defined (UNICODE)) ? ("*2") : ("")}));

if Not (Length (sVerb) > 0) then
RaiseException ('Error getting "Pin to taskband" verbosity name');

oShell := CreateOleObject ('Shell.Application');
oFile := oShell.NameSpace(ExtractFileDir (sFileName)).ParseName(ExtractFileName (sFileName));
oVerbs := oFile.Verbs

if oFile.IsLink then
sRealFile:= oFile.GetLink.Path;

for i:= 0 to oVerbs.Count - 1 do
if CompareText (sVerb, oVerbs.Item(i).Name) = 0 then
begin
if oFile.IsLink then
DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (sFileName));

if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), sRealFile) = 1) then
begin
sVBSFile:= GenerateUniqueName (GetTempDir, '.vbs');

SaveStringToFile (sVBSFile, \
'Set oShell=CreateObject("Shell.Application")' + #13 + \
'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (sFileName) + '").ParseName("' + ExtractFileName (sFileName) + '").Verbs' + #13 + \
'For Each oVerb In oVerbs' + #13 + \
' If (oVerb="' + sVerb + '") Then' + #13 + \
' oVerb.DoIt' + #13 + \
' Exit For' + #13 + \
' End If' + #13 + \
'Next' , False);

Exec (ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
DeleteFile (sVBSFile);
end
else
oVerbs.Item(i).DoIt;

Break;
end;
except end;

if Not (hLib = 0) then
FreeLibrary (hLib);
end;


{
Убивание процессов
Использование:
ProcessKill (PID); (функция)
pProcessKill (PID); (процедура)
ProcessKillAll ('имя_процесса');(функция)
pProcessKillAll ('имя_процесса');(процедура)
}

function ProcessKill (Pid: longint): bool;
var
hTargetProc : THandle;
begin
hTargetProc:= OpenProcess (PROCESS_TERMINATE, False, Pid);
if not (hTargetProc = INVALID_HANDLE_VALUE) then
begin
result:= TerminateProcess (hTargetProc, -1);
CloseHandle (hTargetProc);
end;
end;

procedure pProcessKill (Pid: longint);
begin
ProcessKill (Pid);
end;

function ProcessKillAll (TaskName: String): bool;
var
i : longint;
bContinue : bool;
sCurrentProc : String;
hSnapshot : THandle;
rCurrentProc : TProcessEntry32;
begin
if Length (TaskName) = 0 then
Exit;

hSnapshot:= CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
if hSnapshot = INVALID_HANDLE_VALUE then
exit;

rCurrentProc.dwSize := SizeOf (rCurrentProc);
bContinue := Process32First (hSnapshot, rCurrentProc);

while bContinue do
begin
sCurrentProc:= '';
for i:= 0 to 259 do
begin
if rCurrentProc.szExeFile[i] = #0 then
break;

sCurrentProc:= sCurrentProc + rCurrentProc.szExeFile[i];
end;

if CompareText (sCurrentProc, TaskName) = 0 then
Result:= ProcessKill (rCurrentProc.th32ProcessID);

rCurrentProc.dwSize := SizeOf (rCurrentProc);
bContinue := Process32Next (hSnapshot, rCurrentProc);
end;

CloseHandle (hSnapshot);
end;

procedure pProcessKillAll (TaskName: String);
begin
ProcessKillAll (TaskName);
end;

ZVSRus
17-11-2022, 20:55
Это понятно, только какая?

А мы об одном и том же говорим?
Иконка должна заменить картинку в правом верхнем углу.

Вот мне и попались в справке два варианта этих словами не скажешь злополучных кодов)

Блин, две страницы форума исписали, наконец то дошло картинку прикрепить.
Там должна быть не иконка, а простая картинка в .bmp или .png формате.
Эта картинка называется WizardSmallImageFile = WizardSmallImage.bmp (директива в секции Setup)
Ранее я вам давал пример как запихнуть свою картинку на MainPanel

Ваш скрипт (https://www.upload.ee/files/14675246/WizardSmallImage.rar.html)

DA-Bro
17-11-2022, 21:03
ZVSRus, да с картинкой PNG вы мне помогли. Работает как надо. Как бы вопрос закрыт. Спасибо!

Но тут речь, как ICO вместо BMP заменить, чтобы избавиться от головной боли с этой прозрачностью-непрозрачностью картинок BMP.
Вот и наткнулся на эти два варианта из справки.

DA-Bro
17-11-2022, 21:25
ZVSRus, в общем проехали с этой иконкой. Не буду и не надо заморачиваться.
Извиняюсь за отнятое у Вас время.

DA-Bro
18-11-2022, 04:29
Подскажите пожалуйста! А как вот это сделать.

https://i.imgur.com/PBgu3it.png

В обычном мастере показывает только сколько требуется на диске.

Vanadiy777
18-11-2022, 15:48
А как вот это сделать. »
DA-Bro,

вот так не подойдет?
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DisableFinishedPage=yes
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: ENG; MessagesFile: "compiler:Default.isl"
Name: RUS; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: {win}\help\mui\0419\*.chm; DestDir: {app}\Files; Flags: external

[CustomMessages]
RUS.FreeSpace=Доступно места на диске:
RUS.NeedSpace=Требуется места на диске:
ENG.FreeSpace=Free space on disk:
ENG.NeedSpace=Need space on disk:

[_Code]
var
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;
SizeStr: String;
SizeInt: Integer;
SymbolNumber: Integer;

function NumToStr(Float: Extended): String;
begin
Result:= Format('%.2n', [Float]);
StringChange(Result, ',', '.');
while ( Pos('.', Result) > 0 ) and ( (Result[Length(Result)] = '0') or (Result[Length(Result)] = '.') ) do
SetLength(Result, Length(Result) - 1);
end;

function GetSize(): Integer;
begin
SizeStr:= WizardForm.DiskSpaceLabel.Caption;
for SymbolNumber:= 97 to 122 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); ///Находим все символы нижнего регистра и удаляем
while (Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr) > 0) do Delete(SizeStr, Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr),1); end; ///Находим все символы верхнего регистра и удаляем
for SymbolNumber:= 192 to 255 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); ///Находим все символы нижнего регистра и удаляем
while (Pos('.', SizeStr) > 0) do Delete(SizeStr, Pos('.', SizeStr), 1); end; ///Удаляем точки
Delete(SizeStr, Pos(',', SizeStr), 5) ///Удаляем дробную часть
Result:= StrToInt(Trim(SizeStr)); ///Переводим в число
end;

function CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
if FirstNum < SecondNum then Result:= False else Result:= True;
end;

function MbOrTb(Byte: Extended): String;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' Мб' else
if Byte/1024 < 1024 then Result:= NumToStr(Byte/1024) + ' Гб' else
Result:= NumToStr(Byte/(1024*1024)) + ' Тб'
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTb(FreeMB)
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt)
if WizardForm.CurPageID = wpSelectDir then begin
WizardForm.NextButton.Enabled:= CompareNum(FreeMB, SizeInt)
end;
end;

procedure InitializeWizard();
begin
WizardForm.DiskSpaceLabel.Hide;
#ifdef NeedSize
SizeInt:= {#NeedSize}
#else
SizeInt:= GetSize;
#endif

NeedSpaceLabel := TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(0), ScaleY(198), ScaleX(209), ScaleY(13))
NeedSpaceLabel.Parent := WizardForm.SelectDirPage;
NeedSpaceLabel.Transparent:=true;

FreeSpaceLabel := TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(0), ScaleY(216), ScaleX(209), ScaleY(13))
FreeSpaceLabel.Parent := WizardForm.SelectDirPage;
FreeSpaceLabel.Transparent:=true;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then begin
GetFreeSpaceCaption(nil)
end;
end;

DA-Bro
18-11-2022, 19:53
Vanadiy777, Выдает вот такое окошко.

https://i.imgur.com/WBqgXWa.png

Vanadiy777
18-11-2022, 20:00
Выдает вот такое окошко. »
DA-Bro,

попробуйте сначала только пример скомпилировать.

Версия Inno Setup какая? Я на 5.6.1 проверял.

DA-Bro
18-11-2022, 20:11
Vanadiy777, да, я так сейчас один его и попробую.

В архиве темы увидел пост про другую ошибку. Там пишут переменные нужно объявить глобально. Только как.

У меня наверно нестыковка с другим кодом. Похоже надо что-то объединить. Сам не знаю.

Vanadiy777
18-11-2022, 20:26
У меня наверно нестыковка с другим кодом. Похоже надо что-то объединить. Сам не знаю. »
DA-Bro,

если пример отдельно нормально компилируется и работает, то у Вас, видимо, что-то в коде пересекается...
Отсюда же не видно...

DA-Bro
18-11-2022, 20:28
Vanadiy777, Вы мне дали пример похоже один в один то что я попросил как на картинке.

Он работает. То что нужно. Спасибо большое!

Думаю у меня нестыковка с кодом который давали выше с кнопками.

Сейчас попробую подставить к вашему примеру коды по частям и посмотрю когда вылетит ошибка.

DA-Bro
18-11-2022, 21:56
Vanadiy777 Ваш пример "Место на диске" и скрипт от nik1967 тоже рабочий.

Но вот когда их объединяешь лезут ошибки. Не знаю как эту нестыковку поправить.
Как их вот "подружить" друг с другом.
Вот эта ошибка выскочила:

https://i.imgur.com/v2sST6b.png




© OSzone.net 2001-2012