![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Попинайте код, предложите альтернативы :)
Dennis I. Komarov © (2012-08-27 19:26:00)a) Попинайте код:
Служба пускает поток:
unit frdecode;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
SysDirs, FRF, xmldom, XMLIntf, msxmldom, XMLDoc, ActiveX;
type
TThreadConverter = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ TThreadConverter }
procedure TThreadConverter.Execute;
var
FRFDir: string;
SearchRec: TSearchRec;
FindResult: Integer;
FRFdata: TFRF;
FileName: TFileName;
iDoc: IXMLDocument;
EStr: AnsiString;
begin
FreeOnTerminate:=true;
FRFDir := GetAllUsersDocumentsDir + '\frf.files'; // Отправить в реестр
// сканирование frf файлов в заданной директории
CoInitialize(nil);
while not Terminated do try
try {TXMLDocument.Create}
FindResult := FindFirst(FRFDir + '\*.frf', faAnyFile, SearchRec);
while FindResult = 0 do begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin
// при нахождении файла читаем его значения и сохраняем в уникальный xml файл
FRFdata:=DecodeFRF(FRFDir + '\' + SearchRec.Name);
if not Assigned(iDoc) then
iDoc := TXMLDocument.Create(nil);
//Сохраняем данные в XML документ
FileName:=FloatToStr(Time); Delete(FileName, 1, 2);
Filename:=ExtractFilePath(ParamStr(0)) + 'Data\' + FileName;
iDoc.Active:=true;
Sleep(100);
iDoc.FileName := FileName;
iDoc.Encoding:='WINDOWS-1251';
iDoc.AddChild('ED101', 'urn:cbr-ru:ed:v2.0');
with iDoc.DocumentElement do begin
SetAttributeNS('PaytKind', '', '1');
SetAttributeNS('Sum', '', FRFdata.Sum);
SetAttributeNS('TransKind', '', '01');
SetAttributeNS('Priority', '', '1');
with AddChild('AccDoc') do begin
SetAttributeNS('AccDocNo', '', FRFdata.Num);
SetAttributeNS('AccDocDate', '', FRFdata.Date);
end;
with AddChild('Payer') do begin
SetAttributeNS('INN', '', FRFdata.PayerINN);
SetAttributeNS('PersonalAcc', '', FRFdata.PayerACC);
SetAttributeNS('KPP', '', FRFdata.PayerKPP);
with AddChild('Name') do begin
NodeValue:=FRFdata.Payer;
end;
with AddChild('Bank') do begin
SetAttributeNS('BIC', '', '046126738');
end;
end;
with AddChild('Payee') do begin
SetAttributeNS('INN', '', FRFdata.RecipINN);
SetAttributeNS('PersonalAcc', '', FRFdata.RecipACC);
SetAttributeNS('KPP', '', FRFdata.RecipKPP);
AddChild('Name');
with AddChild('Name') do begin
NodeValue:=FRFdata.Recip;
end;
with AddChild('Bank') do begin
SetAttributeNS('BIC', '', FRFdata.RecipBIC);
end;
end;
with AddChild('Purpose') do begin
NodeValue:=string(FRFdata.PaymentAI);
end;
//if (Бюджетный платеж) then
with AddChild('DepartmentalInfo') do begin
SetAttributeNS('DrawerStatus', '', FRFdata.OperationKind);
SetAttributeNS('CBC', '', FRFdata.KBK);
SetAttributeNS('OKATO', '', FRFdata.OKATO);
SetAttributeNS('PaytReason', '', FRFdata.TaxReaso);
SetAttributeNS('TaxPeriod', '', FRFdata.TaxPeriod);
SetAttributeNS('DocNo', '', FRFdata.TaxDocN);
SetAttributeNS('DocDate', '', FRFdata.TaxDate);
SetAttributeNS('TaxPaytKind', '', FRFdata.TaxStatus);
end;
end;
iDoc.SaveToFile(FileName);
Sleep(100);
iDoc.Active := false;
iDoc.XML.Clear;
//Если удачно тогда удаляем frf файл
if RenameFile(FileName, FileName + '.xml') then
DeleteFile(FRFDir + '\' + SearchRec.Name);
Sleep(100);
end;
Sleep(1000);
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
finally
TXMLDocument(iDoc).Free;
FreeAndNil(iDoc);
end;{}
Sleep(5000);
except
on E: Exception do
with TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'Data\errors.txt', fmOpenWrite) do try
Seek(0, soFromEnd);
EStr := AnsiString('ERR '+ DateTimeToStr(Now) + #13#10 + E.ClassName + ' | ' + E.Message + ': ' + E.ToString+ #13#10);
Write(EStr[1], Length(EStr));
finally
Free;
end;
end;
CoUninitialize;
end;
end.
б) Предложите альтернативу TXMLDocument - Получаю AV на втором файле (иногда на 3, 4....) вобщем нестабильна. Если сужбу перезапустить, результат тот же, так что дело не в *.frf:
ERR 27.08.2012 16:59:42
EAccessViolation | Access violation at address 0040A325 in module 'frc.exe'. Read of address 00000001: Access violation at address 0040A325 in module 'frc.exe'. Read of address 00000001
ERR 27.08.2012 16:59:43
EAccessViolation | Access violation at address 0040A325 in module 'frc.exe'. Read of address 00000001: Access violation at address 0040A325 in module 'frc.exe'. Read of address 00000001
ERR 27.08.2012 16:59:44
EAccessViolation | Access violation at address 0040A325 in module 'frc.exe'. Read of address 00000001: Access violation at address 0040A325 in module 'frc.exe'. Read of address 00000001
Дальше до перезапуска тишина
У Медвежонка был где-то код работы с DOM без обертки, пока искал столько баталий начитался по поводу хмл, так что можно сказать есть очередной повод :)
Dennis I. Komarov (2012-08-27 19:54:00) [41]
> Ну так а какой строке кода соответствует адрес 0040A325 ?
А х.з. До сих пор не знаю как это посмотрть... Лог с реально запущенной службы. Как запустить службу из IDE (или приклеать процесс к коду) - не знаю. Уж вот как-то так... :-[
sniknik (2012-08-27 19:54:00) [42]?????????????/
TXMLDocument(iDoc).Free;
FreeAndNil(iDoc);
Rouse_ (2012-08-27 19:48:00) [43]Ну так а какой строке кода соответствует адрес 0040A325 ?