【问题标题】:AxImp Generated ReferenceAxImp 生成的参考
【发布时间】:2010-10-05 20:37:48
【问题描述】:

我最近一直在处理一个需要 3 个 ActiveX 控件的 C#/VS2008 项目。我使用AxImp.exe 为控件创建了一个.NET 包装器,并将它们添加为对我的项目的引用。代码已经运行了几天,没有任何问题。

昨天,我从我们的版本控制服务器中提取了一个干净的版本(包括包装 DLL,但不包括 ActiveX 控件本身),当我尝试运行该程序时,我得到一个 COMResultExceptionHRESULT = REGDB_E_CLASSNOTREG(0x80040154) 期间父窗体的InitializeCompnent 调用。

有什么线索可以说明是什么原因造成的吗?

【问题讨论】:

    标签: c# .net visual-studio-2008 activex


    【解决方案1】:

    不确定“干净版本”是什么意思,但显然互操作库中的 GUID 不再与 ActiveX 控件使用的 GUID 匹配。结果得到0x80040154,找不到ActiveX注册表项。

    控制构建过程并使 ActiveX 控件与互操作包装器保持同步非常重要,否则您将长期与这个问题作斗争。生成它们应该与构建控件相关联。如果控件是在 VB6 中创建的,这可能是一个特别严重的问题。除非您设置其二进制兼容性功能,否则分配新的 GUID 很快。

    【讨论】:

    • ActiveX 控件的 GUID 如何更改?我原以为它们会保持不变(但话又说回来,我对 ActiveX GUID 知之甚少)。另外,有没有办法使用“添加引用...”对话框来生成 ActiveX 控件,这会解决 GUID 更新问题吗?当我尝试使用它时,Ax* 命名空间/类不会出现。原谅我的无知,我对此很陌生
    • 我不知道,请与维护 ActiveX 控件的人交谈。如果公共接口发生更改,则更改 GUID 是 COM 中的一项要求,它可以避免 DLL Hell。坏的那种,不是这种。不,如果你想把控件放在表单上,​​你需要 aximp.exe。
    • 那么如何检查 Interop DLL 正在寻找的 CLSID?当我暂停调试器时,我在 control->base->clsid 中​​看到了一些有希望的东西,但我认为它可能是别的东西。我从我的项目中删除了引用,注销了 OCX,删除了 Interop DLL,重新注册了 OCX,然后使用 AXIMP 重新生成了 DLL,然后重新添加了引用,仍然没有骰子。有什么方法可以确认它正在尝试加载哪个 ActiveX 控件,并同样检查它是否正确注册?
    • 您运行的是 64 位版本的 Windows 吗?
    • 是的,我是。 (我在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin 中使用 AxImp.exe,因为 x64 中的那个似乎不起作用)。该程序正在编译为 x86。
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多