我很难弄清楚我做错了什么,所以我想我会问这个问题。我正在尝试自动执行测量任务(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暴露了哪些方法和类,我想我可以使用对象浏览器来解决这些问题。谢谢大家!
答案 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位。