powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с кассовым аппаратом из службы
25 сообщений из 27, страница 1 из 2
Работа с кассовым аппаратом из службы
    #39525242
RuslanSharipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Пишу службу, в которой хочу организовать работу с кассовым аппаратом Феликс-02К, Драйвер ККМ v.8.

при старте службы создаю экземпляр класса TKassav14:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TFprnM45 = class(TOleControl) //это из модуля который предоставляет АТОЛ после установки драйвера

TKassav14 = class(TInterfacedObject, IKassa)
private
    FprnM45: FprnM1C_TLB_v14.TFprnM45;
public
    constructor Create(AOwner: TComponent);

constructor TKassav14.Create(AOwner: TComponent);
begin
  FprnM45 := TFprnM45.Create(AOwner);
  ....
end;



В момент вызова конструктора TFprnM45, вылетает access violation.


В обычном VCL application или в console все отрабатывает нормально, и с кассой работа происходит без ошибок, а в службе даже не удается создать экземпляр класса.

Есть какие либо идеи?
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525254
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoInitialize ?
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525258
RuslanSharipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробовал, тоже самое
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525263
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanSharipovвылетает access violation.

Посмотреть по адресу в каком именно месте оно "вылетает", не говоря уже о Call Stack, ты,
конечно же, не пробовал. А зря.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525279
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanSharipovЕсть какие либо идеи?

1. Попробуйте запускать сервис от имени какого-то пользователя, а не локальной системы
2. Если используется SSL - попробуйте от него избавится (уберите соответствующие билиотеки)
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525288
RuslanSharipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

пробовал не помогало.
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525303
SLab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanSharipov,
У меня в примере от АТОЛА, по другому, но там тоже GUI, но может поможет

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
{
**************************** !!! ВНИМАНИЕ !!! *****************************
  Для корректной работы с драйвером в режиме отладки необходимо в среде
разработки отключить остановку на исключительных ситуациях.
  Эта опция находится в меню "Tools\Debugger Options", закладка
"Language Exceptions". Флаг "Stop On Delphi Exceptions" необходимо снять.
***************************************************************************
}
unit fmuMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComObj;

type
  TfrmMain = class(TForm)
    btnStart: TButton;
    btnShowProperties: TButton;
    procedure btnShowPropertiesClick(Sender: TObject);
    procedure btnStartClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  ECR: OleVariant;

implementation

{$R *.DFM}

procedure Demo;
begin
// занимаем порт
  ECR.DeviceEnabled := true;
  if ECR.ResultCode <> 0 then Exit;

// получаем состояние ККМ
  if ECR.GetStatus <> 0 then Exit;

// проверяем на всякий случай ККМ на фискализированность
  if ECR.Fiscal then
    if Application.MessageBox('ККМ фискализирована! Вы действительно хотите продолжить?', PChar(Application.Title), MB_ICONEXCLAMATION + MB_YESNO) = idNo then
      Exit;

// если есть открытый чек, то отменяем его
  if ECR.CheckState <> 0 then
    if ECR.CancelCheck <> 0 then Exit;

// если смена открыта снимаем Z-отчет
  if ECR.SessionOpened then
  begin
    // устанавливаем пароль системного администратора ККМ
    ECR.Password := '30';
    // входим в режим отчетов с гашением
    ECR.Mode := 3;
    if ECR.SetMode <> 0 then Exit;
    // снимаем отчет
    ECR.ReportType := 1;
    if ECR.Report <> 0 then Exit;
  end;

// входим в режим регистрации
  // устанавливаем пароль кассира
  ECR.Password := '1';
  // входим в режим регистрации
  ECR.Mode := 1;
  if ECR.SetMode <> 0 then Exit;

