Я работаю над внедрением нового фискального устройства. И он использует библиотеку OPOS / UPOS для общения. Я очень плохо знаком с ctypes
и совсем не имею опыта работы с Си. Тем не менее, мне удалось заставить его работать, в основном.
Но у меня возникают проблемы с возвратом строки из универсального метода DirectIO
. Документация гласит: «Эта команда должна использоваться сразу после EndFiscalReceipt () для получения уникального идентификатора последней квитанции"
"Параметры: - Данные [in] игнорируются. - Obj [in / out] Значение для чтения. "
и добавляет к нему пример .NET:
int iData = 0;
string strReferenceID = "";
fiscalPrinter.EndFiscalReceipt();
fiscalPrinter.DirectIO(CMD_EKASA_RECEIPT_ID, ref iData, ref strReferenceID);
// strReferenceID will contain latest receipt ID, e.g. "O−7DBCDA8A56EE426DBCDA8A56EE426D1A"
первый параметр (CMD_EKASA_RECEIPT_ID) - это выполненная команда, поэтому она не указана выше.
Однако python не является .NET, и я никогда не работал с .NET.
Я следовал инструкциям в ctypes doku (https://docs.python.org/2.7/library/ctypes.html), защищаю аргументы этого метода и возвращаюсь в init:
self.libc.DirectIO.argtypes = [ctypes.c_int32, ctypes.c_int32, ctypes.c_char_p]
self.libc.DirectIO.restype = ctypes.c_char_p
Чем пытались получить разные способы получения строки ответа, но в моем случае ни один из них не работает:
s = ""
c_s = ctypes.c_char_p(s)
result = self.send_command(CMD_EKASA_RECEIPT_ID, 0, c_s)
p = ctypes.create_string_buffer(40)
poin = ctypes.pointer(p)
result = self.send_command(CMD_EKASA_RECEIPT_ID, 0, poin)
p = ctypes.create_string_buffer(40)
result = self.send_command(CMD_EKASA_RECEIPT_ID, 0, p)
s = ctypes.create_string_buffer('\000' * 32)
result = self.send_command(CMD_EKASA_RECEIPT_ID, 0, s)
созданный мною строковый объект всегда пуст, иначе ""
после вызова Cmethod, точно так же, как я его создал.
Однако есть еще одна вещь, которая не имеет смысла для меня. Мой коллега показал мне, как вы можете видеть аргументы метода и возвращаться взаголовок файл. Для этого есть:
int DirectIO(int iCommand, int* piData, const char* pccString);
Что означает, что он возвращает целое число? Если я не ошибаюсь.
Итак, я думаю, что я должен передать методу какой-то указатель на строку, созданную в python, и C изменит ее на то, что я должен прочитать. Таким образом, я думаю, что мой подход к решению правильный.
Я также пробовал этот подход, но он мне тоже не подходит Как передать указатель обратно в ctypes?
и я начинаю чувствовать отчаяние. Не уверен, правильно ли я понимаю проблему и ищу решение в нужном месте.