COM对象访问C#中的问题

时间:2011-01-12 17:12:27

标签: c# com

我很难弄清楚我做错了什么,所以我想我会问这个问题。我正在尝试自动执行测量任务(Qualcomm QXDM),因此希望访问由测量工具公开的COM接口。我编写了以下python代码,完美无缺:

from comtypes.client import CreateObject  
QXDM = CreateObject("QXDM.Application")
IQXDM2 = QXDM.GetIQXDM2
...

现在,我正在尝试重写这是C#,因为我有一些特定的要求。这是我试过的:

using QXDM;
QXDM2Class IQXDM = new QXDM2Class();

但是当我尝试运行时,我得到了:

Retrieving the COM class factory for component with CLSID {6777AAE0-D9D2-4EA7-996B-0EECC68F97D8} failed due to the following error: 80040154.

我做错了什么?我可以在Visual Studio的对象浏览器中看到QXDM提供的所有方法和接口。

编辑:看起来像后期绑定是汉斯建议的唯一方法。我将代码修改为以下内容:

Type QXDM = Type.GetTypeFromProgID("QXDM.Application");
Object QXDMObject = Activator.CreateInstance(QXDM);

这很有效。唯一的麻烦是我需要知道QXDM暴露了哪些方法和类,我想我可以使用对象浏览器来解决这些问题。谢谢大家!

5 个答案:

答案 0 :(得分:2)

你的代码不一样。在Python代码中,您显然使用了常见的“Application”对象。在许多自动化对象模型中,这是您创建其他对象模型的对象。与GetIQXDM2()方法中的IQXDM2类似。

您的C#代码似乎正在尝试创建直接实现IQXDM2的类。无法工作,您必须通过应用程序界面。就像错误消息所说的那样,该对象没有“类工厂”,Application接口会创建它。无论它叫什么,它几乎总是在名称中有“应用”。在互操作引用上使用对象浏览器进行查看。寻找具有GetIQXDM2方法的那个。

如果您没有看到类似的内容,那么您可能添加了错误的DLL。在注册表中查找正确的名称。启动Regedit.exe并查看HKCR \ QXDM.Application。你会发现一个带有guid的CLSID密钥。然后看看HKCR\Clsid\{guid} {guid}是你发现的guid。 InprocServer32密钥具有DLL名称。进程外服务器使用LocalServer32密钥。

如果这没有成功,那么COM服务器可能只是由脚本语言使用。很不寻常,但它可能发生。在这种情况下,您必须在C#代码中使用它。这对C#4.0 动态关键字或VB.NET

来说很容易

答案 1 :(得分:1)

可能是DLL依赖于其他DLL的事实。使用ProcExp(http://www.sysinternals.com/)进行调试可能会有所帮助

答案 2 :(得分:1)

我认为COM对象已注册正常,或者您的Python代码将失败,您将无法在计算机上看到它们。如果是这种情况,您的问题是从C#访问COM对象。尝试指定here的方法。

  

如果图书馆已经注册,   您可以执行以下步骤   让Visual Studio生成一个互操作   为你装配

答案 3 :(得分:0)

HRESULT 0x80040154表示未注册COM类。尝试在COM dll上运行regsvr32

答案 4 :(得分:0)

可能是你正在构建64位。检查您的平台目标。确保它是32位。