2009-08-28 75 views
1

我刚刚对Powerpoint中从VBA调用的dll进行了更新。所有的开发都很顺利,但是当我尝试部署到其他用户机器时,我遇到了一个问题,我不知道如何调试。错误的对象从COM Callable Wrapper返回

会发生什么情况是,当在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),并没有帮助。

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

+0

在这种情况下,删除对tlb文件的引用,然后再次添加它解决了问题。我仍然有兴趣知道我可以看到什么帮助诊断问题,即使盲目地刺伤我最终找到了解决方案 – Modan 2009-08-28 14:45:33

+0

我遇到了类似的问题,但是在创建本机VBA类的实例时,没有参考添加/删除(请参阅:http://stackoverflow.com/questions/2677091/automating-excel-through-through-pia-makes-vba-go-squiffy) - 您是否进一步诊断此问题,以及如果有的话有什么建议?谢谢! – 2010-04-23 13:08:15

+0

@Modan:你可以回答你自己的问题,然后接受你自己的答案,表示你已经找到你正在寻找的东西。 – adamleerich 2011-09-15 05:05:22

回答

0

在这种情况下,去除参考TLB文件,然后将其再次解决了这个问题

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

+1

我会检查类型和库以及所有接口的各种GUID,特别注意Wrong.Type和Foo.Bar类型及其接口。 – Arafangion 2013-08-07 23:48:24

1

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

如果这是问题,一个通用的解决方案是显式设置GUID,如果您有很多类型,这有点令人讨厌,因为您应该随着您的版本更改而更改GUID,而您必须手动完成。