![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всех приветствую!
Наткнулся на следующую проблему. При запуске 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, а то не успеем вам помочь, как вас забанят ![]() Последний раз редактировалось 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 минут, только для того что бы отразить проблему. |