簡體   English   中英

VB6:運行時錯誤424調用CreateObject時

[英]VB6: Run-time error 424 When Calling CreateObject

我創建了一個C#COM可訪問的dll,我想在VB6中使用我能夠在VB6中使用我的COM對象以及對TLB的硬引用。 我現在要做的是刪除此引用並動態加載它我按如下方式創建它:

Dim keylok As Object
Set keylok = CreateObject("MyClassLib.MyObject")

一旦我點擊第二行,我得到運行時錯誤424“對象必需”。 但是當我按如下方式創建時:

Dim keylok As MyObject
Set keylok = CreateObject("MyClassLib.MyObject")

它工作正常。 我不確定為什么會有所作為。 無論如何我不能使用第二個,因為我仍然需要物理參考。

我還嘗試了一種調試,在我的COM對象構造函數中寫入文件,如果真的被調用的話。 是的,我甚至可以在構造函數中成功調用COM對象中的其他方法。

我甚至能夠動態加載並使用以下命令從另一個C#應用程序中使用:

dynamic myObj = Activator.CreateInstance(Type.GetTypeFromProgID("MyClassLib.MyObject"));

有沒有人遇到過這樣的事情?

我在@rskar輸入的幫助下找到了解決方案。 所以,我想我會回答我的問題,以防任何人面臨同樣的問題。

我的對象沒有妨礙IDsipatch。 所以我必須用InterfaceType(ComInterfaceType.InterfaceIsDual)來裝飾我的C#COM接口所以它實現了IUnknown和IDispatch。 最初它是用InterfaceType(ComInterfaceType.InterfaceIsIUnknown)裝飾的

我想你無論如何都要求.tlb。 COM對象需要能夠被編組,因為.Net主機在與VB6運行時不同的線程上運行。 默認編組使用類型庫中的信息來執行此操作。 IDIspatch有4種方法,其中2種與訪問類型信息有關。 因此,如果您刪除.tlb,則在創建IDispatch時,COM會嘗試從此調用ITypeInfo並且無法加載已注冊的類型庫。 如果你消除了.tlb,你將無法被編組,並且你可能必須為你的界面提供一個自定義編組器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM