1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Запуск функции по нажатию кнопки

Тема в разделе "Inno Setup", создана пользователем Эмиль, 19 ноя 2019.

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

    Регистрация:
    4 фев 2018
    Сообщения:
    20
    Симпатии:
    0
    Пол:
    Мужской
    Добрый день.
    Существует функция, которая выполняет некоторые действия во время установки ПО

    Возможно ли как-то вызвать эту функцию, отдельно, по нажатию кнопки?
    Или необходимо создать процедуру?

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



    PS Объяснение корявое, скриншот не могу приложить в силу политики безопасности((
     
  2. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    330
    Симпатии:
    87
    Пол:
    Мужской
    Функция это по сути та же процедура, только она может возвращать значение, и в декларации используеться function в место procedure:
    Код (Inno):
    //Функция
    function Fnc(msg1: PAnsiChar): Longint;
    begin
      Result:=0;
    end;
    //процедура
    procedure Proc(msg1: PAnsiChar);
    begin
    end;
     
  3. Пользователь

    Регистрация:
    4 фев 2018
    Сообщения:
    20
    Симпатии:
    0
    Пол:
    Мужской
    Вот функция:
    Как ее привязать на кнопку?

    Код (Text):


     const
     OPEN_EXISTING = 3;
     FILE_SHARE_READ = $00000001;

     function CertAddEncodedCertificateToSystemStore(szCertStoreName: String; pbCertEncoded: Longint; cbCertEncoded: DWORD): Boolean;
     external 'CertAddEncodedCertificateToSystemStore{#A}@Crypt32.dll stdcall';

     function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Cardinal): Boolean;
     external 'ReadFile@Kernel32.dll stdcall';


     function AddCert(Param: String):Boolean;
      var
      Store: String;
      CA : String;
      Enum: Integer;
      Buffer : Longint;
      BufferRead : DWORD;
      dwBufferLength : DWORD;
      CFileHandle, hHeap : THandle;
      count : integer;
      Path : String;
      CerFileName : String;
      FindRec: TFindRec;
      begin
         Enum := 0;
         Store := 'ROOT'
         CA := 'la la la la lal la la CA';
         try
            Enum := FindCert(Store, CA);
            if Enum >= 11 then exit; // При изменении колличества обязательных сертов УЦ, поменять цифру тут!
            if (CreateDir(ExpandConstant('{tmp}\Cert'))) and DownloadFile(Param,ExpandConstant('{tmp}\Cert')) then
                begin
                    Path := ExtractFileExt(szFileName);
                    if (Path = '.rar') or (Path = '.zip') or (Path = '.7z') then
                        begin
                          if (UnZip(szFileName) = false) then
                            begin
                              MessageBox(hWnd, 'Ошибка при распаковки архива!', 'Скачивание сертификат(а)-ов', MB_OK or MB_ICONINFORMATION or MB_TASKMODAL);
                              exit;
                            end;
                        end;
                        if FindFirst(ExpandConstant('{tmp}\Cert\*.cer'), FindRec) then begin
                        try
                          hHeap := GetProcessHeap();
                          Buffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 2048);     // буффер памяти в куче для одного сертификата!
                          dwBufferLength := HeapSize(hHeap, 0, Buffer);
                          repeat
                            if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                                begin
                                   CerFileName := ExpandConstant('{tmp}\Cert\') + FindRec.Name;
                                   CFileHandle := CreateFile(CerFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
                                   if ReadFile(CFileHandle, Buffer, dwBufferLength, BufferRead, 0) then
                                    begin
                                      //MessageBox(hWnd, 'BufferRead ' + inttostr(BufferRead), '', MB_OK or MB_TASKMODAL);
                                      if CertAddEncodedCertificateToSystemStore(Store, Buffer, dwBufferLength) then count := count + 1
                                      else Log('Ошибка CertAddEncodedCertificateToSystemStore: ' + SysErrorMessage(DLLGetLastError));
                                    end else Log('Ошибка ReadFile:' + SysErrorMessage(DLLGetLastError));
                                end;
                        until not FindNext(FindRec);
                          finally
                            FindClose(FindRec);
                            CloseHandle(CFileHandle);
                            HeapFree(hHeap, 0, Buffer);
                          end;
              end else MessageBox(hWnd, 'Ошибка скачивания файла!', '', MB_OK or MB_TASKMODAL);
             end;          
          finally
          end;
      end;

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

    Регистрация:
    4 фев 2018
    Сообщения:
    20
    Симпатии:
    0
    Пол:
    Мужской

    Я по сути беру и задаю функции запуск этой функции тут ничего не происходит:

    Button88 := TNewButton.Create(Page[1]);
    Button88.Caption := 'Установка сертификатов';
    Button88.Top := Button3.Top + Button3.Height + ScaleY(10);
    Button88.Parent := Page[1].Surface;
    Button88.Width := Page[1].SurfaceWidth;
    Button88.Height := 40;
    Button88.OnClick := @AddCert;
     
  5. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    330
    Симпатии:
    87
    Пол:
    Мужской
    Попробуй создать процедуру, в которой вызываешь функцию AddCert, или эту функцию преобразовать в процедуру
     
  6. Пользователь

    Регистрация:
    4 фев 2018
    Сообщения:
    20
    Симпатии:
    0
    Пол:
    Мужской
    Подскажешь как это делается?)
     
  7. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    330
    Симпатии:
    87
    Пол:
    Мужской
    Код (Inno):
    procedure AddCertProc(Param: String);
    begin
      AddCert(Param);
    end;
     

Поделиться этой страницей