C++ MFC为OPOS添加类型库或ActiveX

C++ MFC为OPOS添加类型库或ActiveX,c++,mfc,activex,typelib,opos,C++,Mfc,Activex,Typelib,Opos,所以在工作中,我已经在OPOS驱动程序上工作了几个月,做了一些不同的事情。我没有创建这个项目,但我已经接管了它,并且是唯一一个开发它的人。因此,今天我对它的运作方式感到好奇,我认为它可能一开始就走错了路。我不得不做一些挖掘,以发现它使用了一家叫做MCS(梦露咨询服务)的公司的OPOS驱动程序。我下载了1.13并安装了MSI版本。我启动VS创建了一个新的mfc dll。然后我去添加一个类。这就是我困惑的地方 无论我选择Typelib还是ActiveX,它通常会给我相同的接口列表,我可以从中添加/扩

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

无论我选择Typelib还是ActiveX,它通常会给我相同的接口列表,我可以从中添加/扩展(MSR有一个例外,它有一个事件接口,我可以扩展),它们都会生成相同的头文件(在MSR中是COPOSMSR.h),但有一个扩展了CCmdTarget,另一个扩展CWnd。这是我的第一个问题。我应该选择哪一个?什么是类型库/什么是ActiveX组件以及它们之间的区别

我一直在做的那个扩展了CCmdTarget。就我的一生而言,我无法理解驱动程序如何知道如何使用其中一个文件(USNMSRRFID),但这就是所有开发工作的出发点。(我把它分解了一点,所以它不仅仅是一个大文件)但是这个文件并没有扩展COPOSMSR..它也扩展了CCmdTarget。我唯一一次看到提到USN文件的东西是在MSRRFID.idl中(这让我更加困惑),有人对此有清晰的认识吗

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


有什么建议吗???对不起,如果它是一个新的问题……但我是新的C++。我从Java开始,然后转到C语言,所以有些东西我想不起来了……

好吧,我做了很多挖掘工作,就像在寻找恐龙一样。不容易,也很难找到。最后,我将写一篇关于如何解决这个问题的文章,但现在我将公布我的发现。虽然我还没有达到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%弄清楚。首先,您必须使用正确的参数和返回值实现该部分中的所有方法。其中大多数返回长(32位有符号数)。最常见的两个参数是LONG和BSTR。(当你有“out”参数时,偶尔会有一些提示)这是我认为我目前失败的部分,因为我不知道我是否正确地实现了它们,这就是为什么我得到错误104/305(从中文文章中可以看出,我在我的方法中遗漏了一些东西)我不确定它是否区分大小写,我不确定7个属性是否需要get/set,哪些属性需要实现,因为我在工作中使用的MSR并没有全部使用它们,所以正在工作。另一个是,在实现基本OPOS方法之后,还必须从特定的OPOS设备实现额外的方法。因为我在做PINPad,所以我还需要实现另外6种方法

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

所以现在所有的努力