// продажа без сдачи
  // регистрация продажи
  ECR.Name := 'Молоко';
  ECR.Price := 10.45;
  ECR.Quantity := 1;
  ECR.Department := 2;
  if ECR.Registration <> 0 then Exit;
  // скидка суммой на предыдущую позицию
  ECR.Percents := 10;
  ECR.Destination := 1;
  if ECR.PercentsDiscount <> 0 then Exit;
  // регистрация продажи
  ECR.Name := 'Фанта';
  ECR.Price := 25;
  ECR.Quantity := 5;
  ECR.Department := 1;
  if ECR.Registration <> 0 then Exit;
  // скидка суммой на весь чек
  ECR.Summ := 10.40;
  ECR.Destination := 0;
  if ECR.SummDiscount <> 0 then Exit;
  // закрытие чека наличными без ввода полученной от клиента суммы
  ECR.TypeClose := 0;
  if ECR.CloseCheck <> 0 then Exit;

// продажа со сдачей
  // регистрация продажи
  ECR.Name := 'Молоко';
  ECR.Price := 10.45;
  ECR.Quantity := 1;
  ECR.Department := 2;
  if ECR.Registration <> 0 then Exit;
  // регистрация продажи
  ECR.Name := 'Пепси-кола';
  ECR.Price := 25.00;
  ECR.Quantity := 5;
  ECR.Department := 1;
  if ECR.Registration <> 0 then Exit;
  // сторно предыдущей регистрации
  if ECR.Storno <> 0 then Exit;
  // регистрация продажи
  ECR.Name := 'Фанта';
  ECR.Price := 25;
  ECR.Quantity := 5;
  ECR.Department := 1;
  if ECR.Registration <> 0 then Exit;
  // скидка суммой на весь чек
  ECR.Summ := 50;
  ECR.Destination := 0;
  if ECR.SummDiscount <> 0 then Exit;
  // закрытие чека наличными с вводом полученной от клиента суммы
  ECR.Summ := 100;
  ECR.TypeClose := 0;
  if ECR.Delivery <> 0 then Exit;

// аннулирование
  // регистрация аннулирования
  ECR.Name := 'Dirol';
  ECR.Price := 7;
  ECR.Quantity := 1;
  if ECR.Annulate <> 0 then Exit;
  // регистрация аннулирования
  ECR.Name := 'Orbit';
  ECR.Price := 8;
  ECR.Quantity := 2;
  if ECR.Annulate <> 0 then Exit;
  // закрытие чека
  ECR.TypeClose := 0;
  if ECR.CloseCheck <> 0 then Exit;

// возврат
  // регистрация возврата
  ECR.Name := 'Молоко';
  ECR.Price := 10.45;
  ECR.Quantity := 1;
  if ECR.Return <> 0 then Exit;
  // регистрация возврата
  ECR.Name := 'Колбаса';
  ECR.Price := 99.99;
  ECR.Quantity := 1.235;
  if ECR.Return <> 0 then Exit;
  // скидка суммой на весь чек
  ECR.Summ := 50;
  ECR.Destination := 0;
  if ECR.SummDiscount <> 0 then Exit;
  // закрытие чека
  ECR.TypeClose := 0;
  if ECR.CloseCheck <> 0 then Exit;

// внесение наличности
  ECR.Summ := 400.50;
  if ECR.CashIncome <> 0 then Exit;

// выплата наличности
  ECR.Summ := 121.34;
  if ECR.CashOutcome <> 0 then Exit;

// X - отчет
  // устанавливаем пароль администратора ККМ
  ECR.Password := '29';
  // входим в режим отчетов без гашения
  ECR.Mode := 2;
  if ECR.SetMode <> 0 then Exit;
  // снимаем отчет
  ECR.ReportType := 2;
  if ECR.Report <> 0 then Exit;

// Z - отчет
  // устанавливаем пароль системного администратора ККМ
  ECR.Password := '30';
  // входим в режим отчетов с гашением
  ECR.Mode := 3;
  if ECR.SetMode <> 0 then Exit;
  // снимаем отчет
  ECR.ReportType := 1;
  if ECR.Report <> 0 then Exit;

// выходим в режим выбора, чтобы кто-то под введенными паролями не сделал что нибуть нехорошее
  if ECR.ResetMode <> 0 then Exit;

// освобождаем порт
  ECR.DeviceEnabled := false;
  if ECR.ResultCode <> 0 then Exit;

  Application.MessageBox('Все операции успешно выполнены.', PChar(Application.title), MB_ICONINFORMATION + MB_OK);
