Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Windows-service.Некорректное чтение бинарного файла. [D7]


ifmomax ©   (2010-07-02 16:52:00) 

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

P.S. Экспериментировал с параметром - выравнивание структур(Record Field Alignment), но тщетно. Видимо некий дескриптор установить нужно


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.


Anatoly Podgoretsky   (2010-07-05 21:54:00) [1]


> Rouse_ ©   (05.07.10 21:13) [10]

Ну ты вообще про зверские вещи рассказываешь.
Насчет установки на G:, у меня на серверах можно поставить только на F:


Rouse_   (2010-07-05 21:13:00) [2]


> Anatoly Podgoretsky ©   (05.07.10 14:18) [9]
>
> А разве тебе не читали лекции об вреде относительных путей?
>

Самое смешное - относительный путь безвреден, будучи применен умелыми руками. Чаще встречается жесткая привязка к статическим путям плана "c:\windows\system32" - а я вот почему-то на диск G: систему ставлю :)


Anatoly Podgoretsky   (2010-07-05 14:18:00) [3]

А разве тебе не читали лекции об вреде относительных путей?


Медвежонок Пятачок   (2010-07-05 13:33:00) [4]

Как же много тратится времени

Ну еще бы...
Проверять результаты вызовов процедур и функций - не царское же это дело.


ifmomax   (2010-07-04 06:43:00) [5]

Спасибо всем огромное!Действительно нужно было всего навсего задать полный путь:)!Как же много тратится времени в поисках сложных решений, на как оказывается в последствии простых задач.


Медвежонок Пятачок   (2010-07-03 22:03:00) [6]

При запуске windows сервиса в среде DElphi, типизированный бинарный файл читается корректно. Как только сервис инсталлируется и запускается как служба данные читаются некорректно.

Это оптический обман.
Когда модуль работает в приложении, то текущий каталог процесса - папка с exe.
Когда модуль работает в сервисе - то текущий каталог процесса уже не папка с сервисом, а папка system32.


_Юрий   (2010-07-03 10:50:00) [7]

procedure TAntorTestRead.Timer1Timer(Sender: TObject);
....
begin
....
  Timer1.Destroy;
end;


Смело. Я бы так делать не стал.

По сабжу:
> AssignFile(myFile, '34701-310510.bin');


Полный путь передать?
Кстати, не виртуальный ли диск?


QAZ   (2010-07-02 22:56:00) [8]

а винда нибось 7я ...


ifmomax   (2010-07-02 20:04:00) [9]

Тема некорректностей могла бы быть раскрыта, если бы здесь можно было бы исходники выложить и вы попробовали сравнить значения бинарных файлах при запуске как сервиса и запуске из среды Delphi.


Leonid Troyanovsky   (2010-07-02 19:09:00) [10]


> ifmomax   (02.07.10 16:52)  

> Буду вам очень признателен, если поможете понять в чем здесь
> дело.

Оная простая реализация даже скомпилируется.

> procedure ServiceController(CtrlCode: DWord); stdcall;
> begin
>  AntorTestRead.Controller(CtrlCode);
> end;
>
> function TAntorTestRead.GetServiceController: TServiceController;
>
> begin
>  Result := ServiceController;
> end;

Что это за?

> Timer1.Enabled := True;

Этот сервис гуев?

>   Reset(myFile);

Тема сис.., тьфу, некорректностей не раскрыта.

--
Regards, LVT.


12   (2010-07-02 17:43:00) [11]

перепишите с FileStream


Наверх

Титульная страница Поиск, карта сайта Написать письмо