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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2011, 00:31   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию DLL, type RECORD, как передать данные в него?

Доброго времени суток.
Пишу простенькую dll, котрая качает ini и читает версию, в зависимости от этого в структуру передаёт данные..

Вот код:
Код:
const
  VER1_IS_VER2 = 0; //Версия на сервере совпадает с версией клиента
  VER1_MORE_VER2 = 1; //Версия на сервере новее чем версия у клиента
  VER1_LESS_VER2 = 2; //Версия клиента старше чем версия на сервере
  CHECK_SUCCSESS = 1;
  CHECK_FAILED = 0;

type
  TChkVerSession = record
    CheckResult: Integer;
    Log: TStrings;
  end;

function HTTPCheckVersion(aURL, aClientVersion: string; aServAnswer: TChkVerSession): Integer;
const
  Ini_Section = 'Server';
  Ini_Value = 'Version';
var
  ini: TiniFile;
  ts: TStringList;
  TmpFile: string;
  TmpDirBuff: array[0..MAX_PATH - 1] of Char;
  ServVersion: string;
  ClientVersion: string;
begin
  aServAnswer.Log.Add('Инициализация...');
  aServAnswer.Log.Add('Запращиваемая ссылка: ' + aURL);
  ClientVersion := aClientVersion;
  aServAnswer.Log.Add('Версия клиента: ' + ClientVersion);
  GetTempPath(MAX_PATH - 1, @TmpDirBuff);
  aServAnswer.Log.Add('Временная папка: ' + StrPas(@TmpDirBuff));
  TmpFile := IncludeTrailingPathDelimiter(StrPas(@TmpDirBuff)) + 'Upd.dat';
  aServAnswer.Log.Add('Временной файл: ' + TmpFile);
  ts := TStringList.Create;
  try
    if HttpGetText(aURL, ts) then
    begin
      aServAnswer.Log.Add('Данные успешно получены!');
      Result := CHECK_SUCCSESS;
      ts.SaveToFile(TmpFile);
      ini := TIniFile.Create(TmpFile);
      try
        aServAnswer.Log.Add('Проверка структуры ini...');
        if ini.SectionExists(Ini_Section) then
        begin
          //Секция существует
          if ini.ValueExists(Ini_Section, Ini_Value) then
          begin
            //Параметр существует
            ServVersion := ini.ReadString(Ini_Section, Ini_Value, '0.0.0.0');
            aServAnswer.Log.Add('Версия на сервере: ' + ServVersion);
            aServAnswer.CheckResult := CompareVersions(ServVersion, ClientVersion);
          end
          else
          begin
            aServAnswer.Log.Add('Отсутствует ключ "' + Ini_value + '" в секции "' + Ini_Section + '"');
          end;
        end
        else
        begin
          aServAnswer.Log.Add('Отсутствует секция "' + Ini_Section + '"');
        end;
      finally
        FreeAndNil(ini);
      end;

      if FileExists(TmpFile) then
      begin
        DeleteFile(TmpFile);
      end;
    end
    else
    begin
      Result := CHECK_FAILED;
      aServAnswer.Log.Add('Не удалось получить данные с сервера...');
    end;
    aServAnswer.Log.Add('Конец сессии');
  finally
    FreeAndNil(ts);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ChkSes: TChkVerSession;
begin
  ChkSes.Log := Memo1.Lines;
  case HTTPCheckVersion(Edit1.Text, Edit2.Text, ChkSes) of
    CHECK_SUCCSESS:
      begin
        case ChkSes.CheckResult of
          VER1_IS_VER2: ShowMessage('0');
          VER1_MORE_VER2: ShowMessage('1');
          VER1_LESS_VER2: ShowMessage('2');
        end;
      end;

    CHECK_FAILED:
      begin
        ShowMessage('ERROR');
      end;
  end;
end;

Отладчиком посмотрел, что на этапе:
Код:
            aServAnswer.Log.Add('Версия на сервере: ' + ServVersion);
//возвращаем результат сравнения версий
            aServAnswer.CheckResult := CompareVersions(ServVersion, ClientVersion);
Успешно передаётся 1 из констант ver1_*(Один из результатов сравнения версий)

Но когда прыгаем обратно в код кнопки:
Код:
    CHECK_SUCCSESS:
      begin
        case ChkSes.CheckResult of
          VER1_IS_VER2: ShowMessage('0');
          VER1_MORE_VER2: ShowMessage('1');
          VER1_LESS_VER2: ShowMessage('2');
        end;
      end;
ChkSes.CheckResult на пару миллионов больше чем константы ver1_*
Что я не так делаю?

ChkSes.Log - успешно транслируется в Memo1.Lines. А ChkSes.CheckResult передаётся не верно...

Все это пака VCL(тест. проект), в дальнейшем вынесу в DLL, что можете по поводу этого подсказать? Какие "фишки" меня там ждут?

Заранее благодарен...

Последний раз редактировалось Человек_Борща; 08.09.2011 в 00:33.
Человек_Борща вне форума Ответить с цитированием
Старый 08.09.2011, 01:43   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дык структуры не обьекты же, у вас передается в процедуру копия структуры, а не ссылка на нее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.09.2011, 01:57   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
дык структуры не обьекты же, у вас передается в процедуру копия структуры, а не ссылка на нее.
Опять 25...

Можно ссылку на чтонибуть по поводу этих "ссылок"?
Человек_Борща вне форума Ответить с цитированием
Старый 08.09.2011, 02:25   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а тут просто, объекты хранятся по ссылкам, структуры хранятся как есть(если не указатель)
поэтому в вашем случае нужна ссылка на структуру, то есть var-параметр.

PS: у меня понимание всего этого больше пошло от С++/АСМ, чем от Делфи.
да и не читал я особо ничего.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
type time = record(тип запись) Arioh Помощь студентам 1 23.12.2010 11:02
Тип-запись(type ... record) в Delphi Pascal Legky Помощь студентам 0 12.12.2010 21:31
DBLookupComboBox1 как в него записать данные Kuchiki Byakuya БД в Delphi 14 18.04.2010 12:23
Record, object or class type required @mazonk@ Помощь студентам 0 07.06.2009 13:03
Как передать данные в MDIChild-форму, загруженную из dll Shvonder Общие вопросы Delphi 0 18.03.2009 12:46