Имя пользователя:
Пароль:
 

Показать сообщение отдельно

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


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

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


habib2302, т.к. файлов нету,скрипта нету,то пример.
Сделал так
читать дальше »
Код: Выделить весь код
////////////////////// Начало ExecAndWait //////////////////

var
  lastproc: cardinal;
const
  NORMAL_PRIORITY_CLASS           = $00000020;
  REALTIME_PRIORITY_CLASS         = $00000100;
type
  _TStartupInfo = record
  cb: DWORD;
  lpReserved, lpDesktop: Longint;
  lpTitle: PAnsiChar;
  dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
  wShowWindow, cbReserved2: Word;
  lpReserved2: Byte;
  hStdInput, hStdOutput, hStdError: Longint;
end;
  _TProcessInformation = record
  hProcess, hThread: Longint;
  dwProcessId, dwThreadId: DWORD;
end;
  _TMsg = record
  hWnd: HWND;
  msg, wParam: Word;
  lParam: LongWord;
  Time: TFileTime;
  pt: TPoint;
end;

function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
procedure GetStartupInfo(var lpStartupInfo: _TStartupInfo); external 'GetStartupInfoA@kernel32.dll stdcall';
function CreateProcess(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: DWORD; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: PAnsiChar; lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _TStartupInfo; var lpProcessInformation: _TProcessInformation): BOOL; external 'CreateProcessA@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: Longint; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function TerminateProcess(hProcess: Longint; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

procedure Application_ProcessMessages;
var
  Msg: _TMsg;
begin
while PeekMessage(Msg, 0, 0, 0, 1) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;
end;

function ExecAndWait(filename, params: pansichar; showcmd: integer; Priority: Smallint; zav: DWord): Boolean;
var
  SI : _TStartupInfo;
  PI : _TProcessInformation;
  CMD: string;
  prt: DWORD;
begin
  Result:=false;
  CMD:='"' + filename + '" ' + params;
  GetStartupInfo(SI);
  SI.wShowWindow := showcmd;
  SI.dwFlags := 1;
if Priority = 0  then prt:= NORMAL_PRIORITY_CLASS else
if Priority = 1  then prt:= REALTIME_PRIORITY_CLASS;
  Result:=CreateProcess('', PansiChar(CMD), 0, 0, false, prt,'', pansichar(ExtractFilePath(filename)), SI, PI);
  lastproc:=PI.dwProcessId;
if zav=1 then
begin
while WaitforSingleObject(PI.hProcess, 50) = $00000102 do
  Application_ProcessMessages;
end;
  CloseHandle(PI.hProcess)
end;

////////////////////// Конец ExecAndWait ///////////////////

читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DisableFinishedPage=yes
OutputDir=.

[Languages]
Name: RUS; MessagesFile: "compiler:Languages\Russian.isl"

[Code ]
var
  Timer: TTimer;
  Labelpr: TLabel;
  NewProgressBar1: TNewProgressBar;

// ExecAndWait
#include "ExecAndWait.iss"

procedure RedesignWizardForm;
begin
  Labelpr := TLabel.Create(WizardForm);
  with Labelpr do
  begin
    Parent := WizardForm;
    Left := ScaleX(96);
    Top := ScaleY(120);
    Width := ScaleX(289);
    Caption:= 'Установка флеша';
  end;
  { NewProgressBar1 }
  NewProgressBar1 := TNewProgressBar.Create(WizardForm);
  with NewProgressBar1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(96);
    Top := ScaleY(144);
    Width := ScaleX(289);
    Height := ScaleY(25);
    Max:= 100;
  end;
end;

procedure FlRun(Sender: TObject);
begin
  ExecAndWait(ExpandConstant('{src}\activex.exe'), '/install /force', SW_HIDE, 0,1);
  WizardForm.Close;
end;

procedure Timepr(Sender: TObject);
begin
  NewProgressBar1.Position:=NewProgressBar1.Position+9;
if NewProgressBar1.Position= 100 then
begin
  Labelpr.Caption:= 'Завершение установки';
  Timer.Enabled:= False;
end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  WizardForm.InnerNotebook.Hide;
  WizardForm.OuterNotebook.Hide;
  Timer:=TTimer.Create(nil);
with Timer do begin
  Interval:= 300;
  OnTimer:=@Timepr;
end;
  WizardForm.OnActivate:= @FlRun;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
  Cancel:=True;
end;

Время таймера должно быть меньше времени установки флеша. Прогрессбар тупо двигается по таймеру,а в это время происходит установка, потом прогресс доходит до максимума и лейбл меняется на завершение установки,в то время как флеш еще ставится. хотел сделать ожидание установщика (если флеш установится), но тогда процесс зависает. Можно конечно создать еще процесс,но это извращенство. Вообщем так. Или файлы со скиптом и я по изгаляюсь )

Последний раз редактировалось sergey3695, 06-05-2014 в 19:14.

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

Отправлено: 19:00, 06-05-2014 | #555