end;

procedure TfrmMain.btnStartClick(Sender: TObject);
begin
  btnStart.Enabled := false;
  btnShowProperties.Enabled := false;

  Demo;
  if ECR.ResultCode <> 0 then
    Application.MessageBox(PChar('Ошибка ККМ: ' + string(ECR.ResultDescription) + '!'), PChar(Application.Title), MB_ICONERROR + MB_OK);

  btnStart.Enabled := true;
  btnShowProperties.Enabled := true;
end;

procedure TfrmMain.btnShowPropertiesClick(Sender: TObject);
begin
// показываем страницу свойств
  ECR.ShowProperties;
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin
// создаем объект общего драйвера ККМ
// если объект создать не удается генерируется исключение, по которому завершается работа приложения
  try
    ECR := CreateOleObject('AddIn.FprnM45');
    ECR.ApplicationHandle := Application.Handle; // необходимо для корректного отображения окон драйвера в контексте приложения
  except
    Application.MessageBox('Не удалось создать объект общего драйвера ККМ!', PChar(Application.Title), MB_ICONERROR + MB_OK);
    Application.Terminate;
  end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// разрушаем объект драйвера
  ECR := 0;
end;

end.


...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525456
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй с TFprnm8, это обновленный драйвер, он там более независимый
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525588
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ZeliusПопробуй с TFprnm8, это обновленный драйвер, он там более независимый
для этого аппарата существует опенсорс библиотека для Лазаруса
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525803
RuslanSharipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZeliusПопробуй с TFprnm8, это обновленный драйвер, он там более независимый

Вся проблема в ОС, в 7ке все отрабатывает нормально, а на 10ке валится. Я так понимаю 10ка на каком то этапе просто рубит все(может с сертификацией драйвера как то ерунда).

ни с чем подобным не сталкивались?

Попробую конечно TFprnm8 использовать, может там это все исправлено.
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525896
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanSharipov,

Драйвера зарегистрированы бесплатные?
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39525902
RuslanSharipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cobalt747,
да
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39526015
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanSharipov,

Попробуйте так:
Код: pascal
1.
2.
3.
4.
var
  fOle: Variant;
begin
  fOle := CreateOleObject('AddIn.FprnM45');


Если получится - значит косяк в этой обертке TFprnM45
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39527179
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отпишись, плиз, о результатах, мне тоже светит похожая задача.
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39527498
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,
Код: pascal
1.
2.
3.
4.
5.
var
  fOle: Variant;
begin
  fOle := CreateOleObject('AddIn.FprnM45');
  fOle.ShowProperties;


Можно отладить и не имея аппарата.
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528099
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"не растет кокос" - при создании CreateOleObject('AddIn.FprnM8') из доп. потока висит на SendMessage где-то в недрах ole32 :(
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528105
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius"не растет кокос" - при создании CreateOleObject('AddIn.FprnM8') из доп. потока висит на SendMessage где-то в недрах ole32 :(
20817861
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528109
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

аск! конечно есть, иначе ошибку выдало...
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528110
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliusконечно есть, иначе ошибку выдало...
Попробуй создать в основном потоке и передать в доп. Вдруг взлетит?
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528517
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

попробовал, объект создался, передал в поток, вызов на включение прошел, но дальше какие то ошибки не понятные.
думаю попробовать сделать отдельное приложение и пускать и контролировать его из сервиса через пайпы...
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528521
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

Возможно, объект создает окна. Надо попробовать разрешить создание окон в службе.
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528529
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERVICE_INTERACTIVE_PROCESS
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528531
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

до сервиса пока не дошло даже, я пытался просто в отдельном потоке создать оле объект
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528562
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

а ты в этом потоке CoInitialize делал?
...
Рейтинг: 0 / 0
Работа с кассовым аппаратом из службы
    #39528563
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliusобъект создался, передал в поток, вызов на включение прошел, но дальше какие то ошибки не понятные.

а у этого COM-объекта MTA позволяет его между потоками передавать ?
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с кассовым аппаратом из службы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]