|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
Ветеран Сообщения: 1269 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме 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 |
![]() Ветеран Сообщения: 858
|
Профиль | Отправить 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 'GetTickCount@kernel32.dll 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 'GetTickCount@kernel32.dll stdcall'; function RtlComputeCrc32(dwInitial: Cardinal; const pData: Longint; iLen: Integer): Cardinal; external 'RtlComputeCrc32@ntdll.dll stdcall'; function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL; external 'ReadFile@kernel32.dll stdcall'; function GetProcessHeap: THandle; external 'GetProcessHeap@kernel32.dll stdcall'; function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint; external 'HeapAlloc@kernel32.dll stdcall'; function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD; external 'HeapSize@kernel32.dll stdcall'; function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL; external 'HeapFree@kernel32.dll 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 'TranslateMessage@user32.dll 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 'CloseHandle@kernel32.dll 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:
![]() Скрытый текст
#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 'GetTickCount@kernel32.dll stdcall'; function RtlComputeCrc32(dwInitial: Cardinal; const pData: Longint; iLen: Integer): Cardinal; external 'RtlComputeCrc32@ntdll.dll stdcall'; function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL; external 'ReadFile@kernel32.dll stdcall'; function GetProcessHeap: THandle; external 'GetProcessHeap@kernel32.dll stdcall'; function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint; external 'HeapAlloc@kernel32.dll stdcall'; function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD; external 'HeapSize@kernel32.dll stdcall'; function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL; external 'HeapFree@kernel32.dll 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 'TranslateMessage@user32.dll 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 'CloseHandle@kernel32.dll 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 |
|