Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Работа с кассовым аппаратом из службы  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 168
Всем привет. Пишу службу, в которой хочу организовать работу с кассовым аппаратом Феликс-02К, Драйвер ККМ v.8.

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

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 все отрабатывает нормально, и с кассой работа происходит без ошибок, а в службе даже не удается создать экземпляр класса.

Есть какие либо идеи?
23 сен 17, 10:51    [20817836]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 539
CoInitialize ?
23 сен 17, 11:28    [20817861]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 168
пробовал, тоже самое
23 сен 17, 11:43    [20817874]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43831

RuslanSharipov
вылетает access violation.

Посмотреть по адресу в каком именно месте оно "вылетает", не говоря уже о Call Stack, ты,
конечно же, не пробовал. А зря.

Posted via ActualForum NNTP Server 1.5

23 сен 17, 12:00    [20817906]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
x1ca4064
Member

Откуда:
Сообщений: 837
RuslanSharipov
Есть какие либо идеи?


1. Попробуйте запускать сервис от имени какого-то пользователя, а не локальной системы
2. Если используется SSL - попробуйте от него избавится (уберите соответствующие билиотеки)
23 сен 17, 14:51    [20818004]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 168
x1ca4064,

пробовал не помогало.
23 сен 17, 15:43    [20818054]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
SLab
Member

Откуда: Пенза
Сообщений: 289
RuslanSharipov,
У меня в примере от АТОЛА, по другому, но там тоже GUI, но может поможет
+

{
**************************** !!! ВНИМАНИЕ !!! *****************************
  Для корректной работы с драйвером в режиме отладки необходимо в среде
разработки отключить остановку на исключительных ситуациях.
  Эта опция находится в меню "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.

23 сен 17, 17:02    [20818109]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
Попробуй с TFprnm8, это обновленный драйвер, он там более независимый
24 сен 17, 16:35    [20819003]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
defecator
Member

Откуда:
Сообщений: 35040
Zelius
Попробуй с TFprnm8, это обновленный драйвер, он там более независимый

для этого аппарата существует опенсорс библиотека для Лазаруса
25 сен 17, 09:38    [20819741]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 168
Zelius
Попробуй с TFprnm8, это обновленный драйвер, он там более независимый


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

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

Попробую конечно TFprnm8 использовать, может там это все исправлено.
25 сен 17, 14:03    [20820686]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Cobalt747
Member

Откуда:
Сообщений: 1966
RuslanSharipov,

Драйвера зарегистрированы бесплатные?
25 сен 17, 16:30    [20821287]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 168
Cobalt747,
да
25 сен 17, 16:38    [20821308]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Cobalt747
Member

Откуда:
Сообщений: 1966
RuslanSharipov,

Попробуйте так:
var
  fOle: Variant;
begin
  fOle := CreateOleObject('AddIn.FprnM45');

Если получится - значит косяк в этой обертке TFprnM45
25 сен 17, 22:46    [20822088]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
отпишись, плиз, о результатах, мне тоже светит похожая задача.
27 сен 17, 15:36    [20827030]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Cobalt747
Member

Откуда:
Сообщений: 1966
Zelius,
var
  fOle: Variant;
begin
  fOle := CreateOleObject('AddIn.FprnM45');
  fOle.ShowProperties;

Можно отладить и не имея аппарата.
28 сен 17, 10:20    [20828367]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
"не растет кокос" - при создании CreateOleObject('AddIn.FprnM8') из доп. потока висит на SendMessage где-то в недрах ole32 :(
29 сен 17, 09:27    [20830839]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23099
Zelius
"не растет кокос" - при создании CreateOleObject('AddIn.FprnM8') из доп. потока висит на SendMessage где-то в недрах ole32 :(

20817861
29 сен 17, 09:36    [20830850]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
wadman,

аск! конечно есть, иначе ошибку выдало...
29 сен 17, 09:38    [20830857]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23099
Zelius
конечно есть, иначе ошибку выдало...

Попробуй создать в основном потоке и передать в доп. Вдруг взлетит?
29 сен 17, 09:39    [20830859]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
wadman,

попробовал, объект создался, передал в поток, вызов на включение прошел, но дальше какие то ошибки не понятные.
думаю попробовать сделать отдельное приложение и пускать и контролировать его из сервиса через пайпы...
29 сен 17, 16:50    [20832295]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2383
Zelius,

Возможно, объект создает окна. Надо попробовать разрешить создание окон в службе.
29 сен 17, 16:55    [20832307]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2383
SERVICE_INTERACTIVE_PROCESS
29 сен 17, 17:02    [20832320]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1286
YuRock,

до сервиса пока не дошло даже, я пытался просто в отдельном потоке создать оле объект
29 сен 17, 17:03    [20832324]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Arioch
Member

Откуда:
Сообщений: 9144
Zelius,

а ты в этом потоке CoInitialize делал?
29 сен 17, 17:43    [20832383]     Ответить | Цитировать Сообщить модератору
 Re: Работа с кассовым аппаратом из службы  [new]
Arioch
Member

Откуда:
Сообщений: 9144
Zelius
объект создался, передал в поток, вызов на включение прошел, но дальше какие то ошибки не понятные.


а у этого COM-объекта MTA позволяет его между потоками передавать ?
29 сен 17, 17:44    [20832386]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить