我正在为 .NET 运行 Microsoft POS。我有一个连接到计算机的现金抽屉、条形码扫描仪和收据打印机。使用 Microsoft POS for .NET 测试应用程序,它们都可以正常工作。
我们的应用程序是 IIS 中的 ASP.NET Web 应用程序。因此,我们从 Web 应用程序的服务器端实例化 OPOS 设备,一切正常。自 Windows XP / IIS 5.1 以来,我们一直在这样做。
我们现在正在将我们的部署计算机升级到 Windows 7。我们的开发计算机可以毫无问题地运行此方案。但是,在我目前使用的部署计算机上,我遇到了两个问题:
问题 1)
条形码扫描仪挂在 Open() 方法上。它冻结在那里并且永远不会终止。我发现如果我更改以下文件的权限(对所有人的完全访问权限),扫描仪就会开始工作。
- 符号控制对象-OCX c:\WINDOWS\system32\scanner.ocx
- 服务对象-DLL c:\WINDOWS\system32\stiopos.dll
问题 2)
现金抽屉现在呈现出类似的行为:它冻结在 Claim() 方法上。我已经更改了我能找到的所有文件的权限(甚至加载了 sysinternal 的 Process Explorer)以查找正在使用的文件。这并没有解决问题。
笔记:
- IIS 现在在我的测试中作为 SYSTEM 运行 - 这没有区别。
- 硬件在 Epson OPOS 和 Microsoft POS for .NET 测试工具中运行良好。因此,只有在 Web 应用程序的上下文中运行时才会出现问题。
- 该应用程序使用 c:\program files\OPOS\CommonCO\OPOSCashDrawer.ocx 和 c:\program files\OPOS\Epson2\SoDrw14.dll
你见过这种行为吗?你对如何解决它有什么建议吗?
挂起时的堆栈跟踪:
Microsoft.PointOfService.dll!Microsoft.PointOfService.Legacy.LegacyProxy.InvokeMethod(string methodName = "ClaimDevice", ref object[] parameters, bool[] byRef) + 0x94 bytes
Microsoft.PointOfService.dll!Microsoft.PointOfService.Legacy.LegacyProxy.InvokeMethodAndCheckImpl(string methodName = "ClaimDevice", ref object[] parameters, bool[] byRef) + 0x50 bytes
Microsoft.PointOfService.dll!Microsoft.PointOfService.Legacy.LegacyProxy.Claim(int timeout) + 0x54 bytes
Microsoft.PointOfService.dll!Microsoft.PointOfService.Legacy.LegacyCashDrawer.Claim(int timeout) + 0xd bytes