-1

我一直在扯我的头发。我有一个我编写的 C++ OPOS 驱动程序。我用 C# 编写了一个虚拟密码键盘。它有效,一切都很好。

不过,给我的一个要求是 C# 驱动程序必须与调用程序一起出现。这需要一段时间才能弄清楚,因为我们期望它必须是 OPOS 驱动程序所在的位置。让我觉得我在设置它时做错了什么。

我知道这很模糊,并且需要更多信息,但我不知道从哪里开始,或者您需要哪些信息来帮助您解决这方面的问题。我会经常检查并回答任何问题....啊,我讨厌这样含糊不清..请不要发火:)我会根据需要进行编辑。

编辑

很抱歉没有很好地表达这一点。当我写这篇文章时,我发生了很多事情。我自己重新阅读它并在想“NEWB!” 哈。

好吧,如此低落和肮脏。问题不在于 COM 驱动程序,而在于 C# 虚拟键盘。总结一下我要说的是为什么我的 C# 虚拟 pinpad dll 必须与我的可执行文件位于同一位置,而不是与我注册的 UPOS 驱动程序位于同一位置?

所以要详细说明。驱动程序有效(前提是我不会再搞砸了)。正如所指出的,任何程序都必须注册它才能使用它。一切都很好。我们将与此 UPOS 驱动程序相关的所有必要文件放在同一个文件夹中。有一次,我们有一个内置在 UPOS 驱动程序中的 C++ 虚拟密码键盘,但为了简单起见,我决定只制作一个 COM 可见的 C# 虚拟密码键盘会更快、更容易。在大多数情况下,它是。这很好,因为如果我进行任何图形更改,我可以替换 VPP.dll 并且生活很好。然后我在电脑上安装了这组驱动,当我试图打开VPP时它会崩溃。出于绝望,我开始复制VPP。dll到不同的位置,发现当我把它放在与执行程序相同的位置时,它就会开始工作。这不是我想要的。我希望能够将它与我的其他驱动程序放在同一目录中。(因环境而异,但通常位于“程序文件”文件夹中)这让我回到了上面总结的问题。令人难以置信的是,我的 UPOS 驱动程序是发出 COM 调用的驱动程序。当我进行安装时,我的安装部分是将 VPP.dll 放入 Program Files 文件夹并在其上运行 regasm(这表示它是成功的)。因此,它必须与正在执行的程序一起使用,这让我感到难以置信。哦,它需要位于集中位置的另一个原因是我们在不同的位置安装了一些不同的程序(确切地说是 4 个)。人为错误就是我不想将 VPP.dll 复制到每台计算机上可能的 4 个位置。(最终将达到 500 左右)

所以现在我澄清了,(实际上问了一个问题……对此感到抱歉),我们有什么建议吗?

4

2 回答 2

1

因此,您有一个实现 OPOS 接口的 DLL(.net 程序集)。OPOS 接口按规范是一个 COM 对象(OPOS 代表 POS 的 Ole)。

我怀疑这是您的要求:使用您的驱动程序的应用程序,无论是本机的还是托管的,都必须能够通过 CoCreateInstance 实例化您的对象。为此,您的设备必须在 Windows 注册表中注册。请参阅下面的示例以了解如何执行此操作:

注意:您应该知道,称为 UPOS(通用 POS)的新标准已经开发出来,并且 Microsoft“.NET for POS”已经支持它,它也向后兼容 OPOS。

编辑(在问题中进行编辑之后):
因此,您的 VPP 似乎是一个 COM 对象,并且您有程序以某种方式注册它,即它可以从任何不是当前目录的文件夹中进行 CoCreatable。我怀疑它的注册有问题。确保您的 COM 对象有一个 Porgram ID 和一个唯一的 CLSID。签出注册​​表中HKCR\CLSID\<your object class id&>HKCR\<your object progid>. 将 UPOS 和应用程序放在一边一分钟。只需确保一个简单的 JavaScript 文件 (xxx.js) 行:var x = new ActiveXObject(<your prog id>)在从任何文件夹执行脚本时都可以工作。

于 2012-10-31T21:49:55.753 回答
1

这种问题是 Windows(或 CLR,不清楚)定位依赖 DLL 的方式的自然结果。COM 服务器的注册只提供实现该服务器的 DLL 的路径。它不会影响依赖 DLL 的搜索路径。

如果这是本机(非 .NET)DLL,则 Windows 搜索:

  • 加载 EXE 的目录
  • (可选)调用 SetDllDirectory() 指定的目录
  • Windows系统目录,默认为c:\windows\system32
  • 16位遗留系统目录,默认为c:\windows\system
  • Windows 目录,默认为 c:\windows
  • 进程的默认工作目录
  • PATH 环境变量中列出的目录

如果这是一个 .NET DLL,则 CLR 搜索:

  • 海关总署
  • 加载 EXE 的目录
  • <probing>(可选)由app.exe.config 文件中的元素指定的探测路径。

很明显,如果相关的 DLL 位于 EXE 目录中,您将没有问题。如果您想在其他地方使用它,那将是一个非常讨厌的东西。从上面的列表中选择一个。

于 2012-11-02T14:29:27.167 回答