|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
|
Ветеран Сообщения: 1274 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z |
|
|
Отправлено: 16:09, 04-04-2018 |
|
Новый участник Сообщения: 28
|
Профиль | Отправить PM | Цитировать CRC32-C Ansi/Unicode Dlls *fixed*
Пришлось исправлять косяки разработчиков, плохо работало определение наличия технологии SSE 4.2 (кто ж мог подумать )в оригинале: test edx,$100000 // перепутали регистр, по которому берется информация для SSE 4.2 setz al // неправильная установка флага исправленный: test ecx,$100000 // fix setne al // fix фикс основан на интеловских доках, где достаточно сделать проверку только на поддержку SSE 4.2: https://software.intel.com/en-us/art...struction-sets |
|
Отправлено: 15:01, 29-04-2019 | #311 |
|
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать usermode, окей, теперь работает. Но так не честно. Чтобы быть объективным, тогда уж надо подсчитать время и потом сравнивать посекундно, какая функция ведёт подсчёт быстрее. Вот так я подсчитал время перед стартом подсчёта контрольной суммы и после, заодно можно сравить по времени подсчёт MD5 и SHA-1 того же файла:
Скрипт
;InnoSetupVersion=5.6.1 (Unicode)
#define CP = (Defined UNICODE) ? "unicode" : "ansi"
[Setup]
AppName=test
AppVerName=test
OutputDir=...
OutputBaseFilename=HachCheck
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;
[*Code*]
function GetCRC32COfFile(FilePath: String): Cardinal;
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
procedure InitializeWizard;
var
md5, sha1, t1, t2, t3, t4, t5, t6, f1, FileName: string;
crc: cardinal;
begin
if GetOpenFileName(ExpandConstant('Выберите файл'),FileName,ExpandConstant('{src}'),ExpandConstant('Выбрать любой файл ')+'(*.*)|*.*','*') then
if MsgBox(ExpandConstant('Выбран файл')+#10#10+FileName+#10#10+ExpandConstant('Подсчитать контрольную сумму файла "'+ExtractFileName(FileName)+'" ?'), mbInformation, MB_YESNO) = IDYES then
begin
if FileExists(FileName) then
begin
t1:=GetDateTimeString('hh:nn:ss', '-', ':');
crc:=GetCRC32COfFile(FileName);
t2:=GetDateTimeString('hh:nn:ss', '-', ':');
f1:=Format('%.8x',[crc]);
MsgBox(ExpandConstant('Старт вычисления: '+t1)+#10+#10+ExpandConstant('Хэш сумма CRC32: '+f1)+#10#10+ExpandConstant('Конец вычисления: '+t2), mbInformation, MB_OK);
end;
begin
t3:=GetDateTimeString('hh:nn:ss', '-', ':');
md5:=GetMD5OfFile(FileName);
t4:=GetDateTimeString('hh:nn:ss', '-', ':');
MsgBox(ExpandConstant('Старт вычисления: '+t3)+#10+#10+ExpandConstant('Хэш сумма MD5: '+md5)+#10#10+ExpandConstant('Конец вычисления: '+t4), mbInformation, MB_OK);
end;
begin
t5:=GetDateTimeString('hh:nn:ss', '-', ':');
sha1:=GetSHA1OfFile(FileName);
t6:=GetDateTimeString('hh:nn:ss', '-', ':');
MsgBox(ExpandConstant('Старт вычисления: '+t5)+#10+#10+ExpandConstant('Хэш сумма SHA-1: '+sha1)+#10#10+ExpandConstant('Конец вычисления: '+t6), mbInformation, MB_OK);
end;
MsgBox(ExpandConstant('CRC32 :'+#10#10+'Старт вычисления: '+t1)+#10+#10+ExpandConstant('Конец вычисления: '+t2)+#10+#10+#10+
ExpandConstant('MD5 :'+#10#10+'Старт вычисления: '+t3)+#10+#10+ExpandConstant('Конец вычисления: '+t4)+#10+#10+#10+
ExpandConstant('SHA-1 :'+#10#10+'Старт вычисления: '+t5)+#10+#10+ExpandConstant('Конец вычисления: '+t6), mbInformation, MB_OK);
end;
end;
Лучше видно будет на больших файлах, где-то 2-4 Гб, чем больше - тем очевиднее. Вот тогда можно и рассудить. Вот пример вычисления чек-сумм файла 3,80 ГБ:
|
|
Последний раз редактировалось ErikPshat, 29-04-2019 в 19:14. Отправлено: 17:24, 29-04-2019 | #312 |
|
Ветеран Сообщения: 863
|
Профиль | Отправить PM | Цитировать Цитата ErikPshat:
Скрытый текст
function IsAnsiOrSym(S: String): Boolean;
var
n: string;
i,j: integer;
begin
if CompareStr(AnsiUppercase(S), Uppercase(S)) = 0 then
if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then Result := True;
if result then
begin
n := '!"@#$%^&*';
for i:=1 to length(s) do
for j:=1 to length(n) do
begin
if s[i] = n[j] then
begin
Result := False;
exit;
end;
end;
end;
end;
|
|
|
------- Отправлено: 19:58, 29-04-2019 | #313 |
|
Новый участник Сообщения: 28
|
Профиль | Отправить PM | Цитировать ErikPshat, а у меня такие результаты на ssd на файле в 2.22Gb:
Скрытый текст
#define CP = (Defined UNICODE) ? "unicode" : "ansi"
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;
[.Code]
function GetCRC32COfFile(FilePath: String): Cardinal;
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
function GetTickCount: Dword;
external '[email protected] stdcall';
function FormatTime(time: int64): string;
var
Ms : Int64;
H, M, S : Integer;
begin
Ms := time;
H := Ms div (60 * 60 * 1000);
Ms := Ms mod (60 * 60 * 1000);
M := Ms div (60 * 1000);
Ms := Ms mod (60 * 1000);
S := Ms div 1000;
Ms := Ms mod 1000;
Result := Format('%.2dh:%.2dm:%.2ds:%.3dms',[H,M,S,Ms]);
end;
///////////////////////////
procedure InitializeWizard;
var
s: string;
c: cardinal;
Elapsed,Start,Stop:int64;
begin
s:='C:\44.txt';
if FileExists (s) then
begin
Elapsed := 0;
Start:=GetTickCount;
c:=GetCRC32COfFile(s);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(Format('%.8x',[c])+' Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
/////////////
Elapsed := 0;
Start:=GetTickCount;
s:=GetMD5OfFile(s);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(s+' Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
end;
end;
C5433036 Time: 00h:00m:00s:842ms --------------------------- 9e7592826a085607311cd0a38f17ef19 Time: 00h:00m:04s:602ms p.s. там еще может быть момент "первого чтения". когда доступ к диску замедлен, либо тот же диск интенсивно задействован прриложениями, тогда изначально может показаться что CRC32 "тормозит", но на самом деле оно всяко быстрее md5, по крайней мере на моем Core i7 процессоре. |
|
Последний раз редактировалось usermode, 30-04-2019 в 01:25. Отправлено: 01:16, 30-04-2019 | #314 |
|
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать Цитата Dodakaedr:
Цитата usermode:
А у меня, как я ранее выкладывал скриншот своего процессора на нетбуке Asus Eee PC 1215N Intel Atom D525, то у него SSE3 максимум, поэтому MD5 вычисляется намного быстрее. Вот результаты на файле 3,77 ГБ:
|
||
|
Отправлено: 02:48, 30-04-2019 | #315 |
|
Новый участник Сообщения: 28
|
Профиль | Отправить PM | Цитировать Цитата ErikPshat:
А попробуйте еще виндовый апишный подсчет crc32, будет ли он у вас быстрее, чем подсчет в dll (у меня виндовый подсчет медленнее в 10 раз): Скрытый текст
#define CP = (Defined UNICODE) ? "unicode" : "ansi"
#define AW = (Defined UNICODE) ? "W" : "A"
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;
[.Code]
type
TMyMsg = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;
function GetCRC32COfFile(FilePath: String): Cardinal;
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
function GetTickCount: Dword;
external '[email protected] stdcall';
function RtlComputeCrc32(dwInitial: Cardinal; const pData: Longint; iLen: Integer): Cardinal;
external '[email protected] stdcall';
function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL;
external '[email protected] stdcall';
function GetProcessHeap: THandle;
external '[email protected] stdcall';
function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint;
external '[email protected] stdcall';
function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD;
external '[email protected] stdcall';
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL;
external '[email protected] stdcall';
function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL;
external 'PeekMessage{#AW}@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL;
external '[email protected] stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint;
external 'DispatchMessage{#AW}@user32.dll stdcall';
function CreateFile(lpFileName: String; dwDesiredAccess: DWORD; dwShareMode: DWORD; lpSecurityAttributes: DWORD; dwCreationDisposition: DWORD; dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
external 'CreateFile{#AW}@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL;
external '[email protected] stdcall';
const
PAGE_READONLY = $0002;
FILE_MAP_READ = $0004;
HEAP_ZERO_MEMORY = $0008;
FILE_FLAG_SEQUENTIAL_SCAN = $08000000;
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;
INVALID_HANDLE_VALUE = (-1);
procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, 0, 0, 0, 1) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
function GetCRC32OfFile(FileName: string): Cardinal;
var
hFile, hHeap: THandle;
lpBuffer: Longint;
dwBufferSize, dwRead: DWORD;
begin
Result := 0;
hFile := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if hFile = INVALID_HANDLE_VALUE then Exit;
try
hHeap := GetProcessHeap;
if hHeap = 0 then Exit;
lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 32*1024);
if lpBuffer = 0 then Exit;
dwBufferSize := HeapSize(hHeap, 0, lpBuffer);
if dwBufferSize = 0 then Exit;
while ReadFile(hFile, lpBuffer, dwBufferSize, dwRead, 0) and BOOL(dwRead > 0) do
begin
AppProcessMessage;
Result := RtlComputeCrc32(Result, lpBuffer, dwRead);
end;
finally
if hHeap <> 0 then
HeapFree(hHeap, 0, lpBuffer);
CloseHandle(hFile);
end;
end;
function FormatTime(time: cardinal{int64}): string;
var
Ms : cardinal{int64};
H, M, S : Integer;
begin
Ms := time;
H := Ms div (60 * 60 * 1000);
Ms := Ms mod (60 * 60 * 1000);
M := Ms div (60 * 1000);
Ms := Ms mod (60 * 1000);
S := Ms div 1000;
Ms := Ms mod 1000;
Result := Format('%.2dh:%.2dm:%.2ds:%.3dms',[H,M,S,Ms]);
end;
///////////////////////////
procedure InitializeWizard;
var
s: string;
c: cardinal;
Elapsed,Start,Stop:cardinal{int64};
begin
s:='C:\44.txt';
if FileExists (s) then
begin
Elapsed := 0;
Start:=GetTickCount;
c:=GetCRC32OfFile(s);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(Format('%.8x',[c])+' Api CRC32 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
/////////////
Elapsed := 0;
Start:=GetTickCount;
c:=GetCRC32COfFile(s);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(Format('%.8x',[c])+' Fast CRC-32C Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
/////////////
Elapsed := 0;
Start:=GetTickCount;
s:=GetMD5OfFile(s);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(s+' Inno MD5 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
end;
end;
В интернетах должна быть реализация md5 под sse2, хотя некоторые разработчики для своих брутилок тоже делали на ассемблере очень быстрые алгоритмы ![]() |
|
|
Последний раз редактировалось usermode, 30-04-2019 в 11:16. Отправлено: 11:06, 30-04-2019 | #316 |
|
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать Цитата usermode:
![]() Цитата Dodakaedr:
|
||
|
Последний раз редактировалось ErikPshat, 30-04-2019 в 12:01. Отправлено: 11:53, 30-04-2019 | #317 |
|
Новый участник Сообщения: 28
|
Профиль | Отправить PM | Цитировать Цитата ErikPshat:
Цитата ErikPshat:
|
||
|
Последний раз редактировалось usermode, 30-04-2019 в 12:31. Отправлено: 12:05, 30-04-2019 | #318 |
|
Пользователь Сообщения: 54
|
Профиль | Отправить PM | Цитировать usermode, переместил MD5 на первое место, то же самое: 00:15:678
А вот API CRC32: 00:00:015 - как так возможно? ![]() А Fast CRC-32C: 00:00:000 ![]() В общем, на первом результате происходит долгое ожидание, такое впечатление, что файл просто сначала кэшируется во временную память, ну и на раскрутку цилиндров видимо тратится время. А второй и третий результат выдаётся практически тут же. |
|
Отправлено: 12:30, 30-04-2019 | #319 |
|
Новый участник Сообщения: 28
|
Профиль | Отправить PM | Цитировать Цитата ErikPshat:
не назначил отдельную переменную для имени файла, и s потом вместо файла указывало на посчитанную ранее md5 сумму. Скрытый текст
#define CP = (Defined UNICODE) ? "unicode" : "ansi"
#define AW = (Defined UNICODE) ? "W" : "A"
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;
[.Code]
type
TMyMsg = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;
function GetCRC32COfFile(FilePath: String): Cardinal;
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
function GetTickCount: Dword;
external '[email protected] stdcall';
function RtlComputeCrc32(dwInitial: Cardinal; const pData: Longint; iLen: Integer): Cardinal;
external '[email protected] stdcall';
function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL;
external '[email protected] stdcall';
function GetProcessHeap: THandle;
external '[email protected] stdcall';
function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint;
external '[email protected] stdcall';
function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD;
external '[email protected] stdcall';
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL;
external '[email protected] stdcall';
function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL;
external 'PeekMessage{#AW}@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL;
external '[email protected] stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint;
external 'DispatchMessage{#AW}@user32.dll stdcall';
function CreateFile(lpFileName: String; dwDesiredAccess: DWORD; dwShareMode: DWORD; lpSecurityAttributes: DWORD; dwCreationDisposition: DWORD; dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
external 'CreateFile{#AW}@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL;
external '[email protected] stdcall';
const
PAGE_READONLY = $0002;
FILE_MAP_READ = $0004;
HEAP_ZERO_MEMORY = $0008;
FILE_FLAG_SEQUENTIAL_SCAN = $08000000;
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;
INVALID_HANDLE_VALUE = (-1);
procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, 0, 0, 0, 1) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
function GetCRC32OfFile(FileName: string): Cardinal;
var
hFile, hHeap: THandle;
lpBuffer: Longint;
dwBufferSize, dwRead: DWORD;
begin
Result := 0;
hFile := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if hFile = INVALID_HANDLE_VALUE then Exit;
try
hHeap := GetProcessHeap;
if hHeap = 0 then Exit;
lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 32*1024);
if lpBuffer = 0 then Exit;
dwBufferSize := HeapSize(hHeap, 0, lpBuffer);
if dwBufferSize = 0 then Exit;
while ReadFile(hFile, lpBuffer, dwBufferSize, dwRead, 0) and BOOL(dwRead > 0) do
begin
AppProcessMessage;
Result := RtlComputeCrc32(Result, lpBuffer, dwRead);
end;
finally
if hHeap <> 0 then
HeapFree(hHeap, 0, lpBuffer);
CloseHandle(hFile);
end;
end;
function FormatTime(time: int64): string;
var
Ms : int64;
H, M, S : Integer;
begin
Ms := time;
H := Ms div (60 * 60 * 1000);
Ms := Ms mod (60 * 60 * 1000);
M := Ms div (60 * 1000);
Ms := Ms mod (60 * 1000);
S := Ms div 1000;
Ms := Ms mod 1000;
Result := Format('%.2dh:%.2dm:%.2ds:%.3dms',[H,M,S,Ms]);
end;
///////////////////////////
procedure InitializeWizard;
var
s,fs: string;
c: cardinal;
Elapsed,Start,Stop:int64;
begin
fs:='C:\44.txt';
if FileExists (fs) then
begin
Elapsed := 0;
Start:=GetTickCount;
s:=GetMD5OfFile(fs);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(s+' Inno MD5 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
/////////////
Elapsed := 0;
Start:=GetTickCount;
c:=GetCRC32OfFile(fs);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(Format('%.8x',[c])+' Api CRC32 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
/////////////
Elapsed := 0;
Start:=GetTickCount;
c:=GetCRC32COfFile(fs);
Stop:=GetTickCount;
Elapsed:=Stop-Start;
MsgBox(Format('%.8x',[c])+' Fast CRC-32C Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
end;
end;
ErikPshat, http://qaru.site/questions/332124/crc32-vs-crc32c |
|
|
Последний раз редактировалось usermode, 30-04-2019 в 18:34. Отправлено: 12:49, 30-04-2019 | #320 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Скрипты Inno Setup. Помощь и советы [часть 7] | El Sanchez | Автоматическая установка приложений | 2499 | 02-02-2015 08:59 | |
| Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
| Скрипты Inno Setup. Помощь и советы [часть 5] | El Sanchez | Автоматическая установка приложений | 1999 | 28-03-2013 19:09 | |
| Скрипты Inno Setup. Помощь и советы [часть 4] | El Sanchez | Автоматическая установка приложений | 2099 | 22-05-2012 23:16 | |
| Скрипты Inno Setup. Помощь и советы [часть 3] | Serega | Автоматическая установка приложений | 3755 | 26-10-2011 17:58 | |
|