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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2011, 09:14   #11
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Менять версию программы, без ведома пользователя, это жестоко, не демократично и не правомерно.
Когда-то...
Сейчас уже вряд ли) Даже "не демократичный и не правомерный" Google Chrome обновляется, никого не спрашивая
Voody вне форума Ответить с цитированием
Старый 14.07.2011, 09:20   #12
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Voody Посмотреть сообщение
Когда-то...
Сейчас уже вряд ли) Даже "не демократичный и не правомерный" Google Chrome обновляется, никого не спрашивая
Ну, Вы сравнили. От Гугола, просто деваться некуда, а от вашей программки?
Если я замечу, что в моём компе кто-то, что-то творит без моего ведома, я сочту это за действия трояна и мигом её удалю (и удаляю безоговорочно)!
Строго наблюдаю за процессами в сети. И ни дай Бог, какой-то процесс запустится без моего на то согласия. Считай, что он уже труп.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.07.2011, 11:59   #13
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Хм, я думаю просто в программе должна быть константа что то вроде ver = '0.2', а не сервере или простой файл, любой структуры или PHP - скрипт, отдающий информацию о текущей версии на сайте, и все. А там уже просто с программы запрашиваешь и делаешь выбор качать или нет
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Старый 14.07.2011, 14:11   #14
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Все просто , до безобразия.
Ни каких констант и прочей мути.

На сервере лежит некий файл ver.ini с данными:
Код:
[U]
File=Update.exe
Ver=1.1.0.3456
Size=<Size in bytes>
Файл скачивается и расфасовывается, формируется ссылка вида:
http://localhost/UPD/Значение из переменной File в ini файле.

