Меркурий 130 и DrvMercFR.dll: серийный номер

Модели:
Меркурий-115Ф, Меркурий-119Ф, Меркурий-130Ф, Меркурий-180Ф, Меркурий-185Ф, Меркурий-МФ...
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

по поводу серийника, появилась функция QueryEcrIdentEx https://forum.incotexkkm.ru/viewtopi ... 0&p=33#p33
по поводу 4.6 сделал защиту от цифр типа 4.59999999, теперь проблем не должно быть на 2.30, 4.10, 4.60, 5.10 проверил.
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Вопрос:
Как пользоваться функцией QueryEcrIdent
Как получить данные ?
Приведите пример....
----------------------------------------------------------------
Dim res
Set DX = CreateObject("DynamicWrapperX")
DX.Register App.Path & "\DrvMercFR.dll", "QueryEcrIdent", "i=uus" '
MsgBox DX.QueryEcrIdent
-----------------------------------------------------------------
Ничего не выходит.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

typedef int ( __stdcall *TQueryEcrIdent) (
char *ModelName,
char *Manufacturer,
char *FirmvareVersion
);

ориентируйтесь на описание в drvmercfr.h
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Ошибка получается.
Никак не удаётся получить результат работы функции.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

рабочий кусок:
void __fastcall TForm1::bInfoClick(TObject *Sender)
{
char ModelName[50],Manufacturer[50], FirmvareVersion[50];
int Res=QueryEcrIdent(ModelName,Manufacturer,FirmvareVersion);
if(Res==0)
{
Log->Lines->Add(ModelName);
Log->Lines->Add(Manufacturer);
Log->Lines->Add(FirmvareVersion);
}else Log->Lines->Add("QueryEcrIdent:"+IntToStr(Res));
}

смотрите TestDll и TestDll2 там рабочий код, соответственно по нему и делайте.
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Спасибо!
Но воспользоваться Вашим советом - не смогу.
У меня нет такой среды разработки программ.
Я делаю на VB6.
Потому применить, то что там имеется - не представляется возможным, по вышеуказанной причине и по причине отсутствия знаний данного языка программирования.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

час писал(а):Спасибо!
Но воспользоваться Вашим советом - не смогу.
У меня нет такой среды разработки программ.
Я делаю на VB6.
Потому применить, то что там имеется - не представляется возможным, по вышеуказанной причине и по причине отсутствия знаний данного языка программирования.
час писал(а):Интересно , а произвольную строку написать - функция в этой dll имеется?
==================
И где вообще посмотреть все её функции?
----------------------------------------------
Кстати такие фунции как QueryEcrDateTime
GetCurrOper
- не понял как вызывать и обрабатывать.
Кто нибудь приведите пример на любом языке программирования.
я Вам дал пример на одном из самых распространенных языков, на других языках, тем более на VB, у нас нет проверенных исходников.
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Спасибо за поддержку!
Жаль, что бейсик - не считается распространённым языком программирования.
Хотя вроде бы по мировым понятиям -на восьмом месте.
http://www.oszone.net/14233/Top_10_prog ... _languages
--------------------------------
C другой стороны
Dim ModelName,Manufacturer,FirmvareVersion
Res=QueryEcrIdent(ModelName,Manufacturer,FirmvareVersion)
Всё равно выдаёт ошибку.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

час писал(а):Спасибо за поддержку!
Жаль, что бейсик - не считается распространённым языком программирования.
Хотя вроде бы по мировым понятиям -на восьмом месте.
http://www.oszone.net/14233/Top_10_prog ... _languages
А вроде ни кто и не говорил, что бэйсик не считается распространенным языком и на нем пишут подключение к М130.
час писал(а): C другой стороны
Dim ModelName,Manufacturer,FirmvareVersion
Res=QueryEcrIdent(ModelName,Manufacturer,FirmvareVersion)
Всё равно выдаёт ошибку.
уже намного ближе, Вы уже поняли что возвращается не одно значение а три, теперь разберитесь как все таки на VB можно получать эти значения(я не знаю как именно в VB).
Аватара пользователя
Briarius
Сотрудник Инкотекс
Сотрудник Инкотекс
Сообщения: 386
Зарегистрирован: 17 май 2011, 17:37
Контактная информация:

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Briarius »

