Форум программистов, компьютерный форум, киберфорум
1С: Администрирование и интеграция
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
2 / 2 / 2
Регистрация: 23.06.2014
Сообщений: 12

1C/Delphi/VB/C Драйвер ФЕЛИКС-РМК

23.06.2014, 10:44. Показов 4580. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема: имеется фискальный регистратор Феликс-РМК, нужно прикрутить его к программе на Delphi, и не получается. Общий драйвер ККМ от Атола не подходит, Атол разводит руками, мол, именно к этому Феликсу мы не имеем никакого отношения, драйвер для 1С писал сам изготовитель, завод "Счетмаш".

В комплекте с Феликсом идет драйвер: набор .dll и .epf. Внешний модуль, который непосредственно использует 1С, называется Smdd_ExCom.dll. Вроде бы он в себе содержит элемент ActiveX, судя по наличию экспортируемых функций DllRegisterServer и DllGetClassObject, но не тут-то было, Delphi (версии 7 и версии XE5) не видит никаких новых ActiveX в системе после регистрации этой библиотеки с помощью regsvr32, да и при помощи OleViewer от MS тоже не нахожу.

Вот что я извлек из модуля .ert, прилагаемого, правда, не к этой модели, но к видимо совместимой Феликс-80к (во всяком случае, набор .dll совпадает):
1C
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
Функция Подключить(Компонента, ПрогИд, Объект)
 
    Рез = 0;
 
    Если ЗагрузитьВнешнююКомпоненту("C:\Program Files\1Cv77\BIN\" + Компонента) = 0  Тогда
        ОписаниеРезультата = "не удалось загрузить внешнюю компоненту """ + Компонента + """";
    Иначе
        Попытка
            Объект = СоздатьОбъект("AddIn." + ПрогИд);  // Создание объекта внешней компоненты
        Исключение
        КонецПопытки;
 
        Если ПустоеЗначение(Объект) = 1 Тогда
            ОписаниеРезультата = "не удалось создать объект внешней компоненты с программым идентификатром AddIn." + ПрогИд;
        Иначе
            Если Объект.ПодключитьДрайвер()=1 Тогда
 
                ID = ВосстановитьЗначение("ВТИ_ID");
                ПарольПередачиДанных = ВосстановитьЗначение("ВТИ_ПарольПередачиДанных");
                ПарольПереключенияРежимов = ВосстановитьЗначение("ВТИ_ПарольПереключенияРежимов");
                Порт = ВосстановитьЗначение("ВТИ_Порт");
                Скорость = ВосстановитьЗначение("ВТИ_Скорость");
 
                Если Объект.ПодключитьФР("smdd_rmk.dll", ID, ПарольПередачиДанных, ПарольПереключенияРежимов , Порт, Скорость)=1 Тогда
                    Рез = 1;
                Иначе
                    ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
                КонецЕсли;
            Иначе
                Сообщить("Не удалось подключить ФР");
            КонецЕсли;
            Рез = 1;
        КонецЕсли;
    КонецЕсли;
    Возврат Рез;
КонецФункции
Ключевые функции здесь ЗагрузитьВнешнююКомпоненту, СоздатьОбъект и Подключить драйвер - они встречаются внутри smdd_excom.dll, хотя и не экспортируются в явном виде.

Фрагмент аналогичного по назначению кода, написанного мной, выглядит вот так:
Delphi
1
2
3
4
5
    obj:=CreateOleObject('addin.smdd_excom'); // obj определен как Variant
    Рез:=obj.ConnectDriver(); // можно Рез:=obj.ПодключитьДрайвер() - это синонимы
 
    if obj.ПодключитьФР('smdd_rmk.dll', ID, ПарольПередачиДанных, ПарольПереключенияРежимов , Порт, Скорость)=1 then begin 
   ..........
Или вот так:
VB.NET
1
2
3
4
5
6
7
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim obj As Object
        Dim rez As Integer
 
        obj = CreateObject("AddIn.Smdd_ExCom")
        rez = obj.ПодключитьДрайвер()     ' можно rez = obj.ConnectDriver() 
    End Sub
В обоих вариантах COM-объект исправно создается из библиотеки Smdd_Ex_Com.dll, а вот команда ПодключитьДрайвер() или ее аналог ConnectDriver() вылетают с сообщением "Не реализовано". А уж до ПодключитьФР() и не доходит.

Вот здесь я себе всю голову сломал. Вроде COM-объект один и тот же, и создается исправно, почему же из 1С получается обратиться к его методам, а из Delphi и VB нет? Загадка. Наверно, что-то я неправильно делаю. Подскажите, господа, хотя бы куда копать. В Сети ничегошеньки полезного не нашел. Может, у кого-то есть пример вызова таких методов на любом языке - если не Delphi и не VB, то C++, или C#, или CBuilder - вообще любом языке, позволяющем создавать .dll (1С такого вроде не позволяет). Я бы ее сгенерировал и прикрутил к своему проекту. Спасибо.
Ссылки: http://www.schetmash.com/feliks-rmk.html
P.S. Сейчас получил ответ от фирмы "Счетмаш". Советуют не связываться с Smdd_Ex_Com.dll, а заняться непосредственно smdd.dll. Попробую, вот только из smdd.dll никакой COM-объект не создается, очень жаль.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2014, 10:44
Ответы с готовыми решениями:

Delphi и ФЕЛИКС РМК
Проблема: есть такая контрольно-кассовая машина, она же фискальный регистратор, производства компании "Счетмаш". К несчастью, она...

Драйвер для delphi
Подскажите пожалуйста, где можно найти драйвер ZeosDBO? А-то не могу подключиться к БД в Mysql через Delphi

Возможно ли написать драйвер на Delphi?
Возможно ли написать драйвер на Delphi? Где можно скачать литературу? Спасибо!!!

6
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,703
Записей в блоге: 1
24.06.2014, 23:04
Цитата Сообщение от terapod Посмотреть сообщение
smdd.dll. Попробую, вот только из smdd.dll никакой COM-объект не создается, очень жаль.
Так может в этой длл нужные тебе функции торчат наружу...

Добавлено через 1 минуту
Цитата Сообщение от terapod Посмотреть сообщение
Ключевые функции здесь ЗагрузитьВнешнююКомпоненту, СоздатьОбъект
Эти методы встроены в платформу 1С
0
2 / 2 / 2
Регистрация: 23.06.2014
Сообщений: 12
25.06.2014, 00:27  [ТС]
Ну как сказать - торчат? Имеются, правда, имена малость перекорежены, типа SMDDBell() и т.п. Драйвер (если вообще забыть про 1с) состоит из ядра smdd.dll и подключаемых библиотек smdd_rmk.dll и других. Имя библиотеки передается как аргумент в функции ядра. Сами функции и параметры описаны в имеющемся у меня заголовочном файле smdd.h - типы данных, конечно, из C/C++. Это ладно, для всех типов С можно подобрать аналоги в Delphi. Кое-что работает: гружу smdd.dll в память, нахожу нужную функцию, вызываю. Например, можно вызвать диалог настройки ККМ, это работает. А вот вызов простейшей функция BELL (у нее даже аргументов нет!) приводит к вылету программы!

Хотелось бы, конечно, вызывать функции драйвера 1с, они задокументированы и более-менее одинаковые вообще для любой модели ККМ. Почему это не получается - смертельно удивительно.

Добавлено через 31 минуту
Вот как я это делаю. Фрагмент заголовочного файла smdd.h:
int __stdcall (*SMDDDeviceConfigureUI)(void);
int __stdcall (*SMDDBell)(void);
int __stdcall (*SMDDBeep)(int frequency, int duration);
- как видно, это три разных функции, возвращаюшие результат целого типа (0, если функция отработала без ошибок, или же код ошибки).

Соответственно в своей программе на Delphi в разделе var я определяю три переменные типа функция:
Delphi
1
2
3
4
var
  SMDDDeviceConfigureUI: function(): integer;
  SMDDBeep: function(frequency, duration: integer): Integer;
  SMDDBell: function(): Integer;
и далее в коде программы вызываю их таким образом:
Delphi
1
2
3
4
5
6
7
Handle:=LoadLibrary('Smdd.dll'); // переменная типа THandle
@SMDDDeviceConfigureUI:=GetProcAddress(Handle, 'SMDDDeviceConfigureUI');
@SMDDBeep:=GetProcAddress(Handle, 'SMDDBeep');
@SMDDBell:=GetProcAddress(Handle, 'SMDDBell');
rez:=SMDDDeviceConfigureUI(); // исправно работает, вызывает диалог настройки
rez:=SMDDBeep(1000, 100); // должна бы пискнуть, но проскакивает беззвучно
rez:=:=SMDDBell(); // вызывает исключение
Причем функция SMDDDeviceConfigureUI - настройка через User Interface - работает отлично, а вот похожая функция, SMDDDeviceConfigure, в которую я передаю аргументы (номер порта, скорость и т.д.), ничего полезного не делает, возвращает ошибку (число >0), и только сбрасывает в ноль все настройки! Вот что про нее сказано в smdd.h:

int __stdcall (*SMDDDeviceConfigure)(char *libname, int id, char *commpwd, char *portname, unsigned long baudrate);

И вот так я ее вызываю:
Delphi
1
2
3
4
5
6
7
var
  SMDDDeviceConfigure: function(LibName: PChar;
    id: Word;  commpwd: PChar; portname: PChar; baudrate: integer): Integer;
.......................
@SMDDDeviceConfigure:=GetProcAddress(Handle, 'SMDDDeviceConfigure');
id:=722; // идентификатор модели, соответствует Феликс-РМК
rez:=SMDDDeviceConfigure('smdd_rmk.dll', id, '0000', 'COM7', 115200);
Как-то так.
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,703
Записей в блоге: 1
25.06.2014, 00:32
А если тип объявить как Dinamic? (не помню есть такой в делфях или нет)

Компонента не секретная? скинь сюда, у себя попробую...
0
2 / 2 / 2
Регистрация: 23.06.2014
Сообщений: 12
25.06.2014, 03:13  [ТС]
В Delphi есть тип variant. Но он никак не годится для вызова функций, написанных на C/C++ и хранящихся в .dll, если они ожидают переменные типа char* или int или unsigned int - ведь при вызове процедуры они размещаются в стеке, каждая со своим размеров в байтах.
Вот здесь - официальные драйвера от "Счетмаша" - http://www.schetmash.com/feliks-rmk.html
Есть еще исходный текст (на языке C) драйвера smdd.dll, готов скинуть в личку, только не соображу как... Пока высылаю заголовочный файл smdd.h - там перечислены все функции, имеющиеся в smdd.dll, этого достаточно для написания программ, использующих эти функции, а также описание функций на русском языке. Боюсь, правда, что в отсутствие живьем Феликс-РМК программы написать можно, а вот отладить их - никак.
Вложения
Тип файла: zip files.zip (12.0 Кб, 35 просмотров)
0
2 / 2 / 2
Регистрация: 23.06.2014
Сообщений: 12
25.06.2014, 14:45  [ТС]
Всё, я разобрался с этой библиотекой.
Заработала она в режимах и раннего, и позднего связывания.
Оказалось, строковые аргументы из Delphi нужно передавать не как PChar (Delphi XE5, похоже, автоматически преобразует их к типу PWideChar), а как PAnsiChar.
Кроме того, драйвер недостаточно просто инициализировать: после настройки следует еще подать ему команду Start.
И некоторые функции, например, Beep, просто не поддерживаются Феликс РМК.
2
25.06.2014, 16:02

Не по теме:

Я даже скачать не успел =))

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2014, 16:02
Помогаю со студенческими работами здесь

РМК розница 2,0
не могу никак разобраться как попасть (назначить пользователю ) интерфейс РМК розница 2,.0

Атол Фронтол И РМК
вместе дружная семья... вопросик..... Есть 1С УТ и РМК-Атол, товар частично не загрузился в РМК-Атол, хотелось бы обойти номенклатуру и...

Нулевой остаток в РМК
Привет всем, такая проблема имеется главная база 1с, от нее идет магазин сделан по РИБ по магазину, вот на этом магазине все настроено,...

Настройка РМК (розница 2.1)
Всем привет. Может кто сталкивался с такой проблемой. Создала пользователя "продавец", поставила режим запуска "обычное...

Штрих-код в РМК Розница 1.0
День добрый, грамотные люди, помогите пожалуйста советом. Есть такая проблемка, в РМК(Рабочее Место Кассира) добавляю отображение столбца...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru