Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指定从位置运行的COM对象_C#_C++_Dll_Com Object - Fatal编程技术网

C# 指定从位置运行的COM对象

C# 指定从位置运行的COM对象,c#,c++,dll,com-object,C#,C++,Dll,Com Object,我一直在为这件事发愁。我有一个C++ opOS驱动程序,我写的。我用C#写了一个虚拟键盘。它起作用了,一切都很好 不过,我收到的一个请求是,C#驱动程序必须与调用程序一起出现。这花了一段时间才弄清楚,因为我们期望它必须在OPOS驱动程序所在的位置。让我觉得我做了错事 我知道这是模糊的,需要更多的信息,但我不知道从哪里开始,也不知道在这方面你需要什么信息来帮助。我会经常登记并回答任何问题。。。。呃,我讨厌这么含糊。。请不要激动:)我会根据需要编辑 编辑 很抱歉,这句话用得不太好。我写这篇文章时有很

我一直在为这件事发愁。我有一个C++ opOS驱动程序,我写的。我用C#写了一个虚拟键盘。它起作用了,一切都很好

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

我知道这是模糊的,需要更多的信息,但我不知道从哪里开始,也不知道在这方面你需要什么信息来帮助。我会经常登记并回答任何问题。。。。呃,我讨厌这么含糊。。请不要激动:)我会根据需要编辑

编辑

很抱歉,这句话用得不太好。我写这篇文章时有很多事情要做。我自己重新读了一遍,心里想着“新手!”哈

好吧,那就下身脏兮兮的。问题不在于COM驱动程序,而在于C#virtual pinpad。总而言之,我要说的是,为什么我的C#虚拟pinpad dll必须与我的可执行文件位于同一位置,而不是与我注册的UPOS驱动程序位于同一位置

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

现在,我已经澄清了(实际上问了一个问题..很抱歉),我们有什么建议吗?

那么,您有一个实现OPOS接口的DLL(.net assembly)。OPOS接口是一个COM对象(OPOS代表POS的Ole)

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

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


编辑(在问题中进行编辑):
因此,您的VPP似乎是一个COM对象,并且您的程序以一种可以从非当前目录的任何文件夹中共同创建的方式对其进行注册。我怀疑它的注册有问题。确保COM对象具有Porgram ID和唯一的CLSID。在注册表中同时签出
HKCR\CLSID\
HKCR\
。将UPO和应用程序放在一边一分钟。只要确保在从任何文件夹执行脚本时,一个简单的JavaScript文件(xxx.js)行:
var x=new ActiveXObject()
能够正常工作。

这种问题是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的目录
  • (可选)由app.exe.config文件中的
    元素指定的探测路径

因此,如果依赖DLL位于EXE目录中,显然您不会有问题。如果你想把它放在别的地方,那是一个相当讨厌的地方。从上面的列表中选择一个。

你的问题是什么?我已经读了三遍了,我不知道你在问什么。是的,很抱歉。我编辑了我的文章,所以这次它实际上有一个问题,我详细阐述了:)你在这方面是非常正确的。你说的话我都会做。问题更多地在于C代码,这是一个不安全的虚拟pinpad。谢谢你帮我澄清。我将调查GAC(因为我不知道它是什么),