0

私たちのクライアントは、データを構造体から文字列に移動して、メインフレームに出荷できるようにする必要があります。私たちのプロセスは、基本的に文字列から構造体にデータをマーシャリングすることです。この部分は簡単でした...

私は今、逆のことをしようとしていますが、いくつかの困難に直面しています。これが私が取り組んでいるテスト構造です。

 <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure Contact
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
    Public Address As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _
    Public FirstName As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _
    Public LastName As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=12)> _
    Public PhoneNumber As String
End Structure

ここに私が使用しているテスト方法があります:

 Public Sub TestContactToString()

    Dim contact As New Contact

    contact.Address = "123 Main st."
    contact.FirstName = "Bob"
    contact.LastName = "Builder"
    contact.PhoneNumber = "613-828-1233"

    Dim unmanagedAddress As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(contact))

    Marshal.StructureToPtr(contact, unmanagedAddress, True)

    Dim result As String = Marshal.PtrToStringUni(unmanagedAddress)

    Marshal.FreeHGlobal(unmanagedAddress)
    unmanagedAddress = IntPtr.Zero

End Sub

現在、結果変数は構造体「アドレス」の最初のフィールドのみを取得しています...ポインタに十分なスペースが割り当てられていないように見えますか? 残りのデータを文字列に入れる方法を考えています...

どんな助けでも大歓迎です!

ありがとうございました。

4

1 に答える 1

1

そうですね、これは予想通りの結果です。Marshal.PtrToStringUni() は、埋め込まれたゼロ (C 言語の文字列の文字列ターミネータ) で終了します。文字列がフィールド全体を埋めないため、構造体に存在します。C プログラムが構造体を読み取ると想定しているため、Marshal.StructureToPtr() によって生成されます。

蚊を殺すために大砲を使用しました。代わりに String.PadRight() を使用してください。

于 2013-05-24T22:34:42.287 に答える