因此,在工作中,我已经使用OPOS驱动程序工作了几个月,以处理一些不同的事情。我没有创建该项目,但是我已经接手了它,并且是唯一开发它的人。因此,今天我对它的完成方式感到好奇,我认为它可能以错误的方式开始。我不得不做一些挖掘工作,以发现它使用了来自一家名为MCS(门罗咨询服务)的公司的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#,所以其中一些东西让我望而却步。

最佳答案

好吧,我已经完成了大量的挖掘工作,这就像在寻找恐龙。不容易,很难找到。最后,我将为此写点小技巧,但是现在我将提出我的发现。尽管我仍然没有100%的评分,但我知道我已经接近了。

事实证明,typelib和activeX并不是什么大问题,但是在您开始使用之后就起作用了。 ActiveX用于控件对象,而Typelib用于服务对象。最重要的是正确入门。我在一些中文网站上找到了一篇文章,在找出翻译错误后提供了一些不错的提示。首先,您将需要使用Automation创建一个C ++项目。它可以是ATL或MFC。我的首选是MFC。在附录A第8节中的UPOS 1.13 pdf(或更高版本)中,它描述了服务对象的职责。它具有您需要实现的主要方法。您必须添加16种方法,并且至少有4种方法可以获取/设置OPOS设备的属性。

因此,要开始使用,您将需要打开添加类向导(适用于MFC类),然后单击添加MFC类。您将希望您的基类为CCmdTarget。给出一个经典的Class名称(我选择了PinpadSOCPP),然后在自动化单选按钮中选择Creatable by type ID。它应该将您的类型ID填写为[项目名称]。[类名称],所以我的名称是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和Flip flop字母,或者忘记按添加所有参数。一个人可以编写一个不错的小程序来编辑这3个文件,每次添加一个方法时这些文件都会更改,这将大大加快速度。如果输入有误,则需要打开[project name].idl[class name].h[class name].cpp,这是将方法直接添加到其中的3个文件。我建议不要犯错。

因此,现在所有的辛苦工作都被排除在外了。编译程序。如果要保存自己的附加步骤,则可以在链接器项目设置中打开“自动注册”(注意:如果这样做,则需要在Vista或更高版本中进行编程,并且需要以admin身份运行Visual Studio),这样可以节省您打开命令窗口(admin)的步骤,导航到您的DLL并在该DLL上使用命令regsvr32。令人高兴的是,您不必一遍又一遍地执行此操作,只需一次即可。我没有确凿的事实表明它每次都可以那样工作,但是我正在研究的MSR SO会对其进行更改,编译,然后打开我的OPOS测试器程序,并且所做的更改已生效。

之后,您需要添加注册表。导航到HKLM \ software \ OLEforRetail \ ServiceOPOS
(请注意,如果您有一台x64机器,则将执行两次。一次,然后在HKLM \ software \ Wow6432Node \ OLEforRetail \ ServiceOPOS进行一次)

您需要为正在使用的任何OPOS设备添加密钥。我正在制作一个Pinpad,所以我做了一个称为PINPad的密钥(检查您的UPOS文档以查看应使用的名称)最后选择设备的名称。我从供应商处选择的型号类型作为我的设备名称(C100),并在PINPad中创建了一个子密钥。 REG_SZ的默认值必须是您注册的SO设备TypeID。在我的情况下是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的其他人有所帮助。祝好运

更新

调用“打开”命令时,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类库)来编写它。

关于c++ - MFC为OPOS添加Typelib或ActiveX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14049468/

10-11 16:53