0

所以在工作中,我已经为一些不同的事情在 OPOS 驱动程序上工作了几个月。我没有创建这个项目,但我已经接管了它并且是唯一一个开发它的人。所以今天我对它的完成方式感到好奇,我认为它可能一开始就走错了路。我不得不做一些挖掘来发现它使用了一家名为 MCS(Monroe Consulting Services)的公司的 OPOS 驱动程序,我下载了 1.13 并安装了 MSI 版本。我启动了 VS 创建了一个新的 mfc dll。然后我去添加一个类。这就是我感到困惑的地方。

不管我选择 Typelib 还是 ActiveX,它通常都会给我相同的接口列表,我可以从中添加/扩展(除了 MSR 想到的一个例外,它有一个我可以扩展的事件接口)而且它们都制作相同的头文件(在 msr 的情况下是 COPOSMSR.h),但一个扩展 CCmdTarget,另一个扩展 CWnd。这是我的第一个问题。我应该选择哪个?什么是 typelib/什么是 ActiveX 组件,它们之间有何不同。

我一直在研究的扩展 CCmdTarget。对于我的生活,我无法弄清楚驱动程序如何知道使用其中一个文件(USNMSRRFI​​D),但这就是所有开发的地方。(我把它分解了一下,所以它不仅仅是一个大文件)但是那个文件没有扩展 COPOSMSR..它也扩展了 CCmdTarget。我唯一一次看到提到 USN 文件的内容是在 MSRRFI​​D.idl 中(这让我更加困惑)有人对此有清楚的了解吗?

我的一部分认为这可能会在部署时产生非常大的影响。一些使用此驱动程序编写的测试应用程序需要一个有点混乱的设置过程,包括注册不同的驱动程序、将文件复制到特定文件夹、设置注册表等等。我认为,如果我能掌握这一切意味着什么,以及如何制作一个很好的应用程序来正确扩展这些 OPOS 设备之一,那么我可以在未来为自己节省更多的悲伤。

任何提示或指针???对不起,如果这是一个新手问题..但我是 C++ 新手。我从 Java 开始,然后转移到 C#,所以其中一些东西在我头上……

4

1 回答 1

1

好吧,所以我已经完成了大量的挖掘工作,这就像在寻找恐龙一样。不容易,也难找。我最终会写一个很好的小方法,但现在我会提出我的发现。虽然我仍然没有这个 100% 我知道我很接近。

原来 typelib 和 activeX 的东西不是一个大问题,但在你开始之后就会发挥作用。ActiveX 用于控制对象,Typelib 用于服务对象。最重要的是正确开始。我在一些中文网站上找到了一篇文章,在找出翻译错误后提供了一些 OK 提示。首先,您需要使用自动化创建一个 C++ 项目。它可以是 ATL 或 MFC。我的首选是 MFC。在附录 A 第 8 节的 UPOS 1.13 pdf(或更新版本)中,它描述了服务对象的职责。它具有您需要实现的主要方法。您必须添加 16 种方法,以及至少 4 种获取/设置 OPOS 设备属性的方法。

因此,要开始使用,您需要打开添加类向导(用于 MFC 类)并单击添加 MFC 类。你会希望你的基类是 CCmdTarget。想出一个优雅的类名(我选择了 PinpadSOCPP)然后在自动化单选按钮中选择 Creatable by type ID。它应该将您的类型 ID 填写为 [Project Name].[Class name],所以我的是 PinpadSO.PinpadSOCPP。打完。这是一个很好的接口文件,您可以使用类视图向其添加方法等。

至于添加方法,有两件事需要注意,其中之一我还没有 100% 弄清楚。首先是您必须使用正确的参数和返回值来实现该部分中的所有方法。它们中的大多数返回 LONG(32 位有符号数)。两个最常见的参数是 LONG 和 BSTR。(当你有“out”参数时偶尔会有指针)这是我认为我目前失败的部分,因为我不知道我是否正确实施了它们,这就是为什么我得到错误 104/ 305(来自中文文章说我的方法遗漏了一些东西)我不确定它是否区分大小写,我' 我不确定看起来需要获取/设置哪些属性需要实现的 7 个属性,因为我正在工作的 MSR SO 并没有全部使用它们并且 SO 正在工作。另一个是在您实现基本 OPOS 方法之后,您还必须从您的特定 OPOS 设备实现额外的方法。因为我在做 PINPad,所以我必须实现另外 6 种方法。

