1

我想要一个互操作用户控件(VB.NET)返回并接受来自 get/set 调用的多个值。我假设用户定义类型 (UDT) 是正确的方法,但我不断从 VB6 编译中得到“变量使用 Visual Basic 不支持的自动化类型”。如何在互操作控件和 VB6 应用程序之间传递多个值?

VB.NET (Interop) 代码,一个带有 .NET ListView 的控件

Structure Employee
    Dim Firstname As String
    Dim Lastname As String
End Structure

…</p>

Public Property MyReadListViewData() As Employee
    Get
        Dim myEmployee As Employee
        myEmployee.Lastname = ListView1.SelectedItems(0).Text
        Return myEmployee
    End Get
    Set(ByVal value As Employee)
        Me.ListView1.SelectedItems(0).Text = value.Lastname
    End Set
End Property

典型的 VB6 代码:

Private Sub Command4_Click()
    Dim myEmployee As Employee
    myEmployee = MyToolStrip1.MyReadListViewData
    Text3.Text = myEmployee.Lastname
End Sub
4

2 回答 2

1

在 VB6 中出现“Variable uses an Automation type not supported in Visual Basic”错误的原因是在类型库中创建的记录不符合 VB6。我创建了一个新的 VB2005 项目,将 COM Visible 设置为 true:

Public Class Boing

    Public Structure Employee
        Dim FirstName As String
        Dim LastName As String
    End Structure

    Public Sub GetEmployee(ByRef e As Employee)

        e.FirstName = "Mark"
        e.LastName = "Bertenshaw"

    End Sub

End Class

我使用 REGASM /tlb 为这个 DLL 创建了一个类型库。

我还创建了一个测试 VB6 项目:

Private Sub Command_Click()

    Dim udtEmployee As TestDotNetStructures.Employee
    Dim oBoing As TestDotNetStructures.Boing

    oBoing.GetEmployee udtEmployee

End Sub

我成功地重现了你的错误。

然后我查看了 REGASM 生成的类型库(使用 PowerVB 类型库编辑器)。事实证明,为 Employee 类型创建的 RECORD 如下所示:

Record Employee
{
    LPWSTR FirstName
    LPWSTR LastName
}

包含 LPWSTR 的记录作为 COM 方法中的参数无效。LPWSTR 不是兼容 COM 的类型。另一方面,BSTR 绝对是。

解决方法是在 VB.NET 代码中添加编组属性,以告诉 VB.NET 将字符串作为 BSTR 传递:

Imports System.Runtime.InteropServices

<Microsoft.VisualBasic.ComClass()> Public Class Boing

    Public Structure Employee
        <MarshalAs(UnmanagedType.BStr)> Dim FirstName As String
        <MarshalAs(UnmanagedType.BStr)> Dim LastName As String
    End Structure

    Public Sub GetEmployee(ByRef e As Employee)

        e.FirstName = "Mark"
        e.LastName = "Bertenshaw"

    End Sub

End Class
于 2012-05-15T14:47:44.233 回答
0

您是否考虑过将“东西”作为数据集传递或使用 XML 序列化?我对VB6并不熟悉,但我认为这会起作用。为了在两个东西之间传递一个自定义的东西,他们都必须“意识到”那个东西。

您还可以围绕互操作创建一个包装器,以便您可以添加对您的东西的引用以避免代码重复。我不能肯定地说,但我不知道有一种方法可以你的东西在两者之间通过。

于 2012-05-08T13:43:58.430 回答