从COM可调用包装器返回错误的对象

时间:2009-08-28 13:50:06

标签: excel-vba regasm ccw vba excel

我刚刚对从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),这没有帮助。

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

2 个答案:

答案 0 :(得分:1)

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

如果这是问题,一般的解决方案是明确设置GUID,如果您有很多类型,这有点烦人,因为您应该在版本更改时更改GUID,并且''我必须手动完成。

答案 1 :(得分:0)

在这种情况下,删除对tlb文件的引用,然后再次添加它解决了问题

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