Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
2-1316667091
JamesQ
2011-09-22 08:51
2012.01.01
Word+Delphi


2-1316719186
dreamse
2011-09-22 23:19
2012.01.01
Сохранение списка без символов перевода каретки


1-1279133084
Дмитрий Белькевич
2010-07-14 22:44
2012.01.01
Как передать параметры при инсталляции сервиса


1-1278875240
dyonysos
2010-07-11 23:07
2012.01.01
MessageBox из TService


3-1269587791
12
2010-03-26 10:16
2012.01.01
Как бы половчее сделать Аудит. Не триггером.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский