.NET2003 で構造体からString変数へのコピー

解決


sin  2004-07-27 19:25:21  No: 84808  IP: [192.*.*.*]

はじめて書き込みさせて頂きます。

.NET2003 VBで、構造体のメンバ変数を連続した文字列として、
String変数へのコピーということはできるのでしょうか?

例えば、構造体「TestStruct」(※メンバ変数は全てString型)を、
String型の変数「strTest」にコピーした場合、「strTest」の結果は"01234567890ABCDE"といった具合です。
------------
Structure TestStruct
    Public resCode As String ' サイズは10で"01234567890"と仮定
    Public updMode As String ' サイズは5で"ABCDE"と仮定
End Structure

調べていると、VBはCと違って構造体要素のメモリが連続していないので、
RtlMoveMemory(CopyMemory)等や、構造体のアドレスを取得するのにStrPtrの代わりに「GCHandle.AddrOfPinnedObject」を使うということは分かりましたが、実装に至らない状態です。

申し訳ありませんがよろしくお願い致します。

編集 削除
魔界の仮面弁士  2004-07-27 20:38:46  No: 84809  IP: [192.*.*.*]

> .NET2003 VBで、構造体のメンバ変数を連続した文字列として、
> String変数へのコピーということはできるのでしょうか?

Stringは「参照型」なので、単純にメモリコピーしても駄目ですね。
かわりに、
  Dim X As TestStruct
  S = X.resCode & X.updMode
のようにするか、もしくは、連結用メソッドを TestStruct に実装してみてはいかがでしょう。

http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200406/04060083.txt

編集 削除
sin  2004-07-28 17:31:58  No: 84810  IP: [192.*.*.*]

魔界の仮面弁士さん、お返事ありがとうございます。

>http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200406/04060083.txt

上記のURLを参考に、以下のようにプロパティと連結用メソッドをTestStructに実装して対応することができました。
---------------
Structure TestStruct
    Private _resCode As String
    Private _updMode As String

  ' resCodeプロパティ
    Property resCode() As String
        Set(ByVal Value As String)
      _resCode = LSet(Value, LEN_RESCODE)
    End Set
    Get
      Return _resCode
    End Get
  End Property

  ' updModeプロパティ
  Property updMode() As String
    Set(ByVal Value As String)
      _updMode = LSet(Value, LEN_UPDMODE)
    End Set
    Get
      Return _updMode
    End Get
  End Property

  ' プロパティに設定されている文字列を全て結合する
  Public Function getSendBufferJoin(ByVal testStruct As TestStruct) As String
    Dim T As Type = GetType(TestStruct)
    Dim strBuf As New String("")

    For Each F As Reflection.PropertyInfo In T.GetProperties()
      strBuf = strBuf & F.GetValue(testStruct, Nothing)
    Next
    Return strBuf
  End Function

End Structure
---------------

実動作は富士通ホスト機とのバッファ送受信になるので、Byte型でのやりとりになりますが、全体的な動きを理解することができました。

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

編集 削除
sin  2004-07-28 17:54:58  No: 84811  IP: [192.*.*.*]

すいません、解決時のチェックを入れ忘れていました。

編集 削除