我们在桌面应用程序中使用OPOS驱动程序v 1.11,现在将其迁移到v 1.14。该应用程序在x86体系结构上的较新版本正常工作,但是当编译为x64时,它会为未注册的类抛出运行时错误。第一次尝试初始化对象类的新实例时遇到异常。当调用新实例时,
oPOSPOSPrinter = new OPOSPOSPrinter();
抛出的异常是,
System.Runtime.InteropServices.COMException HResult的0x80040154的= 消息=由于以下错误,检索具有CLSID {CCB90152-B81E-11D2-AB74-0040054C3719}的组件的COM类工厂失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。 来源= mscorlib程序
我们在这里重新启动的dll是32位版本,我们的应用程序是在64位上编译的。
我们尝试通过regsvr32工具注册它,但之后它也会抛出异常。
我们尝试手动将其添加到注册表,但它没有帮助。
我们尝试了两个版本,一个来自默认的OPOS安装目录,另一个来自同一目录中的OposFor.Net文件夹。
那么,我们想问一个如何实现这个目标的解决方案?我们希望在x64架构上迁移我们的应用程序,并支持OPOS v 1.14上OPOS v 1.11的所有当前功能。此外,不久的将来会有64位版本的OPOS驱动程序可用吗?
系统和应用程序信息:操作系统:Windows 10关于IDE:Sun 2017,.No版本:.No 4 + OPOS dll版本:1.14.001
64位进程无法直接在其进程中调用32位库。您需要采用不同的方法与32位库进行通信。
注意:如果通信需要在同一台机器上进行(意味着你的64位应用程序和32位库将在同一台机器上),在这种情况下,前两个选项将是最好的工作。
希望这些信息有所帮助,可以帮助您继续前进。
快乐编码......
UnifiedPOS(包括OPOS)规范仅支持32位。
Download the current version 1.14.1 of UnifiedPOS 第A-1页
OLE for Retail POS(或“OPOS”)的目标包括: - 为基于Win32的POS设备访问定义体系结构。 - 定义一组足以支持一系列POSsolutions的POS设备接口。
第A-3页
CO是标准ActiveX(即OLE 32位)控件,在运行时不可见。
Common CO仅支持32位。 MCS: OPOS Common Control Objects - Current Version
我通过实验创建了支持64位的Common CO,但这是非正式的。 kunif/OPOS-CCO
如果在POS for .NET中使用OPOS作为服务对象,则需要使用32位进行操作。
对于在64位OS中运行的32位exe / dll,相应的注册表数据在WOW6432Node的varius位置分隔。 但是,一些注册表由64/32分隔,一些注册表与64/32相关联,依此类推。
虽然设备供应商可能独立支持64位,但它被认为很少。
以下建议是可能的。
此外: 关于“3.”方法的补充资料如下。
DLL Surrogates DLL Server Requirements Using the System-Supplied Surrogate Writing a Custom Surrogate
不可远程访问的接口(例如最近的OCX的接口)将无法与系统代理一起使用。自定义代理可以使用自己的实现包装DLL的接口,并使用具有远程IDL定义的代理/存根DLL,以允许远程接口。
StackOverflow文章中的Accessing 32-bit DLLs from 64-bit code Accessing 32-bit DLLs from 64-bit code原创文章
How do I make COM Surrogate Multiple Instance? Hosting a .NET DLL as an Out-Of-Process COM Server (EXE) DllSurrogate REGCLS Enumeration