Далее проверка версий, берём свою версию:
Код:
function MyVersion(Files: string): string;
var
  Buffer: string;
  fInfoSize: DWORD;
  function InitVersion: boolean;
  var
    FilenamePointer: PChar;
  begin
    Result := True;
    FilenamePointer := PChar(Files);
    fInfoSize := GetFileVersionInfoSize(FilenamePointer, fInfoSize);
    if fInfoSize > 0 then
    begin
      SetLength(Buffer, fInfoSize);
      if not GetFileVersionInfo(FilenamePointer, 0, fInfoSize, PChar(Buffer)) then
      begin
        Result := False;
      end;
    end; //if
  end; //InitVersion

  function GetVersion(whatToGet: string): string;
  var
    tmpVersion: string;
    Len, Len2: DWORD;
    Value: PChar;
    temp: PLongInt;
    tempStr: string;
  begin
    Result := '';
    if fInfoSize > 0 then
    begin
      SetLength(tmpVersion, 200);
      Value := @tmpVersion;
      VerQueryValue(PChar(Buffer), '\VarFileInfo\Translation', Pointer(temp), Len2);
      tempStr := Format('%s%.4x%.4x\%s%s', ['\StringFileInfo\', LoWord(temp^), HiWord(temp^), whattoget, #0]);
      if VerQueryValue(PChar(Buffer), PChar(tempStr), Pointer(Value), Len) then
        Result := Value;
    end; // if
  end; //getversion
begin
  Buffer := '';
  try
    InitVersion;
    result := GetVersion('FileVersion');
  except
    Result := '';
  end;
end;
и сравниваешь то, что отдал тебе ini и то, что отдано тебе myVersion, при помощи:
Код:
function CompareVersion(s1, s2: string): integer;
var
  d1, d2: TStrings;
  i: integer;
begin
  if s1 = s2 then
    Result := 0
  else
  begin
    d1 := TStringList.Create;
    d2 := TStringList.Create;
    try
      d1.Delimiter := '.';
      d2.Delimiter := '.';
      d1.DelimitedText := trim(s1);
      d2.DelimitedText := trim(s2);
      if d1.Count <> d2.Count then
      begin
        Result := 0; //Обновление не надо
      end
      else
      begin
        Result := 0;
        for i := 0 to d1.Count - 1 do
        begin
          if (StrToinTDef(trim(d1[i]), 0) > StrToinTDef(trim(d2[i]), 0)) then
          begin
            Result := 1; //Версия на сервере старше
            break;
          end;
          if (StrToinTDef(trim(d1[i]), 0) < StrToinTDef(trim(d2[i]), 0)) then
          begin
            Result := -1; //Версия на сервере младше
            break;
          end;
        end;
      end;
    finally
      d1.Free;
      d2.Free;
    end;
  end;
end;
Что делать с размеров в байтах? Сам что-нибудь придумай

Последний раз редактировалось Человек_Борща; 14.07.2011 в 14:14.
Человек_Борща вне форума Ответить с цитированием
Старый 14.07.2011, 23:50   #15
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Все просто , до безобразия.
Ни каких констант и прочей мути.

На сервере лежит некий файл ver.ini с данными:
Код:
[U]
File=Update.exe
Ver=1.1.0.3456
Size=<Size in bytes>
Файл скачивается и расфасовывается, формируется ссылка вида:
http://localhost/UPD/Значение из переменной File в ini файле.

Далее проверка версий, берём свою версию:
Код:
function MyVersion(Files: string): string;
var
  Buffer: string;
  fInfoSize: DWORD;
  function InitVersion: boolean;
  var
    FilenamePointer: PChar;
  begin
    Result := True;
    FilenamePointer := PChar(Files);
    fInfoSize := GetFileVersionInfoSize(FilenamePointer, fInfoSize);
    if fInfoSize > 0 then
    begin
      SetLength(Buffer, fInfoSize);
      if not GetFileVersionInfo(FilenamePointer, 0, fInfoSize, PChar(Buffer)) then
      begin
        Result := False;
      end;
    end; //if
  end; //InitVersion

  function GetVersion(whatToGet: string): string;
  var
    tmpVersion: string;
    Len, Len2: DWORD;
    Value: PChar;
    temp: PLongInt;
    tempStr: string;
  begin
    Result := '';
    if fInfoSize > 0 then
    begin
      SetLength(tmpVersion, 200);
      Value := @tmpVersion;
      VerQueryValue(PChar(Buffer), '\VarFileInfo\Translation', Pointer(temp), Len2);
      tempStr := Format('%s%.4x%.4x\%s%s', ['\StringFileInfo\', LoWord(temp^), HiWord(temp^), whattoget, #0]);
      if VerQueryValue(PChar(Buffer), PChar(tempStr), Pointer(Value), Len) then
        Result := Value;
    end; // if
  end; //getversion
begin
  Buffer := '';
  try
    InitVersion;
    result := GetVersion('FileVersion');
  except
    Result := '';
  end;
end;
и сравниваешь то, что отдал тебе ini и то, что отдано тебе myVersion, при помощи:
Код:
function CompareVersion(s1, s2: string): integer;
var
  d1, d2: TStrings;
  i: integer;
begin
  if s1 = s2 then
    Result := 0
  else
  begin
    d1 := TStringList.Create;
    d2 := TStringList.Create;
    try
      d1.Delimiter := '.';
      d2.Delimiter := '.';
      d1.DelimitedText := trim(s1);
      d2.DelimitedText := trim(s2);
      if d1.Count <> d2.Count then
      begin
        Result := 0; //Обновление не надо
      end
      else
      begin
        Result := 0;
        for i := 0 to d1.Count - 1 do
        begin
          if (StrToinTDef(trim(d1[i]), 0) > StrToinTDef(trim(d2[i]), 0)) then
          begin
            Result := 1; //Версия на сервере старше
            break;
          end;
          if (StrToinTDef(trim(d1[i]), 0) < StrToinTDef(trim(d2[i]), 0)) then
          begin
            Result := -1; //Версия на сервере младше
            break;
          end;
        end;
      end;
    finally
      d1.Free;
      d2.Free;
    end;
  end;
end;
Что делать с размеров в байтах? Сам что-нибудь придумай
Ну да тут ты прав, ну а если без сохранения файла на диске, то только так, ведь есть и ситуации когда и нельзя сохранять файл на диске
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Старый 15.07.2011, 00:01   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

lux16 мб написание своего варианта ini с возможностью загрузить данные из потока или списка строк, не?
Человек_Борща вне форума Ответить с цитированием
Старый 15.07.2011, 00:03   #17
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Человек_Борща, да блин я про то, что иногда есть задачи, где просто не надо скачивать из нета файл, а просто проверить версию.
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Старый 15.07.2011, 05:43   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не обязательно даже ini, можно типизированный файлик какойнить.
или чтото иное.
и грузить в TMemoryStream.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.09.2011, 12:41   #19
celovec
Форумчанин
 
Регистрация: 15.06.2007
Сообщений: 182
По умолчанию

Пришла в голову еще дна идея, без каких либо дополнительных ini файлов. Насколько я помню была возможность без скачивания узнать дату и время создания файла на сервере (http сайте).
Таким образом можно на сайт залить программу, назовем ее games.exe.

И просто при каждом запуске ее она сверяется с программой на сайте, если та программа создана позже чем ваша запущенная games.exe то значит появилась новая версия.

Может кто-то поможет это реализовать?
celovec вне форума Ответить с цитированием
Старый 06.09.2011, 13:05   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

метод HEAD поидее.
но на практике это неверно.
вы не можете гарантировать правильность даты и времени у пользователя(+еще часовые пояса)
версия куда более надежный принцип.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое уничтожение объекта mutabor Общие вопросы Delphi 6 25.06.2008 22:25
обновление моей программы andrey4623 Общие вопросы Delphi 1 15.03.2008 13:15
Автоматическое перенаправление на др. стр. Рустам PHP 2 17.11.2007 15:43
Автоматическое перемещение Kirik JavaScript, Ajax 4 16.11.2007 17:42
Автоматическое сохранение AndreichSB Microsoft Office Access 1 03.01.2007 23:15