Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.01;
Скачать: CL | DM;

Вниз

Windows-service.Некорректное чтение бинарного файла.   Найти похожие ветки 

 
ifmomax   (2010-07-02 16:52) [0]

Всех приветствую!
Наткнулся на следующую проблему.
При запуске 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.



 
12 ©   (2010-07-02 17:43) [1]

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


 
Leonid Troyanovsky ©   (2010-07-02 19:09) [2]


> 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.


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

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


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

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


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

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


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

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


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


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

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

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


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

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


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

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

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


 
Anatoly Podgoretsky ©   (2010-07-05 14:18) [9]

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


 
Rouse_ ©   (2010-07-05 21:13) [10]


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

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


 
Anatoly Podgoretsky ©   (2010-07-05 21:54) [11]


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

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



Страницы: 1 вся ветка

Текущий архив: 2012.01.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1316764003
Alex_C
2011-09-23 11:46
2012.01.01
Загрузить и выгрузить Bitmap из Stream


15-1316076889
ProgRAMmer Dimonych
2011-09-15 12:54
2012.01.01
ASLR - проблема в Delphi или Windows?


15-1315081792
Юрий
2011-09-04 00:29
2012.01.01
С днем рождения ! 4 сентября 2011 воскресенье


9-1188670996
dector
2007-09-01 22:23
2012.01.01
MUD исходник


2-1317136441
Antoxa
2011-09-27 19:14
2012.01.01
DragNDrop в приложении