我正在实施新的财务设备。并且它使用OPOS / UPOS库进行通信。我是#r "Newtonsoft.Json"
using System.Net;
using microsoft.AspNetCore.Mvc;
using microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.IO;
using System.Collections.Generic;
public static void Run(HttpRequest req,Stream inputBlob,ILogger log)
{
StreamReader reader = new StreamReader(inputBlob);
string oldContent = reader.ReadToEnd();
log.LogInformation($"oldContent:{oldContent}");
}
的新手,完全没有C的经验。但是,大多数情况下,我设法使它起作用。
但是我在从通用方法ctypes
返回字符串时遇到问题。文档说:“此命令应在EndFiscalreceipt()之后立即使用,以检索最新收据的唯一ID”
“参数: –数据[输入] 忽略了。 –对象[输入/输出] 要读取的值。”
并在其下添加.NET示例:
DirectIO
第一个参数(CMD_EKASA_RECEIPT_ID)是执行的命令,这就是为什么它不在上面列出的原因。
但是,python不是.NET,而且我从未使用过.NET。
我一直按照ctypes doku()中的说明进行操作,违抗此方法的参数并返回init:
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"
我们尝试了不同的方法来检索回复字符串,但是在我的情况下,这两种方法都不起作用:
self.libc.DirectIO.argtypes = [ctypes.c_int32,ctypes.c_int32,ctypes.c_char_p]
self.libc.DirectIO.restype = ctypes.c_char_p
我创建的字符串对象在校准Cmethod之后始终为空,也就是s = ""
c_s = ctypes.c_char_p(s)
result = self.send_command(CMD_EKASA_RECEIPT_ID,c_s)
p = ctypes.create_string_buffer(40)
poin = ctypes.pointer(p)
result = self.send_command(CMD_EKASA_RECEIPT_ID,poin)
p = ctypes.create_string_buffer(40)
result = self.send_command(CMD_EKASA_RECEIPT_ID,p)
s = ctypes.create_string_buffer('\000' * 32)
result = self.send_command(CMD_EKASA_RECEIPT_ID,s)
,就像我创建它一样。
但是,还有一件事对我来说没有意义。我的同事向我展示了如何查看方法参数并在头文件中返回。对于这个,有这个:
""
这意味着它返回整数?如果我没记错的话。
所以,我的想法是,我必须将指向在python中创建的字符串的指针传递给该方法,然后C会将其更改为我应该阅读的内容。因此,我认为我对解决方案的思考方式是正确的。
我也尝试过这种方法,但是https://docs.python.org/2.7/library/ctypes.html
对我也不起作用,我开始感到绝望。不确定我是否正确理解了问题,并且寻找解决方案的正确位置。