Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.07.2010, 17:02
ifmomax ifmomax вне форума
Прохожий
 
Регистрация: 29.06.2010
Сообщения: 3
Репутация: 10
По умолчанию Windows-service.Некорректное чтение бинарного файла.

Всех приветствую!
Наткнулся на следующую проблему.
При запуске windows сервиса в среде DElphi, типизированный бинарный файл читается корректно. Как только сервис инсталлируется и запускается как служба данные читаются некорректно. Перепробовал все возможные варианты создания служб и чтения бинарных файлов, но все тщетно. Прикладываю проект на базе самой простой реализации.
Буду вам очень признателен, если поможете понять в чем здесь дело.

P.S. Экспериментировал с параметром - выравнивание структур(Record Field Alignment), но тщетно. Видимо некий дескриптор установить нужно.
Вложения
Тип файла: rar Test3.rar (43.1 Кбайт, 12 просмотров)
Ответить с цитированием
  #2  
Старый 02.07.2010, 17:02
ifmomax ifmomax вне форума
Прохожий
 
Регистрация: 29.06.2010
Сообщения: 3
Репутация: 10
По умолчанию

Код:
unit Unit1;
{$A-}
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ExtCtrls,Mlog;

type
  TAntorTestRead = class(TService)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
   { procedure ServiceExecute(Sender: TService);}
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

type
  TGPS12Data = record
    Atr:Longint; // 4
    Latitude:Longint; // 4
    longitude:Longint; // 4
end;

var
  AntorTestRead: TAntorTestRead;
  ReadData: TGPS12Data;
  log:TMlog;
  myFile: file of TGPS12Data;


implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  AntorTestRead.Controller(CtrlCode);
end;

function TAntorTestRead.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

function IntToBin(Value: integer; Digits: integer): string;
var
  i: integer;
begin
  result := '';
for i := 0 to Digits - 1 do
  if Value and (1 shl i) > 0 then
    result := '1' + result
  else
    result := '0' + result;
end;


{procedure TAntorTestRead.ServiceExecute(Sender: TService);
begin
  Timer1.Enabled := True;
while not Terminated do
  ServiceThread.ProcessRequests(True);// wait for termination
  Timer1.Enabled := False;
end;}

procedure TAntorTestRead.Timer1Timer(Sender: TObject);
var
ss:widestring;
i:integer;
begin
   ss:=ParamStr(0);
   i:=Length(ss)-Length('AntorTest.exe');
   ss:=Copy(ss, 1, i);
   log:=TMlog.create(ss+'LogFile.log');
   AssignFile(myFile, '34701-310510.bin');
   FileMode := fmOpenRead;
   Reset(myFile);
   while not Eof(myFile) do begin
     read(myfile,ReadData);
     log.mess(inttoBin(ReadData.atr,32));
   end;
   Timer1.Destroy;
end;


end.
Ответить с цитированием
  #3  
Старый 02.07.2010, 20:26
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

по теме GPS могу с Вами отдельно поговорить (если она тут присутствует, ибо 34701-310510.bin более похоже на IMEI прибора и дату данных), очень давно занимаюсь подключение приборов (автограф, m2m, скаут и т.д., АНТОР думаю относиться сюда же) к одной системе. Если интересно, стучите в аську, указанную в инфе, там и с сервисом помогу и посоветую другой путь

P.S.: плиз, используйте тэг CODE, а то не успеем вам помочь, как вас забанят
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel

Последний раз редактировалось Marvel, 02.07.2010 в 20:42.
Ответить с цитированием
  #4  
Старый 02.07.2010, 22:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,016
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут столько "косяков", что даже не знаю с чего начать.
1. Использовать Timer в сервисе нельзя.
2. Всю работу сервиса надо выносить в отдельный поток.
3. Получение имени файла можно сделать более надежно:
Код:
FileName := ExtractFilePath(ParamStr(0)) + 'LogFile.log';
4. А вы уверены, что файл, который читается под сервисом (34701-310510.bin) и файл который вам надо считать это один и тот же файл? Надо собирать полное имя файла, что бы небыло неоднозначностей.
5. Есть еще вероятность, что вы и читаете неправильно, т.к. тип записи, возможно, должен быть определен как packed record. А это влияет на распределение памяти - возможно здесь и порылась собака.
6. Ну а уж вывов Timer1.Destroy; это вообще ни в какие ворота в этом месте... этот код вообще должен падать нафиг.
7. Не уничтожается объект log. Это не страшно, но чать лога может бьть потеряна. Хотя бы принудительно надо освобождать буфер лога.
Ответить с цитированием
  #5  
Старый 03.07.2010, 00:55
ifmomax ifmomax вне форума
Прохожий
 
Регистрация: 29.06.2010
Сообщения: 3
Репутация: 10
По умолчанию

lmikle спасибо за подробные комментарии.
1) Я пробовал и без таймеров, таймер лишь указал что бы можно было запустить программу под делфи, для сравнения результатов.
2) Через отдельный поток реализовывал.
3) Спасибо за совет, но мой способ вполне надежен хоть и через одно место
4) Совершенно точно уверен.
5) Вы думаете я не пробовал делать запись packed ?
6) Сделано только для того что бы тот кто запустит сервис и не остановит его, не получил бы переполнение жесткого диска, из-за растущего лога. Сам не думал что так будет работать, попробвал работает, решил оставить, но в рабочей версии конечно же такое допускать нельзя.
7) Согласен, но опять же таки, хочу отметить что это не моя программа, это просто тестовый вариант написанный за 5 минут, только для того что бы отразить проблему.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter