c# - 实现用于捕获打印文本的 OPOS 打印机服务对象

标签 c# com opos pos-for-.net

我们正在尝试为 POS 应用程序创建类似于打印机驱动程序包装器的东西,这将使我们能够捕获打印的收据,然后再次将其转发给原始打印机。

到目前为止,我们在“POS for .Net”之上实现了一个作为服务对象的服务对象,它工作得非常好,但事实证明,一些遗留 POS 应用程序只支持 OPOS。为了支持它们,我们必须使我们的“POS for .Net”服务对象可用作 OPOS 服务对象,或者我们必须使用 CCO 编写我们自己的 OPOS 服务对象。

我的问题是:

  • 在这些遗留 POS 应用程序中,甚至可以使用我们的 POS for .Net 解决方案吗? (如果是,怎么做?)
  • 如何构建 OPOS 服务对象?是否可以使用 .Net 框架(例如 C#)?
  • 我们做的对吗?有没有更好的方法来获取收据(尤其是对于这些遗留应用程序)?

最佳答案

问)在这些遗留 POS 应用程序中,甚至可以使用我们的 POS for .Net 解决方案吗? (如果是,怎么做?)

A) 不,这些应用程序不使用 POS for .Net 库,也不使用 POS for .Net 注册表项搜索服务对象,这些应用程序仅使用 OPOS(OLE POS) 注册表项进行搜索对于已注册的服务对象,通常调用 CCO,CCO 又调用服务对象。

Q) 如何建立一个OPOS服务对象?它可以使用 .Net 框架(例如 C#)吗?

A) 是的,它可以使用 .Net 来完成,但是你需要将它公开为一个 COM 库,一个好方法是在 CCO 中实现接口(interface),每个设备都有一个 DLL,引用那个您需要的设备,实现它的接口(interface),并将您的类型标记为 COM 可见,添加一个 GUID 和一个 ProgId,使用 regasm “path”/register/codebase/tlb 命令,添加所需的注册表项——可以在 UPOS 规范\开发指南文档中找到——然后你就完成了,或者至少我是这么想的,你会得到一个错误,指出你的方法缺失正确运行它所需的服务对象,好吧,我发现这很困难,但是有 7 个方法没有在接口(interface)中引用——尽管在 UPOS 规范\开发指南文档中被引用——这些方法是:

  1. COFreezeEvents:与属性 FreezeEvents 相同。
  2. GetPropertyNumber:用于通过属性的索引获取数字\ bool 属性的值,稍后会详细介绍。
  3. SetPropertyNumber:用于通过属性的索引设置数字\ bool 属性的值,稍后会详细介绍。
  4. GetPropertyString:用于通过属性的索引获取字符串属性的值,稍后会详细介绍。
  5. SetPropertyString:用于通过属性的索引设置字符串属性的值,稍后会详细介绍。
  6. OpenService:同方法open。
  7. CloseService:同方法close。

实现这些方法后一切正常,这很奇怪,因为 CCO 接口(interface)中没有引用任何方法,但是正如我所说的,这些方法中的每一个都在 UPOS 规范中被引用并且有完整的描述。

似乎 OpenService 和 CloseService 方法存在的原因是,当 CCO 库作为 com 实现时,Open 和 Close 方法名称不合适,必须更改为 OpenService 和 CloseService,同样适用于 Claim 和 Release使用新名称 ClaimDevice 和 Release Device – 但是这些在接口(interface)中正确公开,至于其余方法我找不到原因。

Get\Set 属性方法

这 4 个方法用于访问对象中的所有属性,为什么?我不确定,但似乎应该从 Dispatch 接口(interface)使用这些来访问您的对象,为什么默认情况下该接口(interface)不可用? C++ 服务对象是否以相同的方式实现?我没有答案。

要以正确的方式实现这些,应该查看 OPOS 安装下的 Include 目录 – CCO 安装 – 并检查 *.hi 文件,主要是 Opos.hi 和 OposPtr.hi(取决于设备,在我们的例子中是打印机),您会看到这些包括 CCO 的常量,如成功或失败的枚举,以及对于这 4 种方法的属性索引和设备索引偏移量。

使用 OPOS 常量中的数字,您只需打开 PropIndex 参数值,并获取\设置正确的属性值。

    if (PropertyIndexHelper.IsStringPidx(PropIndex))
    {
        switch (PropIndex)
        {
            case PropertyIndexHelper.PIDX_CheckHealthText:
                return _physicalPrinter.CheckHealthText;

            case PropertyIndexHelper.PIDX_DeviceDescription:
                return _physicalPrinter.DeviceDescription;

            case PropertyIndexHelper.PIDX_DeviceName:
                return _physicalPrinter.DeviceName;
                                  .
                                  .
                                  .
                                  .
                                  .

关于c# - 实现用于捕获打印文本的 OPOS 打印机服务对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15632453/

相关文章:

c# - Angular 6 Asp.Net(非核心)Web Api CORS 请求失败

c# - 事件目录 : find details of users in group without mass search

c++ - 错误 0x80010108(调用的对象已与其客户端断开连接)的可能原因是什么?

c# - 如何在 .NET 中承载无窗口 ActiveX 控件

x86 - OPOS 库 v1.14 无法按预期使用 .net 的 x64 版本

c# - POS for .NET - 我的 C# 程序显示 "Microsoft LineDisplay Simulator"中的文本,而不是实际显示

delphi - 在 Delphi 中使用 OPOS 驱动程序检查打印机消息

c# - FluentValidation:仅验证设置了一个属性

c# - 如何正确更新 DataGridView,这样 GUI 就不会卡住

java - 远程和动态代理