Помнится, в институте нам преподаватель цитировал http://ru.wikiquote.org/wiki/Эдсгер_Вибе_Дейкстра
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Briarius писал(а):Помнится, в институте нам преподаватель цитировал http://ru.wikiquote.org/wiki/Эдсгер_Вибе_Дейкстра
============================================
:D :D :D
это не по существу вопроса, но смешно!
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Код: Выделить всё

уже намного ближе, Вы уже поняли что возвращается не одно значение а три, теперь разберитесь как все таки на VB можно получать эти значения
ЭТО Я ПОНЯЛ ДВА ДНЯ НАЗАД.
Но до сих пор никакими силами не удаётся извлечь данные. :evil:
Они бы содержались в переменных - кои находятся в скобках, но эта строка не выполняется - как ошибочная при обращении ККМ
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

час писал(а):

Код: Выделить всё

уже намного ближе, Вы уже поняли что возвращается не одно значение а три, теперь разберитесь как все таки на VB можно получать эти значения
ЭТО Я ПОНЯЛ ДВА ДНЯ НАЗАД.
Но до сих пор никакими силами не удаётся извлечь данные. :evil:
Они бы содержались в переменных - кои находятся в скобках, но эта строка не выполняется - как ошибочная при обращении ККМ
Я не знаю как в VB оформлять заранее зарезервированые контейнеры для строк(с 0м в конце), как передавать указатель на эту область и как потом с этим работать но уверен, что такое должно быть, подозреваю что хелп по VB Вам в этом поможет.
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Спасибо!
VB6 использую как только он появился. С прошлого века.
Дело ни в ни знании дело в непониманиию
Как можно получить зна....
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

DrvMercFR.dll ни чем по взаимодействию не отличается от множества других библиотек, это стандартный механизм взаимодействия и как этот механизм реализуется в VB надо смотреть в хелпе по нему, а так как вы используете DynamicWrapperX, то и по нему надо смотреть хелп, чтоб понять как именно можно реализовать то, что передает DLL.
Так как это форум не по программированию то ожидать гарантированного ответа не стоит, но может кто и поможет.
Аватара пользователя
час
Сообщения: 28
Зарегистрирован: 27 окт 2011, 08:52

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение час »

Спасибо!
Подождём... :roll:
Аватара пользователя
sergsen
Сообщения: 7
Зарегистрирован: 15 фев 2012, 21:28
Контактная информация:

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение sergsen »

час писал(а): Подождём...
Если еще кому любопытно
час писал(а):DX.Register App.Path & "\DrvMercFR.dll", "QueryEcrIdent", "i=uus" '
В исходниках видно, что изменение параметров идет по ссылкам, так что используйте при передаче возвращаемых параметров хэндлы, получить которые можно через тот же DynamicWrapperX методом StrPtr. По крайней мере в VBScript работает пример:

Код: Выделить всё

...
DX.Register Path & "DrvMercFR.dll", "QueryEcrIdent", "i=hhh" "r=l"
...
KKMName = DX.Space(31,"")
KKMManu = DX.Space(31,"")
KKMVers = DX.Space(31,"")
hKKMName = DX.StrPtr(KKMName)
hKKMManu = DX.StrPtr(KKMManu)
hKKMVers = DX.StrPtr(KKMVers)
Res = DX.QueryEcrIdent(hKKMName, hKKMManu, hKKMVers)
  KKMName = DX.StrGet(hKKMName,"s")
  KKMManu = DX.StrGet(hKKMManu,"s")
  KKMVers = DX.StrGet(hKKMVers,"s")
