1

相互運用機能ユーザーコントロール(VB.NET)が戻り、get/set呼び出しから複数の値を受け入れるようにしたいと思います。ユーザー定義型(UDT)が正しい方法であると想定しましたが、VB6コンパイルから「変数はVisualBasicでサポートされていない自動化型を使用します」を取得し続けます。相互運用機能コントロールとVB6アプリケーション間で複数の値を渡す方法はどのように行われていますか?

VB.NET(相互運用)コード、.NETListViewを使用したコントロール

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 に準拠していないためです。COM Visible を true に設定して、新しい VB2005 プロジェクトを作成しました。

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

エラーの再現に成功しました。

次に、(PowerVB Type Lib Editor を使用して) REGASM によって生成されたタイプ ライブラリを調べました。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に精通していませんが、これでうまくいくと思います。何かの 2 つの間でカスタムの何かを渡すには、両者がその何かを「認識する」必要があります。

コードの重複を避けるために参照を追加できるように、相互運用性のラッパーを作成することもできます。確かなことは言えませんが、あなたのものを2つの間で通行可能にする方法はわかりませ.

于 2012-05-08T13:43:58.430 に答える