Andreo Fadio
Ветеран
Правила читал на сайте?Почему всё так сложно .. найти ничего нельзя, находишь и в этом доступ тоже ограничивают только для избранных..
Правила читал на сайте?Почему всё так сложно .. найти ничего нельзя, находишь и в этом доступ тоже ограничивают только для избранных..
AlexZetCrow, несколько причин:AlexZetCrow написал(а):Почему правила работают двояко?
Простите, просто половина туториалов без DLL никак вообще не реализуемы ((AlexZetCrow, несколько причин:
Ссылаетесь на двоякость правил, а созданная Вами тема поменяла суть вопроса уже несколько раз. Может переименовать ее: "Хочу знать абсолютно все и обо всем как можно скорее". Так не бывает. Я такой же мало знающий, но считаю: "В чужой монастырь со своим уставом не ходят". Отбросим инфантильность и нарциссизм, было же сказано об новых правилах: "Это вынужденная мера и она не обсуждается". Может связано с безопасностью форума, ddos-угрозами, сервер платный, а может еще чего. Если нравиться форум, не вижу преград взять пропуск за 3$, да я на транспорт трачу больше в день. У меня были права на скачивания, но решил приобрести все равно и чтобы Вы там не думали про меня после этого. Может слышали про бесплатные проекты, которые хочется поддержать (Inno Setup, Mp3tag, Blender, AIMP, так и данный форум доступен бесплатно, нужна лишь Ваша активность (10 - симпатий).
- Некоторые пользователи не желают оформить свои "наработки" в виде ресурса.
- Правила были введены недавно, а запрета скачивать из "Прикрепленных файлов" нет. Может и введут.
- К новым примерам пользователи порой вынуждены прикреплять инструменты и код с задекларированными функциями, так как порой познаний собеседников недостаточно.
- Может еще чего...
#define NeedSystem = "5.1.3";
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 1800;
NeedVideoRAM = 128;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 512;
NeedPageFile = 1024;
type
#ifdef UNICODE
PChar = PAnsiChar;
#else
AnsiChar = Char;
#endif
THardwareRequirementSnapShot = record
WinName, WinBits, SPack: String;
WinVer: TWindowsVersion;
end;
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of Char;
DeviceString: array [0..127] of Char; StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of Char;
end;
TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of Char; Support, cDestinations: DWord;
end;
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
MemoryEx: TMemoryStatusEx;
i, n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;
SystemName, DeviceName, SoundName, DeviceKey, String: String;
DeviceNamed: AnsiString;
HWREQ: THardwareRequirementSnapShot;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean; external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
function GetDeviceCaps(hDC, nIndex: Integer): Integer; external 'GetDeviceCaps@GDI32 stdcall';
function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer; external 'CreateDC{#A}@GDI32 stdcall';
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevices{#A}@user32.dll stdcall';
function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt; external 'mixerGetDevCaps{#A}@winmm.dll stdcall';
function mixerGetNumDevs: Integer; external 'mixerGetNumDevs@winmm.dll stdcall';
///Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;
/// Размерность выражения
function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi := Hi-1 downto 0 do
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;
///Формат чмслового выражения
function NumToStr(Float: Extended): string;
begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;
/// Конвертация чисел Mb, Gb, Tb
function MbOrTb(Byte: Extended): string;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' MB' else
if Byte/1024 < 1024 then
Result:= NumToStr(Byte/1024) + ' GB' else
Result:= NumToStr(Byte/oneMB) + ' TB';
end;
/// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
Result := Trim(String)
end;
/// Информация о версии сервис пака
function DecodeSystemStr(Str: String): TWindowsVersion;
var tmp, s: String;
begin
tmp := str;
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Major := StrToInt(s);
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.minor := StrToInt(s);
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Build:= StrToInt(s);
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.ServicePackMajor := StrToInt(s);
end;
/// Информация о версии системы
function HWREQ_CompareWindows: Boolean;
var tmp: TWindowsVersion;
begin
Result := False;
tmp := DecodeSystemStr('{#NeedSystem}');
if HWREQ.WinVer.NTPlatform then begin
if (tmp.Major <= HWREQ.WinVer.Major) then
if (tmp.Minor <= HWREQ.WinVer.Minor) then
if (tmp.ServicePackMajor <= HWREQ.WinVer.ServicePackMajor) then
Result := True;
end;
end;
/// Проверка процессоров
function CheckCPU(NeedMHz: Integer): Boolean;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) ///Количество ядер
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n]);
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True;
end;
/// Поиск Установленной Видеокарты
function SearchCardName(const DeviceName: String): String;
begin
for i:= 0 to 9 do
RegQueryStringValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'AdapterDesc', DeviceName);
Result := DeviceName;
end;
/// Модель Установленной Видеокарты
function CardDeviceName: Boolean;
begin
SearchCardName(DeviceName);
Result := (Pos('AMD', DeviceName) <> Pos('Gigabyte', DeviceName)) or (Pos('NVIDIA', DeviceName) <> Pos('MSI', DeviceName)) or (Pos('ASUS', DeviceName) <> Pos('Palit', DeviceName));
end;
// Сведения о Производителе Компьютера
function SystemManufacturer(SManufacturer: String): String;
begin
RegQueryStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\SystemInformation', 'SystemManufacturer', SManufacturer);
Result := SManufacturer;
end;
// Сведения об установленной памяти
function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;
procedure InitializeWizard();
begin
InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие наобходимые компоненты.');
with InfoPage do begin
ChangeText := False
TopText := TNewStaticText.Create(nil)
with TopText do begin
Parent := InfoPage.Surface
Left := 0
Align := alTop;
AutoSize := True
end;
BottomText := TNewStaticText.Create(nil)
with BottomText do begin
Parent := InfoPage.Surface
Caption := 'Когда Вы будете готовы продолжить установку, нажмите "Далее".'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end;
SystemPanel := TMemo.Create(nil)
with SystemPanel do begin
Text := 'Система'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
SystemVersionPanel := TMemo.Create(nil)
with SystemVersionPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
/// Информации о системе из реестра
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', SystemName) then
HWREQ.WinName := DelSP(SystemName);
GetWindowsVersionEx(HWREQ.WinVer);
/// Информации о битности системы
if IsWin64 then
HWREQ.WinBits := 'x64' else
HWREQ.WinBits := 'x86';
/// Вывод информации о системе
if HWREQ.WinVer.ServicePackMajor > 0 then
SystemVersionPanel.Text := ' ' + HWREQ.WinName+' SP'+IntToStr(HWREQ.WinVer.ServicePackMajor)+' '+HWREQ.WinBits+
' ('+IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+
'.'+IntToStr(HWREQ.WinVer.Build)+'), '+SystemManufacturer('SManufacturer') else
SystemVersionPanel.Text := HWREQ.WinName+' '+HWREQ.WinBits+' ('+IntToStr(HWREQ.WinVer.Major)+
'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.Build)+
'); '+SystemManufacturer('SManufacturer');
SystemVersionPanel.Color := $CCFFCC
if IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.ServicePackMajor) < '{#NeedSystem}'
then begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end;
/// Процессор:
ProcessorPanel := TMemo.Create(nil)
with ProcessorPanel do begin
Text := 'Процессор'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
ProcessorMHzPanel := TMemo.Create(nil)
with ProcessorMHzPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
ProcessorMHzPanel.Color := $CCFFCC
if not CheckCPU(NeedMHz) then begin
ProcessorMHzPanel.Color := $CCCCFF
ChangeText := True
end;
/// Вывод информации о процессоре
ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Процессоры';
/// Видеокарта:
VideoPanel := TMemo.Create(nil)
with VideoPanel do begin
Text := 'Видеоадаптер'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
VideoRAMPanel := TMemo.Create(nil)
with VideoRAMPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
VideoRAMPanel.Color := $CCFFCC;
lpDisplayDevice.cb := SizeOf(lpDisplayDevice);
DeviceKey := '';
n := 0;
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do
n := n + 1;
for n := 0 to 127 do
DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n];
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127);
StringChange(DeviceKey, '\Registry\Machine\', '');
errCode := 1;
DeviceValue := 0;
if CardDeviceName then begin
for i := 0 to 9 do
if RegQueryBinaryValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceNamed) then
end else
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceNamed) then
for n := 1 to Length(DeviceNamed) do begin
DeviceValue := DeviceValue + Ord(DeviceNamed[n])*errCode;
errCode := errCode*$100;
end else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
if CardDeviceName then begin
for i := 0 to 9 do
RegQueryDWordValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceValue);
end else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue);
DeviceName := '';
for n := 0 to 127 do
DeviceName := DeviceName + lpDisplayDevice.DeviceString[n];
Delete(DeviceName, Pos(Chr(0), DeviceName), 127);
if DeviceName <> '' then
if CardDeviceName then
VideoRAMPanel.Text := DelSp(DeviceName) + ', ' + IntToStr(DeviceValue/oneMB) + ' Mb' else
VideoRAMPanel.Text := DelSp(DeviceName) + ' (Integrated), ' + MbOrTb(DeviceValue/oneMB)
else begin
if DeviceValue = 0 then
VideoRAMPanel.Text := ' Драйвер устройства не обнаружен';
VideoRAMPanel.Color := $CCCCFF;
ChangeText := True;
end;
if (DeviceValue/oneMB < NeedVideoRAM) then begin
VideoRAMPanel.Color := $CCCCFF;
ChangeText := True;
end;
/// Вывод информации о видеокарте
VideoRAMPanel.Text := ' ' + VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)';
/// Звуковая карта:
AudioPanel := TMemo.Create(nil)
with AudioPanel do begin
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Text := 'Звуковая карта'
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
AudioNamePanel := TMemo.Create(nil)
with AudioNamePanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
AudioNamePanel.Color := $CCFFCC;
for errCode := 0 to mixerGetNumDevs do begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps));
SoundName := ' '
for n := 0 to 31 do
SoundName := SoundName + lpCaps.sName[n];
Delete(SoundName, Pos(Chr(0), SoundName), 31);
Delete(SoundName, Pos(' [', SoundName), 31);
StringChange(SoundName, 'SB ', 'Creative ');
Delete(SoundName, Pos(' Audio', SoundName), 31);
SetArrayLength(Keys, errCode);
if errCode > 0 then Keys[errCode-1] := SoundName;
end;
/// Вывод информации о звуковой карте
if GetArrayLength(Keys) > 1 then begin
AudioPanel.Text := 'Звуковые карты';
AudioNamePanel.Text := '';
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1];
end else
if GetArrayLength(Keys) = 0 then begin
AudioNamePanel.Text := ' Драйвер устройства не обнаружен';
AudioNamePanel.Color := $CCCCFF;
ChangeText := True;
end else
AudioNamePanel.Text := Keys[0];
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')';
/// Объём памяти (RAM)
RAMPanel := TMemo.Create(nil)
with RAMPanel do begin
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Text := 'Объём памяти'
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
RAMTotalPanel := TMemo.Create(nil)
with RAMTotalPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
RAMTotalPanel.Color := $CCFFCC;
if not CheckMemorySize(NeedMB) then begin
RAMTotalPanel.Color := $CCCCFF;
ChangeText := True;
end;
/// Вывод информации об установленной памяти
RAMTotalPanel.Text := ' ' + MbOrTb(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys))/oneMB) + ' используется, ' +
MbOrTb(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB) + ' свободно';
/// Виртуальная память (pagefile)
PageFilePanel := TMemo.Create(nil)
with PageFilePanel do begin
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Text := 'Файл подкачки'
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
PageFileTotalPanel := TMemo.Create(nil)
with PageFileTotalPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
/// Вывод информации о файле подкачки
PageFileTotalPanel.Color := $CCFFCC;
PageFileTotalPanel.Text := ' ' + MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys))/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB) + ' занято системным кэшем';
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then begin
PageFileTotalPanel.Color := $CCCCFF;
ChangeText := True;
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then begin
if ChangeText = True then begin
TopText.Top := 0;
TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям.' #13
'Пожалуйста, проверьте позиции, выделенные красным цветом.';
TopText.Font.Color := clRed;
WizardForm.NextButton.Enabled := False;
end else begin
TopText.Caption := 'Все компоненты соответствуют минимальным требованиям.';
TopText.Font.Color := clGreen;
TopText.Top := 8;
WizardForm.NextButton.Enabled := True;
end;
end;
end;
Имею в виду Bin созданные 7zip архиватором.AlexZetCrow, думаю "Бины" - ".bin" файлы создаваемые Inno Setup, то никак (ИМХО). Стоит посмотреть в сторону ISDone (не знаю доступен ли он) и паковать в архивы (7zip, WinRar, FreeArc).
Можно и в пункт files прописывать, если они не большого обьема.FILES пункт не содержит компонентов, как я понимаю отдельные компоненты надо будет как-то по иному прописывать при использовании ISDone
По моему лучше уж dll использовать и подсовывать png без геморроя с форматом. Библиотека для splash заставки все равно весит ни о чем, на весе установки не скажется никак.также добавлен модуль для создание Splash заставки средствами WinApi (без Dll автор по моему - El Sanchez). Для создания прозрачных Splash необходимо BMP c альфа каналом и глубиной цвета 32-бит,
Смотри такой вопрос, как можно менять иконки установленных уже папок? Ну или в процессе установки подкидывать свои иконки к этим создаваемым папкам?По моему лучше уж dll использовать и подсовывать png без геморроя с форматом. Библиотека для splash заставки все равно весит ни о чем, на весе установки не скажется никак.
там можно больше, чем кажется - вы просто не особо разбираетесь.Кстати по архивам, не выйдет, разве что отдельно компоненты и то не все можно запихнуть в [FILES]
подбрасывать во время установки и на PostInstall обработке уже делать пропись отображения иконки для конкретной папки, если она существует.Смотри такой вопрос, как можно менять иконки установленных уже папок? Ну или в процессе установки подкидывать свои иконки к этим создаваемым папкам?
Ну я разобрался, просто вписав ту же иконку, что используется при создании Setupтам можно больше, чем кажется - вы просто не особо разбираетесь.
подбрасывать во время установки и на PostInstall обработке уже делать пропись отображения иконки для конкретной папки, если она существует.
Code:
#define NeedSystem = "5.1.3";
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 1800;
NeedVideoRAM = 128;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 512;
NeedPageFile = 1024;
type
#ifdef UNICODE
PChar = PAnsiChar;
#else
AnsiChar = Char;
#endif
THardwareRequirementSnapShot = record
WinName, WinBits, SPack: String;
WinVer: TWindowsVersion;
end;
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of Char;
DeviceString: array [0..127] of Char; StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of Char;
end;
TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of Char; Support, cDestinations: DWord;
end;
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
MemoryEx: TMemoryStatusEx;
i, n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;
SystemName, DeviceName, SoundName, DeviceKey, String: String;
DeviceNamed: AnsiString;
HWREQ: THardwareRequirementSnapShot;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean; external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
function GetDeviceCaps(hDC, nIndex: Integer): Integer; external 'GetDeviceCaps@GDI32 stdcall';
function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer; external 'CreateDC{#A}@GDI32 stdcall';
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevices{#A}@user32.dll stdcall';
function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt; external 'mixerGetDevCaps{#A}@winmm.dll stdcall';
function mixerGetNumDevs: Integer; external 'mixerGetNumDevs@winmm.dll stdcall';
///Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;
/// Размерность выражения
function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi := Hi-1 downto 0 do
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;
///Формат чмслового выражения
function NumToStr(Float: Extended): string;
begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;
/// Конвертация чисел Mb, Gb, Tb
function MbOrTb(Byte: Extended): string;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' MB' else
if Byte/1024 < 1024 then
Result:= NumToStr(Byte/1024) + ' GB' else
Result:= NumToStr(Byte/oneMB) + ' TB';
end;
/// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
Result := Trim(String)
end;
/// Информация о версии сервис пака
function DecodeSystemStr(Str: String): TWindowsVersion;
var tmp, s: String;
begin
tmp := str;
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Major := StrToInt(s);
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.minor := StrToInt(s);
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Build:= StrToInt(s);
s := Copy(tmp, 1, Pos('.', tmp)-1);
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.ServicePackMajor := StrToInt(s);
end;
/// Информация о версии системы
function HWREQ_CompareWindows: Boolean;
var tmp: TWindowsVersion;
begin
Result := False;
tmp := DecodeSystemStr('{#NeedSystem}');
if HWREQ.WinVer.NTPlatform then begin
if (tmp.Major <= HWREQ.WinVer.Major) then
if (tmp.Minor <= HWREQ.WinVer.Minor) then
if (tmp.ServicePackMajor <= HWREQ.WinVer.ServicePackMajor) then
Result := True;
end;
end;
/// Проверка процессоров
function CheckCPU(NeedMHz: Integer): Boolean;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) ///Количество ядер
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n]);
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True;
end;
/// Поиск Установленной Видеокарты
function SearchCardName(const DeviceName: String): String;
begin
for i:= 0 to 9 do
RegQueryStringValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'AdapterDesc', DeviceName);
Result := DeviceName;
end;
/// Модель Установленной Видеокарты
function CardDeviceName: Boolean;
begin
SearchCardName(DeviceName);
Result := (Pos('AMD', DeviceName) <> Pos('Gigabyte', DeviceName)) or (Pos('NVIDIA', DeviceName) <> Pos('MSI', DeviceName)) or (Pos('ASUS', DeviceName) <> Pos('Palit', DeviceName));
end;
// Сведения о Производителе Компьютера
function SystemManufacturer(SManufacturer: String): String;
begin
RegQueryStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\SystemInformation', 'SystemManufacturer', SManufacturer);
Result := SManufacturer;
end;
// Сведения об установленной памяти
function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;
procedure InitializeWizard();
begin
InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие наобходимые компоненты.');
with InfoPage do begin
ChangeText := False
TopText := TNewStaticText.Create(nil)
with TopText do begin
Parent := InfoPage.Surface
Left := 0
Align := alTop;
AutoSize := True
end;
BottomText := TNewStaticText.Create(nil)
with BottomText do begin
Parent := InfoPage.Surface
Caption := 'Когда Вы будете готовы продолжить установку, нажмите "Далее".'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end;
SystemPanel := TMemo.Create(nil)
with SystemPanel do begin
Text := 'Система'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
SystemVersionPanel := TMemo.Create(nil)
with SystemVersionPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
/// Информации о системе из реестра
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', SystemName) then
HWREQ.WinName := DelSP(SystemName);
GetWindowsVersionEx(HWREQ.WinVer);
/// Информации о битности системы
if IsWin64 then
HWREQ.WinBits := 'x64' else
HWREQ.WinBits := 'x86';
/// Вывод информации о системе
if HWREQ.WinVer.ServicePackMajor > 0 then
SystemVersionPanel.Text := ' ' + HWREQ.WinName+' SP'+IntToStr(HWREQ.WinVer.ServicePackMajor)+' '+HWREQ.WinBits+
' ('+IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+
'.'+IntToStr(HWREQ.WinVer.Build)+'), '+SystemManufacturer('SManufacturer') else
SystemVersionPanel.Text := HWREQ.WinName+' '+HWREQ.WinBits+' ('+IntToStr(HWREQ.WinVer.Major)+
'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.Build)+
'); '+SystemManufacturer('SManufacturer');
SystemVersionPanel.Color := $CCFFCC
if IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.ServicePackMajor) < '{#NeedSystem}'
then begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end;
/// Процессор:
ProcessorPanel := TMemo.Create(nil)
with ProcessorPanel do begin
Text := 'Процессор'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
ProcessorMHzPanel := TMemo.Create(nil)
with ProcessorMHzPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
ProcessorMHzPanel.Color := $CCFFCC
if not CheckCPU(NeedMHz) then begin
ProcessorMHzPanel.Color := $CCCCFF
ChangeText := True
end;
/// Вывод информации о процессоре
ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Процессоры';
/// Видеокарта:
VideoPanel := TMemo.Create(nil)
with VideoPanel do begin
Text := 'Видеоадаптер'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
VideoRAMPanel := TMemo.Create(nil)
with VideoRAMPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
VideoRAMPanel.Color := $CCFFCC;
lpDisplayDevice.cb := SizeOf(lpDisplayDevice);
DeviceKey := '';
n := 0;
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do
n := n + 1;
for n := 0 to 127 do
DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n];
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127);
StringChange(DeviceKey, '\Registry\Machine\', '');
errCode := 1;
DeviceValue := 0;
if CardDeviceName then begin
for i := 0 to 9 do
if RegQueryBinaryValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceNamed) then
end else
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceNamed) then
for n := 1 to Length(DeviceNamed) do begin
DeviceValue := DeviceValue + Ord(DeviceNamed[n])*errCode;
errCode := errCode*$100;
end else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
if CardDeviceName then begin
for i := 0 to 9 do
RegQueryDWordValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceValue);
end else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue);
DeviceName := '';
for n := 0 to 127 do
DeviceName := DeviceName + lpDisplayDevice.DeviceString[n];
Delete(DeviceName, Pos(Chr(0), DeviceName), 127);
if DeviceName <> '' then
if CardDeviceName then
VideoRAMPanel.Text := DelSp(DeviceName) + ', ' + IntToStr(DeviceValue/oneMB) + ' Mb' else
VideoRAMPanel.Text := DelSp(DeviceName) + ' (Integrated), ' + MbOrTb(DeviceValue/oneMB)
else begin
if DeviceValue = 0 then
VideoRAMPanel.Text := ' Драйвер устройства не обнаружен';
VideoRAMPanel.Color := $CCCCFF;
ChangeText := True;
end;
if (DeviceValue/oneMB < NeedVideoRAM) then begin
VideoRAMPanel.Color := $CCCCFF;
ChangeText := True;
end;
/// Вывод информации о видеокарте
VideoRAMPanel.Text := ' ' + VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)';
/// Звуковая карта:
AudioPanel := TMemo.Create(nil)
with AudioPanel do begin
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Text := 'Звуковая карта'
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
AudioNamePanel := TMemo.Create(nil)
with AudioNamePanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
AudioNamePanel.Color := $CCFFCC;
for errCode := 0 to mixerGetNumDevs do begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps));
SoundName := ' '
for n := 0 to 31 do
SoundName := SoundName + lpCaps.sName[n];
Delete(SoundName, Pos(Chr(0), SoundName), 31);
Delete(SoundName, Pos(' [', SoundName), 31);
StringChange(SoundName, 'SB ', 'Creative ');
Delete(SoundName, Pos(' Audio', SoundName), 31);
SetArrayLength(Keys, errCode);
if errCode > 0 then Keys[errCode-1] := SoundName;
end;
/// Вывод информации о звуковой карте
if GetArrayLength(Keys) > 1 then begin
AudioPanel.Text := 'Звуковые карты';
AudioNamePanel.Text := '';
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1];
end else
if GetArrayLength(Keys) = 0 then begin
AudioNamePanel.Text := ' Драйвер устройства не обнаружен';
AudioNamePanel.Color := $CCCCFF;
ChangeText := True;
end else
AudioNamePanel.Text := Keys[0];
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')';
/// Объём памяти (RAM)
RAMPanel := TMemo.Create(nil)
with RAMPanel do begin
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Text := 'Объём памяти'
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
RAMTotalPanel := TMemo.Create(nil)
with RAMTotalPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
RAMTotalPanel.Color := $CCFFCC;
if not CheckMemorySize(NeedMB) then begin
RAMTotalPanel.Color := $CCCCFF;
ChangeText := True;
end;
/// Вывод информации об установленной памяти
RAMTotalPanel.Text := ' ' + MbOrTb(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys))/oneMB) + ' используется, ' +
MbOrTb(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB) + ' свободно';
/// Виртуальная память (pagefile)
PageFilePanel := TMemo.Create(nil)
with PageFilePanel do begin
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Text := 'Файл подкачки'
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
PageFileTotalPanel := TMemo.Create(nil)
with PageFileTotalPanel do begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end;
/// Вывод информации о файле подкачки
PageFileTotalPanel.Color := $CCFFCC;
PageFileTotalPanel.Text := ' ' + MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys))/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB) + ' занято системным кэшем';
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then begin
PageFileTotalPanel.Color := $CCCCFF;
ChangeText := True;
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then begin
if ChangeText = True then begin
TopText.Top := 0;
TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям.' #13
'Пожалуйста, проверьте позиции, выделенные красным цветом.';
TopText.Font.Color := clRed;
WizardForm.NextButton.Enabled := False;
end else begin
TopText.Caption := 'Все компоненты соответствуют минимальным требованиям.';
TopText.Font.Color := clGreen;
TopText.Top := 8;
WizardForm.NextButton.Enabled := True;
end;
end;
end;
проще сделать кнопку активной всегда и повесить предупреждение по нажатию на кнопку ДалееПомогите добавить предупредительное сообщение позволяющее сделать кнопку ДАЛЕЕ активной. Спасибо
нет, просто читаю документацию идущую в комплекте с компилятором.Вы гений!)))
читайте\ищите на просторах интернета и сами сможете такое делать, даже более.Без вас ничего бы не вышло ))
@Echo Off
Color 0B
Title MaxArc By Timick
@Echo.***************************************************
@Echo.* *
@Echo.* MaxArc By Timick *
@Echo.* *
@Echo.***************************************************
TimeOut 2
CLS
set STARTTIME=%TIME%
PackEXE\arc.exe a -s; -ep1 -di -i2 -r -ed -hp1g2x3h7421 -mMAX GameSetup\DataARC_MAX.bin PackedData\*.*
set ENDTIME=%TIME%
for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do (set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")
for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do (set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")
set /A elapsed=end-start
set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
if %hh% lss 10 set hh=0%hh%
if %mm% lss 10 set mm=0%mm%
if %ss% lss 10 set ss=0%ss%
if %cc% lss 10 set cc=0%cc%
set DURATION=%hh%:%mm%:%ss%,%cc%
@Echo.*****************************************************
@Echo.* *
@Echo.* Started Pack : %STARTTIME% *
@Echo.* Finished Pack : %ENDTIME% *
@Echo.* *
@Echo.* Total Time : %DURATION% *
@Echo.* *
@Echo.*****************************************************
@Echo.
Pause