在 C# 中实现 OPOS 设备

2024-03-18

对于与旧版 POS 应用程序的某些互操作,我想知道是否可以在 C# 中实现虚假的 OPOS 设备。

基本上我会实现一个假键盘,它接受网络请求并将按键传递给遗留应用程序。

有谁知道这是否可能或在哪里可以获得文档?我认为 OPOS 只是调用由注册表项配置的 COM 对象。所有这些都应该可以用 C# 实现。


是的,这当然有可能。

您可以开发一个 OPOS SO(服务对象),它在 C# 中实现 OPOS 所需的 COM 接口。然后可以按照您想要的任何方式实现 API。

我建议您从以下位置下载 Curtiss Monroe 的 OPOS 通用控制对象http://monroecs.com/oposccos.htm http://monroecs.com/oposccos.htm.

这将为您提供为服务对象实现所需的类型库,并且可能有一些 OPOS 文档的链接。注意:我认为 OPOS 使用后期绑定,因此您需要实现双重接口。

需要注意的是:恕我直言,OPOS 在技术上是一个糟糕的 API,由外围设备供应商委员会设计,目的是公开其外围设备的功能,而不是为 POS 应用程序开发人员提供有用的抽象。

一个特别引人注目的例子是所谓的 ToneIndicator 设备,它展示了富士通键盘中音调发生器的功能,可以重复发出两种不同音高和音量的音调序列。

UPDATE

我之前已经实现过OPOS服务对象,但是已经很久了。这里有一些更多信息可以帮助您开始使用 POSKeyboard SO。

  • 控制对象 (CO) 将使用后期绑定加载您的服务对象 (SO)。因此实际上您没有实现任何 COM IID 或类型库。相反,您需要实现适当版本的 OPOS 规范中定义的所有必需方法和事件(例如本页上的文档之一:http://monroecs.com/oposreleases.htm 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中实现 OPOS 设备 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