.NET 条码扫描器 DeviceEnabled 的 POS 设置失败
POS for .NET Barcode scanner DeviceEnabled failed to set
我目前正在开发一个 .NET 4.5.1 应用程序,它应该使用条形码扫描仪来读取二维条形码文本。为此,安装并使用了 Microsoft POS for .NET 1.14.1。 barcode sanner (Intermec/Honeywell ED40)驱动安装正确,OPOS驱动是非托管OCX。
我使用典型的工作流程在 WinForms 项目中创建扫描仪实例:
public partial class MainForm : Form
{
private PosExplorer _explorer;
private Scanner _scanner;
public MainForm()
{
InitializeComponent();
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
_explorer = new PosExplorer(this);
DeviceInfo device = myPosExplorer.GetDevice(DeviceType.Scanner, "Intermec_RS-232_Scanner");
_scanner = (Scanner)explorer.CreateInstance(device);
_scanner.Open();
_scanner.Claim(1000);
_scanner.DataEvent += scanner_DataEvent;
_scanner.ErrorEvent += scanner_ErrorEvent;
_scanner.DeviceEnabled = true; // throws here if normal user privileges
_scanner.DataEventEnabled = true;
_scanner.DecodeData = true;
}
}
如果使用管理权限启动应用程序,一切正常。但是,如果使用普通用户权限启动,则无法启用扫描仪。执行scanner.DeviceEnabled = true
语句时,抛出如下异常:
PosControlException: Failed to set property DeviceEnabled.
如果我编译并启动提供的 Microsoft 示例 "Microsoft POS Tester",也会出现同样的问题。但是还提供了预编译版本 "C:\Program Files (x86)\Microsoft Point Of Service\SDK\Samples\Sample Application\TestApp.exe" 目录,独立于权限。
我没有在不同的论坛和 POS for .NET 文档中找到解决方案。我用 ActiveX 的 Internet Explorer 安全设置做了几个实验,同样的问题。我想,这是其他地方的安全设置,有人知道吗?
环境:
- Windows 7 专业版 x64
- .NET 4.5.1
谢谢。
编辑:
几个小时后,我找到了原因,是注册表虚拟化。制造商的 OPOS 驱动程序 (OCX) 尝试写入 HKLM/Software/Wow6432Node/Intermec 子项。因此,写访问被虚拟化为 HKEY_USERS/[User SID]_Classes/VirtualStore/Machine/Software/Wow6432Node/Intermec。但是虚拟商店中的密钥不完整,缺少许多值。
解法:
- 删除虚拟商店中的HKEY_USERS/[User SID]_Classes/VirtualStore/Machine/Software/Wow6432Node/Intermec键。
- 将 完全访问权限 权限分配给原始 [=64= 的 Windows Users 组]键。因此,所有用户都访问相同的注册表项。
问题已解决,见我上面的编辑。
我目前正在开发一个 .NET 4.5.1 应用程序,它应该使用条形码扫描仪来读取二维条形码文本。为此,安装并使用了 Microsoft POS for .NET 1.14.1。 barcode sanner (Intermec/Honeywell ED40)驱动安装正确,OPOS驱动是非托管OCX。
我使用典型的工作流程在 WinForms 项目中创建扫描仪实例:
public partial class MainForm : Form
{
private PosExplorer _explorer;
private Scanner _scanner;
public MainForm()
{
InitializeComponent();
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
_explorer = new PosExplorer(this);
DeviceInfo device = myPosExplorer.GetDevice(DeviceType.Scanner, "Intermec_RS-232_Scanner");
_scanner = (Scanner)explorer.CreateInstance(device);
_scanner.Open();
_scanner.Claim(1000);
_scanner.DataEvent += scanner_DataEvent;
_scanner.ErrorEvent += scanner_ErrorEvent;
_scanner.DeviceEnabled = true; // throws here if normal user privileges
_scanner.DataEventEnabled = true;
_scanner.DecodeData = true;
}
}
如果使用管理权限启动应用程序,一切正常。但是,如果使用普通用户权限启动,则无法启用扫描仪。执行scanner.DeviceEnabled = true
语句时,抛出如下异常:
PosControlException: Failed to set property DeviceEnabled.
如果我编译并启动提供的 Microsoft 示例 "Microsoft POS Tester",也会出现同样的问题。但是还提供了预编译版本 "C:\Program Files (x86)\Microsoft Point Of Service\SDK\Samples\Sample Application\TestApp.exe" 目录,独立于权限。
我没有在不同的论坛和 POS for .NET 文档中找到解决方案。我用 ActiveX 的 Internet Explorer 安全设置做了几个实验,同样的问题。我想,这是其他地方的安全设置,有人知道吗?
环境:
- Windows 7 专业版 x64
- .NET 4.5.1
谢谢。
编辑:
几个小时后,我找到了原因,是注册表虚拟化。制造商的 OPOS 驱动程序 (OCX) 尝试写入 HKLM/Software/Wow6432Node/Intermec 子项。因此,写访问被虚拟化为 HKEY_USERS/[User SID]_Classes/VirtualStore/Machine/Software/Wow6432Node/Intermec。但是虚拟商店中的密钥不完整,缺少许多值。
解法:
- 删除虚拟商店中的HKEY_USERS/[User SID]_Classes/VirtualStore/Machine/Software/Wow6432Node/Intermec键。
- 将 完全访问权限 权限分配给原始 [=64= 的 Windows Users 组]键。因此,所有用户都访问相同的注册表项。
问题已解决,见我上面的编辑。