|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Windows-service.Некорректное чтение бинарного файла.
Всех приветствую!
Наткнулся на следующую проблему. При запуске windows сервиса в среде DElphi, типизированный бинарный файл читается корректно. Как только сервис инсталлируется и запускается как служба данные читаются некорректно. Перепробовал все возможные варианты создания служб и чтения бинарных файлов, но все тщетно. Прикладываю проект на базе самой простой реализации. Буду вам очень признателен, если поможете понять в чем здесь дело. P.S. Экспериментировал с параметром - выравнивание структур(Record Field Alignment), но тщетно. Видимо некий дескриптор установить нужно. |
#2
|
|||
|
|||
Код:
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
|
||||
|
||||
по теме GPS могу с Вами отдельно поговорить (если она тут присутствует, ибо 34701-310510.bin более похоже на IMEI прибора и дату данных), очень давно занимаюсь подключение приборов (автограф, m2m, скаут и т.д., АНТОР думаю относиться сюда же) к одной системе. Если интересно, стучите в аську, указанную в инфе, там и с сервисом помогу и посоветую другой путь
P.S.: плиз, используйте тэг CODE, а то не успеем вам помочь, как вас забанят Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы... ICQ: 593977748 Nick: Marvel Последний раз редактировалось Marvel, 02.07.2010 в 20:42. |
#4
|
|||
|
|||
Тут столько "косяков", что даже не знаю с чего начать.
1. Использовать Timer в сервисе нельзя. 2. Всю работу сервиса надо выносить в отдельный поток. 3. Получение имени файла можно сделать более надежно: Код:
FileName := ExtractFilePath(ParamStr(0)) + 'LogFile.log'; 5. Есть еще вероятность, что вы и читаете неправильно, т.к. тип записи, возможно, должен быть определен как packed record. А это влияет на распределение памяти - возможно здесь и порылась собака. 6. Ну а уж вывов Timer1.Destroy; это вообще ни в какие ворота в этом месте... этот код вообще должен падать нафиг. 7. Не уничтожается объект log. Это не страшно, но чать лога может бьть потеряна. Хотя бы принудительно надо освобождать буфер лога. |
#5
|
|||
|
|||
lmikle спасибо за подробные комментарии.
1) Я пробовал и без таймеров, таймер лишь указал что бы можно было запустить программу под делфи, для сравнения результатов. 2) Через отдельный поток реализовывал. 3) Спасибо за совет, но мой способ вполне надежен хоть и через одно место 4) Совершенно точно уверен. 5) Вы думаете я не пробовал делать запись packed ? 6) Сделано только для того что бы тот кто запустит сервис и не остановит его, не получил бы переполнение жесткого диска, из-за растущего лога. Сам не думал что так будет работать, попробвал работает, решил оставить, но в рабочей версии конечно же такое допускать нельзя. 7) Согласен, но опять же таки, хочу отметить что это не моя программа, это просто тестовый вариант написанный за 5 минут, только для того что бы отразить проблему. |