if Res = 0 then
  Wscript.Echo "ModelName      : " & KKMName & Chr(10) & _
		   "Manufacturer   : " & KKMManu & Chr(10) & _ 
		   "FirmvareVersion: " & KKMVers 
else
  Wscript.Echo "Error      : " & Res
endif
В случае 1С и при передаче числовых возвращаемых параметров, например, для метода драйвера GetTaxRate, ситуация сложнее. Здесь для получения указателя можно через DynamicWrapperX воспользоваться WinAPI функциями GlobalAlloc и GlobalFree , как советовали здесь при обсуждении DynamicWrapperX

Код: Выделить всё

...
DX.Register Path & "DrvMercFR.dll", "GetTaxRate","i=lhh", "r=l"
DX.Register "kernel32.dll", "GlobalAlloc", "i=ul", "r=p" 
DX.Register "kernel32.dll", "GlobalFree", "i=p", "r=p" 
...
  TaxNum = CInt(1)
  hTaxRate = DX.GlobalAlloc(0,4)
  hTaxName = DX.GlobalAlloc(0,24) 'для 12 2-х байтных символов
  Res = DX.GetTaxRate(TaxNum,hTaxRate,hTaxName)
  TaxRate = DX.NumGet(hTaxRate,0,"l")/100
  TaxName = DX.StrGet(hTaxName,"s")
  Wscript.Echo "TaxRateNum : " & TaxNum & Chr(10) & _
			"TaxRate : " & TaxRate & Chr(10) & _
			"TaxName : " & TaxName
  DX.GlobalFree(hTaxRate)
  DX.GlobalFree(hTaxName)
 
Не решенным осталось получение таким образом параметра GetTaxNum (всегда возвращаеся 0) и даты ККМ через QueryEcrDateTime (число в первых 4-х байтах вижу, все остальное непонятно)
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

sergsen
Спасибо за помощь по VB

Не решенным осталось получение таким образом параметра GetTaxNum (всегда возвращаеся 0) и даты ККМ через QueryEcrDateTime (число в первых 4-х байтах вижу, все остальное непонятно)
позже посмотрю, потестирую, отпишусь.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение Shtirlic »

посмотрел GetTaxNum и QueryEcrDateTime, да действительно есть проблемы, QueryEcrDateTime думаю в dll как будет немного времени попробую починить, с GetTaxNum сложнее, пока даже не могу обещать.
Аватара пользователя
sergsen
Сообщения: 7
Зарегистрирован: 15 фев 2012, 21:28
Контактная информация:

Re: Меркурий 130 и DrvMercFR.dll: серийный номер

Сообщение sergsen »

Shtirlic писал(а):посмотрел GetTaxNum и QueryEcrDateTime, да действительно есть проблемы, QueryEcrDateTime думаю в dll как будет немного времени попробую починить, с GetTaxNum сложнее, пока даже не могу обещать.
GetTaxNum не очень и критично. На кассе всего 5 вариантов налога и GetTaxNum возвращает их количество, а не анализирует варианты расчета и выборка таковых вообще драйвером не предусмотрена. Перебор из 5 с GetTaxRate дает размер ставки и наименование налога, что и так позволяет выбрать нужную ставку при желании.
QueryEcrDateTime так же смысл имеет только справочный. Гораздо более интересно было бы использовать SynchronazeDateTime, но там, как я понял из исходников, только заглушка.
Еще вот что наблюдается при использовании dll через DynamicWrapperX в 1С77. Касса не каждый раз обрабатывает Connect после Disconnect, возвращая 18 и 3 ошибку. Существенно снизил количество конечных отказов, поставив Connect в цикле из 3-х подключений с отказами. При этом, как ни странно, даже среднее время отклика кассы сократилось.
Да, почему не DynamicWrapperX, а не frole использую. Не вижу возможности в frole программно выводить налоги в чек.
Ответить