Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Ответить
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 9]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 06-06-2020
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты 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
Благодарности: 9

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip crc32c_fix.zip
(23.9 Kb, 11 просмотров)

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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить 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 ГБ:

  • CRC32: 01 мин 32 сек
  • M D 5 : 00 мин 39 сек
  • SHA-1 : 01 мин 52 сек
MD5 у меня всегда почему-то быстрее всего подсчитывает.

Последний раз редактировалось ErikPshat, 29-04-2019 в 19:14.


Отправлено: 17:24, 29-04-2019 | #312


Аватара для Dodakaedr

Ветеран


Сообщения: 857
Благодарности: 256

Профиль | Отправить 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;

-------
Inno Setup 5 Ultra Unicode

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:58, 29-04-2019 | #313


Новый участник


Сообщения: 28
Благодарности: 9

Профиль | Отправить 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


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата Dodakaedr:
Такой вариант сойдет? »
О, да! Думаю, самый оптимальный и самый хитрый и короткий вариант. Как раз то, что надо. Я ещё отдельно выставил 2 разные переменные в первой и второй проверке и вывожу 2 разных сообщения: по поводу символов кириллицы и по поводу нестандартных символов. То есть, теперь распознавание получается более точнее, нежели одно общее. Спасибо ещё раз!!!

Цитата usermode:
C5433036 Time: 00h:00m:00s:842ms
---------------------------
9e7592826a085607311cd0a38f17ef19 Time: 00h:00m:04s:602ms »
Видимо у вас процессор использует инструкции процессора SSE 4.2 и код DLL просто заточен и оптимизирован под эти инструкции, вот и получается у вас подсчёт CRC32 быстрее, т.к. инструкции MD5 не оптимизированы.
А у меня, как я ранее выкладывал скриншот своего процессора на нетбуке Asus Eee PC 1215N Intel Atom D525, то у него SSE3 максимум, поэтому MD5 вычисляется намного быстрее. Вот результаты на файле 3,77 ГБ:Так что, ваш код DLL получается только для избранных выигрышный. Может быть его как-то оптимизировать под SSE3?

Отправлено: 02:48, 30-04-2019 | #315


Новый участник


Сообщения: 28
Благодарности: 9

Профиль | Отправить PM | Цитировать


Цитата ErikPshat:
Может быть его как-то оптимизировать под SSE3? »
только начиная с SSE 4.2 есть аппаратная инструкция crc32. в dll используется самый оптимизированный подсчет на ассемблере даже без SSE 4.2, не знаю в чем магия, утверждать и спорить не буду, но в очередной раз предположу: скорость чтения с ноутбучного hdd, до 110-120 мегабайт в секунду, ssd до 550 mb/s. По заявлениям разработчиков на современных Intel процессорах скорость подсчета алгоритма crc32cfast - 1.7 Gb/s, crc32csse42 - 3.5 Gb/s. Такого чтения не может обеспечить любой адекватный носитель.

А попробуйте еще виндовый апишный подсчет 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


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата usermode:
А попробуйте еще виндовый апишный подсчет crc32, будет ли он у вас быстрее, чем подсчет в dll (у меня виндовый подсчет медленнее в 10 раз) »
Ну на файле 3,8 Гб
  • API: 01:53:085
  • Fast CRC-32C: 00:07:801
  • MD5: 00:15:787
Пару раз прогонял, результаты почти практически такие же. Fast CRC-32C конечно намного быстрее считает, только почему-то CRC разные показывает

Цитата Dodakaedr:
if s[i] = n[j] then »
Эмм, что-то у меня это равенство ни при каких условиях не выполняется, хоть есть нестандартные символы, хоть нет.

Последний раз редактировалось ErikPshat, 30-04-2019 в 12:01.


Отправлено: 11:53, 30-04-2019 | #317


Новый участник


Сообщения: 28
Благодарности: 9

Профиль | Отправить PM | Цитировать


Цитата ErikPshat:
Fast CRC-32C конечно намного быстрее считает »
полагаю, что проблема замедленного подсчета , это первичный доступ чтения, чтобы убедиться, переместите в скрипте код подсчета md5 на первое место - будет ли средний результат в тех же 15 секунд.

Цитата ErikPshat:
только почему-то CRC разные показывает »
это потому, что в CRC-32C используется другой Intel-овский полином (приставка С намекает), но сам алгоритм абсолютно идентичный.

Последний раз редактировалось usermode, 30-04-2019 в 12:31.


Отправлено: 12:05, 30-04-2019 | #318


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


usermode, переместил MD5 на первое место, то же самое: 00:15:678
А вот API CRC32: 00:00:015 - как так возможно?
А Fast CRC-32C: 00:00:000
В общем, на первом результате происходит долгое ожидание, такое впечатление, что файл просто сначала кэшируется во временную память, ну и на раскрутку цилиндров видимо тратится время. А второй и третий результат выдаётся практически тут же.

Отправлено: 12:30, 30-04-2019 | #319


Новый участник


Сообщения: 28
Благодарности: 9

Профиль | Отправить PM | Цитировать


Цитата ErikPshat:
А вот API CRC32: 00:00:015 - как так возможно?
А Fast CRC-32C: 00:00:000 »
сказывается 3 день Пасхи не назначил отдельную переменную для имени файла, и 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 '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



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты 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




 
Переход