【问题标题】:Wrong Object Returned from COM Callable Wrapper从 COM 可调用包装器返回的错误对象
【发布时间】:2009-08-28 13:50:05
【问题描述】:

我刚刚更新了一个从 Powerpoint 中的 VBA 调用的 dll。所有开发都很顺利,但是当我尝试在另一台用户机器上进行部署时,我遇到了一个我不知道如何调试的问题。

发生的情况是,当在 VBA 中创建 .Net 对象时,返回的引用指向错误的对象,因此下一行失败并找不到方法。

Dim myObj As Foo.Bar

Public Sub RefreshData()

//'instantiate object
Set myObj = New Foo.Bar   
//'call a method
myObj.HelloWorld

最后一行失败,运行时错误 '438' 对象不支持此属性或方法,这是由于 myObj 的类型为“Wrong.Type”而不是“Foo.Bar”。

“Wrong.Type”也在程序集中,所以我认为类型库出了点问题,但我尝试过重新生成(使用 regasm /codebase /tlb MyLib.dll),但这并没有帮助。

我不知道如何进一步诊断。希望有人可以列出一些有关如何诊断此类问题的步骤?

【问题讨论】:

  • 在这种情况下,删除对 tlb 文件的引用,然后重新添加即可解决问题。我仍然很想知道我可以看什么来帮助诊断问题,尽管我盲目地四处寻找最终找到了解决方案
  • 我遇到了类似的问题,但是在创建本机 VBA 类的实例时,因此没有提及添加/删除(请参阅此处:stackoverflow.com/questions/2677091/…)-您是否进一步了解诊断这个,如果是的话,有什么建议吗?谢谢!
  • @Modan:您可以回答自己的问题,然后接受自己的回答,表明您已找到所需内容。

标签: excel regasm ccw vba


【解决方案1】:

这可能是自动生成的 GUID(类、接口、类型库)的问题 - 当您更改 DLL 时,GUID 也发生了变化。由于旧 TLB 使用旧 GUID,通过引用它,您将这些旧 GUID 与类型名称相关联,因此代码无法使用新 GUID。我遇到的大多数 VB(6 和 .NET)代码都有这个问题,所以如果你的 DLL 是用 VB 编写的,可能就是这样(你的工作支持这个理论)。

如果这是问题所在,一般的解决方案是显式设置 GUID,如果您有很多类型,这会有点烦人,因为您应该在版本更改时更改 GUID,而您必须手动完成。

【讨论】:

    【解决方案2】:

    在这种情况下,删除对tlb文件的引用,然后重新添加即可解决问题

    不幸的是,我从来没有找到一个通用的解决方案,或者对这种行为的解释。

    【讨论】:

    • 我会检查类型和库以及所有接口的各种 GUID,特别是查看 Wrong.Type 和 Foo.Bar 类型及其接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2019-07-03
    • 2023-03-15
    • 2013-01-10
    相关资源
    最近更新 更多