对于与遗留 POS 应用程序的一些互操作,我想知道是否可以在 C# 中实现一个虚假的 OPOS 设备。
基本上我会实现一个假键盘,它接受网络请求并将按键传递给遗留应用程序。
有谁知道这是否可能或从哪里获得文档?我认为 OPOS 只是调用由注册表项配置的 COM 对象。所有这些都应该可以在 C# 中实现。
是的,这当然是可能的。
您可以开发一个 OPOS SO(服务对象),它实现了 C# 中 OPOS 所期望的 COM 接口。然后,这可以以您想要的任何方式实现 API。
我建议你从http://monroecs.com/oposccos.htm下载 Curtiss Monroe 的 OPOS Common Control Objects 。
这将为您提供您需要为您的服务对象实现的类型库,并且可能有一些指向 OPOS 文档的链接。注意我认为 OPOS 使用后期绑定,因此您需要实现双接口。
一个警告:恕我直言 OPOS 在技术上是一个可怕的 API,由委员会外围设备供应商设计,以公开其外围设备的功能,而不是为 POS 应用程序开发人员提供有用的抽象。
一个特别引人注目的例子是所谓的 ToneIndicator 设备,它展示了富士通键盘中音调发生器的功能,可以发出不同音高和音量的两种音调的重复序列。
更新
我之前实现过 OPOS 服务对象,但是已经很久了。这里有更多信息可以帮助您开始使用 POSKeyboard SO。
控制对象 (CO) 将使用后期绑定加载您的服务对象 (SO)。所以实际上没有您实现的 COM IID 或类型库。相反,您需要实现在相应版本的 OPOS 规范中定义的所有必需的方法和事件(例如,此页面上的文档之一:http: //monroecs.com/oposreleases.htm)。以下信息基于此页面上链接的 1.6 控制程序员指南 (CPG)。
CPG 的第 2 章描述了您需要实施的内容。请注意,OPOS 使用一种奇怪的方法来获取/设置属性。虽然控制对象 (CO) 公开具有合理名称的属性(例如 DeviceEnabled、DeviceName、DeviceDescription),但这些都调用相同的方法 GetPropertyString(用于字符串属性)或 GetPropertyNumber(用于整数属性),将整数“属性索引”传递为定义要检索的属性的参数。“属性索引”都在 OPOS 标准提供的头文件中定义。
快速浏览一下 CCO PosKeyboard 源代码,您需要实现的方法名称在源文件 POSKeyboardImpl.cpp 的 s_SOMethodNames 中列出。
您需要设置的注册表项在 OPOS 应用程序程序员指南 (APG) 附录“OPOS 注册表使用”中定义。在您的情况下,您将需要创建一个注册表项 HKLM\OleForRetail\ServiceOPOS\POSKeyboard\DefaultPOSKeyboard (其中 DefaultPOSKeyboard 是您传递 Open 方法的设备名称)。此注册表项需要有一个默认值,即您的 SO 类的 ProgId。您还可以在那里存储其他值(例如,您的 SO 使用的配置信息)。
祝你好运——这将是一个痛苦的过程,有很多 WTF。