现在这是一项非常耗时的工作,因为您必须打开类视图,导航到项目类的名称。展开它并转到界面部分。我的项目名称是 PinpadSO,我在其中实现它的文件是 PinpadSOCPP(这意味着接口名称是 IPinpadSOCPP)右键单击 IPinpadSOCPP 并单击添加 > 添加方法。这将带您进入一个两步过程。你填写你的返回值,你的函数名,添加你所有的参数。点击下一步并填写一些帮助字符串信息(如果需要)并点击完成。现在,在您这样做 20 多次之后,它会变得又旧又慢……如果您像我一样键入 Computer 而不是 Compute 和触发器字母,或者忘记点击添加所有参数。一个人可以制作一个不错的小程序来编辑每次添加方法时都会更改的 3 个文件,这将大大加快速度。如果你犯了一个错误,你将需要打开[project name].idl, [class name].h, 和[class name].cpp那些是直接将方法添加到其中的 3 个文件。我建议不要犯错误。

所以现在所有的辛苦工作都已经过去了。编译你的程序。如果你想为自己节省一个额外的步骤,你可以在链接器项目设置中打开自动注册(注意:如果你这样做,如果你在 vista 或更高版本中编程,你需要以管理员身份运行 Visual Studio)这会节省你不必打开命令窗口(管理员)导航到您的 DLL 并在该 DLL 上使用命令 regsvr32。好处是您不必一遍又一遍地这样做,一次就可以了。我没有确凿的事实表明它每次都这样工作,但是我正在处理的 MSR SO,我将对它进行更改,编译它,然后打开我的 OPOS 测试程序,并且更改已经生效。

之后,您需要添加注册表。导航到 HKLM\software\OLEforRetail\ServiceOPOS (注意,如果你有 x64 机器,你会这样做两次。一个在那里,然后在 HKLM\software\Wow6432Node\OLEforRetail\ServiceOPOS

您需要为正在使用的任何 OPOS 设备添加密钥。我正在制作一个密码键盘,所以我制作了一个名为 PINPad 的密钥(检查你的 UPOS 文档,看看你应该给它起什么名字)最后为你的设备选择一个名字。我从供应商那里选择了型号类型作为我的设备名称(C100),并在 PINPad 中创建了一个子密钥。默认 REG_SZ 值需要是您注册的 SO 设备类型 ID。就我而言,它是 PinpadSO.PinpadSOCPP

如果您没有 OPOS 测试程序(我只是自己制作了一个控制台程序),那么您可以使用 Microsoft OPOS 测试应用程序(我无法让它在我的 x64 机器上工作......但也许你'会有更好的运气)如果您决定制作自己的 OPOS 测试应用程序,请确保为 x86 机器编译它(即使您有 x64)OPOS 出于某种原因不喜欢 x64(可能是指针长度我会假设)..无论如何。完成所有设置后,运行您的测试应用程序(就我而言,我只是在运行OPOSPinpadClass pin = new OPOSPinpadClass(); Console.WriteLine(pin.Open("C100"));并希望为 0 :)

我目前得到 104 (E_NOSERVICE) .. 就像我之前所说的,我认为这是因为我的所有方法都不正确。如果事实证明是这样,我将编辑此回复,或者我会报告并说出它的真实情况。任何人,我希望这可以帮助那些决定自己制作 SO 的人。祝你好运

更新

当您调用 Open 命令时,OPOS 会检查几个属性。必须实现的属性之一是 GetPropertyNumber 中的 ,它是PIDX_ServiceObjectVersion. 您需要将此数字设置为返回(1000000 * majorVersion) + (1000 * minorVersion) + revision,因为我正在使 OPOS 1.13 兼容所以我返回的 ServiceObjectVersion 是 1013000。您还需要在 GetPropertyString 中实现 3 个属性:

  • PIDX_DeviceDescription
  • PIDX_DeviceName
  • PIDX_ServiceObjectDescription

对于所有其他值,您可以返回一个空字符串或 0,直到您开始连接所有这些东西。

作为旁注,如果您不想在 C++ 中制作它,则不必这样做。您可以使用任何可以编写 ActiveX 对象的语言来制作它(例如 COM 可见的 .NET 类库)

于 2013-01-01T02:56:17.453 回答