2012-02-03 33 views
6

我有一個vb6項目,它引用了vb.net com庫。從.NET程序集創建對象時,VB6中的延遲綁定運行時錯誤

項目運行良好,當我使用早期綁定,例如:

Dim b as object 
Set b = new myComLib.testObject 

當我使用後期如結合:

Dim b as object 
Set b = CreateObject("myComLib.testObject") 

我得到以下錯誤:

Run-time error '429': ActiveX component can't create object

有什麼建議嗎?

感謝

+0

我只是嘗試這樣做,這兩種方法的工作。我在XP上,並添加了myComLib.tlb作爲項目的參考。你在XP或Win7上? – 2012-02-03 08:20:01

+0

我正在使用xp。我已經註冊了圖書館,也被複制到項目文件夾(DLL和TLB文件)我也已經添加到項目的引用。這就是早期綁定起作用的原因。後期的約束也應該起作用。我也嘗試添加引用到scrrun.dll,但仍然沒有。 – reven 2012-02-03 08:53:55

回答

5

在這種情況下,對於.NET COM互操作類的註冊表項: -

HKEY_CLASSES_ROOT\myComLib.testObject 

包含CLSID值和CLSID條目本身

HKEY_CLASSES_ROOT\CLSID\<<myComLib.testObject\CLSID value>> 

他們是也複製於

HKEY_LOCAL_MACHINE\SOFTWARE\Classes 

的CreateObject使用HKEY_CLASSES_ROOT條目檢索就這麼過去了,如果他們缺少類名的詳細信息,您將收到

Run-time error '429': ActiveX component can't create object

在VB6的IDE,添加對DLL的引用(在的情況下.NET程序集,通過它的tlb文件)繞過此註冊表搜索,從而允許早期綁定在沒有COM註冊表項的情況下工作。

該類必須正確註冊CreateObject才能正常工作。這應該作爲Visual Studio構建過程的一部分發生,否則需要使用Regasm手動註冊。

您可以通過以下操作測試此行爲: -

1)創建一個新的VB。NET項目myComLib在項目註冊爲COM互操作編譯屬性和添加一個類的TestObject

Public Class testObject 

    Public Property TestProperty As String 

    Public Function TestFunction() As String 
     Return "return" 
    End Function 

End Class 

2)結構myComLib

3)創建一個新的VB6項目,添加兩個命令按鈕到Form1和下面的代碼

Private Sub Command1_Click() 
    Dim b As Object 
    Set b = New myComLib.testObject 
    b.TestProperty = "Hello" 
    MsgBox b.TestProperty, vbOKOnly, b.TestFunction() 
End Sub 

Private Sub Command2_Click() 
    Dim b As Object 
    Set b = CreateObject("myComLib.testObject") 
    b.TestProperty = "Hello" 
    MsgBox b.TestProperty, vbOKOnly, b.TestFunction() 
End Sub 

4)運行VB6項目(不完整的編譯爲失敗)

命令2會彈出一個消息框,命令1將失敗,並

Compile Error: User-defined type not defined.

5)停止該項目,並添加到myComLib參考通過它的TLB文件

6)運行VB6項目和兩個按鈕,現在應該工作

7)進入註冊表並刪除HKEY_CLASSES_ROOT \ myComLib.testObject條目(這可以通過重建.NET組件重新創建,您需要關閉VB6開展重建)

命令2,現在將失敗,

Run-time error '429': ActiveX component can't create object

,直到註冊表項重新添加。

+0

你有寫HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\ CLSID \比HKEY_CLASSES_ROOT不同的名稱。這是爲什麼發生? – reven 2012-02-03 10:52:45

+0

註冊表項發生在兩個HKEY_CLASSES_ROOT和HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\ CLSID,但使用的CreateObject HKEY_CLASSES_ROOT。因爲我的確從HKEY_CLASSES_ROOT \ myComLib.testObject註冊表搜索在註冊表中的下一個項目是HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\ CLSID。我會更新答案。 – 2012-02-03 11:05:02

+0

在我的情況下CREATEOBJECT正在與HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\ CLSID! – reven 2012-02-03 11:45:02

0

如果您是ClassInterfaceType.None設置,則必須爲您的課程添加ProgId屬性以允許後期綁定。

例如:

[Guid("B1E17DF6-9578-4D24-B578-9C70979E2F05")] 
public interface _Class1 
{ 
    [DispId(1)] 
    string TestingAMethod(); 
} 

[Guid("197A7A57-E59F-41C9-82C8-A2F051ABA53C")] 
[ProgId("Rubberduck.SourceControl.Class1")] 
[ClassInterface(ClassInterfaceType.None)] 
public class Class1 : _Class1 
{ 
    public string TestingAMethod() 
    { 
     return "Hello World"; 
    } 

} 
相關問題