Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2008, 17:13   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию Создание апдейтера для приложения

Постоянно возникают проблемы с работой апдейтера. Хотелось бы разобраться что не так. На клиент посылается команда на обновление. Клиент начинает скачивать обновление. После скачивания обновления клиент закрывается и запускает апдейтер. Апдейтер в своё время распаковывает архив, потом удаляет его и запускает клиент.
Вот как это выглядет в коде
Работа с архивом (*.RAR)
Код:
procedure LOG(S : string);
begin
  Form1.Memo1.Lines.Add(S);
end;
type

  TRAROpenArchiveData = record
    ArcName    : PChar;
    OpenMode   : cardinal;
    OpenResult : cardinal;
    CmtBuf     : PChar;
    CmtBufSize : cardinal;
    CmtSize    : cardinal;
    CmtState   : cardinal;
  end;
  TRARHeaderData = record
    ArcName    : array[0..259] of char;
    FileName   : array[0..259] of char;
    Flags      : cardinal;
    PackSize   : cardinal;
    UnpSize    : cardinal;
    HostOS     : cardinal;
    FileCRC    : cardinal;
    FileTime   : cardinal;
    UnpVer     : cardinal;
    Method     : cardinal;
    FileAttr   : cardinal;
    CmtBuf     : PChar;
    CmtBufSize : cardinal;
    CmtSize    : cardinal;
    CmtState   : cardinal;
  end;
  TUnRarCallBack   = function(msg: Cardinal; UserData, P1, P2: integer): integer; stdcall;
function RAROpenArchive(var ArchiveData : TRAROpenArchiveData): THandle; stdcall;
external 'unrar.dll' name 'RAROpenArchive'; 

function RARCloseArchive(hArcData : THandle): Integer; stdcall;
external 'unrar.dll' name 'RARCloseArchive'; 

function RARReadHeader(hArcData : THandle; out HeaderData : TRARHeaderData): Integer; stdcall;
external 'unrar.dll' name 'RARReadHeader'; 

function RARProcessFile(hArcData : THandle; Operation : Integer; DestPath : pchar;
DestName : pchar = nil): Integer; stdcall;
external 'unrar.dll' name 'RARProcessFile';

procedure RARSetCallback (hArcData: THandle; Callback: TUnRarCallback; UserData: longint); stdcall;
external 'unrar.dll' name 'RARSetCallback';
const 
ERAR_END_ARCHIVE = 10; 
RAR_OM_EXTRACT   =  1;
RAR_EXTRACT      =  2;
RAR_SUCCESS      =  0;
UCM_PROCESSDATA  =  1;
var
  RARHeaderData : TRARHeaderData;
  ArcStruct: TRAROpenArchiveData;
  CmtBuffer : array[0..1023] of char;
function UnRarCallBack(msg: Cardinal; UserData, P1, P2: integer): integer; stdcall;
begin
  Result := 0;
  if msg = UCM_PROCESSDATA then LOG('Распаковал ' + IntToStr(P2) + ' байт');
end;
function OpenRARArchive(FileName : string) : THandle;
begin
  ZeroMemory(@ArcStruct, sizeof(ArcStruct));

  ArcStruct.OpenMode := RAR_OM_EXTRACT;
  ArcStruct.ArcName  := pchar(FileName);
  ArcStruct.CmtBuf   := CmtBuffer;
  ArcStruct.CmtBufSize := sizeof(CmtBuffer);

  Result := RAROpenArchive(ArcStruct);
end;
procedure UnRarFile(RarFileName : string; Directory : string = '');
var
   hRAR : THandle;
   hReadHeader : integer;
   hProcessHeader : integer;
begin
   UniqueString(RarFileName);
   RarFileName := ExpandFileName(RarFileName);
   UniqueString(Directory);
   {if length(Directory) = 0 then
      Directory := ChangeFileExt(RarFileName, '')
        else Directory := ExpandFileName(Directory);}

   LOG('Распаковываю архив "' + RarFileName + '" в папку "' + Directory + '"...');

   CharToOem(pchar(Directory), pchar(Directory));
   hRAR := OpenRARArchive(RarFileName);
   RARSetCallback(hRar, UnRarCallBack, 0);

   hReadHeader := 0;
   hProcessHeader := 0;
REPEAT
   hReadHeader := RARReadHeader(hRar, RARHeaderData);
   if hReadHeader = ERAR_END_ARCHIVE
      then Break;

   OemToChar(RARHeaderData.FileName, RARHeaderData.FileName);

   LOG('Распаковываю файл "' + string(RARHeaderData.FileName) +
       '"... ' + IntToStr(RARHeaderData.UnpSize) + ' байт.');

   if hReadHeader = RAR_SUCCESS then
        hProcessHeader := RARProcessFile(hRar, RAR_EXTRACT, PChar(Directory), nil);

UNTIL (hProcessHeader <> RAR_SUCCESS);

   LOG('Всё распаковано, закрываю архив.');
   RARCloseArchive(hRAR)
end;
Если архив не найден, то закрываем приложение, если же он найден закрывает клиент и ждём 10 секунд (для подстраховки, для полного закрытия)
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
if not FileExists(ExtractFilePath(Application.EXEName)+'update.rar') then begin
Application.Terminate;
Exit;
end else
Timer1.Enabled:=True;
end;
Начинаем само обновление
Код:
Memo1.Lines.Clear;
UnRarFile(ExtractFilePath(Application.EXEName)+'update.rar');

DeleteFile(ExtractFilePath(Application.EXEName)+'update.rar');

ShellExecute(0, 'open', pChar(ExtractFilePath(Application.ExeName)+'CSS.exe'), 0, 0, SW_HIDE);
Timer1.Enabled:=False;
Application.Terminate;
Чаще всего после окончания обновления клиент не запускается. И ждать 10 секунд тоже как-то стрёмно. Как можно сделать нормально (старт обновления после закрытия клиента и нормальный запуск после окончания обновления).

Последний раз редактировалось Shouldercannon; 24.12.2008 в 17:16.
Shouldercannon вне форума Ответить с цитированием
Старый 25.12.2008, 04:22   #2
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

а если вместо SW_HIDE написать SW_SHOWNORMAL?
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 25.12.2008, 18:18   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Пока работает нормально. Спасибо.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать КС e999 Microsoft Office Excel 2 12.12.2008 17:14
создать программу Александр Ф. Фриланс 4 10.11.2008 18:14
Создать диалог F1kus Общие вопросы Delphi 13 21.08.2008 08:33
помогите создать Б.Д. Азамат Microsoft Office Access 3 15.07.2008 14:00
создать сайт Nurik PHP 9 05.04.2007 22:12