2009-08-28 80 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,而您必須手動完成。