小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

ソケットのVB6からVB2005移行へのメモ

VB2005では、ソケットはクラス(http://www.atmarkit.co.jp/fdotnet/special/networkprog/networkprog_01.html)でサポートされているので、VB6のロジックをそのまま移行することは、まずないと思います。
しかし、特殊な環境(.NETに依存しない)だとどうしてもソケットAPIで組まないとならないケースがあるのです。
そんな人(実は自分)のためにのメモです。

固定長文字列の移行

FixedLengthStringを使用します。
ただし、文字列はvalueプロパティに格納されます。

VB6
Dim hostname As String * 256
VB2005
Dim hostname As New VB6.FixedLengthString(256)

構造体の移行

まず、VB6の構造体はTypeで定義し、VB2005の構造体はStructureで定義します。
つぎに、VB6は16ビット言語で、VB2005は32ビット言語です。
したがって、VB6のIntegerは、VB2005ではShortです。
また同じく、VB6のLongは、VB2005ではIntegerです。
VB6でByte型で確保したエリアは、マーシャリング(MarshalAs)してString型で確保します。
ちなみに、マーシャリングとは、異なる言語間でのデータ変換のことです。

VB6
   Private Type WSADATA
       wversion As Integer
       wHighVersion As Integer
       szDescription(0 To 256) As Byte
       szSystemStatus(0 To 128) As Byte
       iMaxSockets As Integer
       iMaxUdpDg As Integer
       lpszVendorInfo As Long
   End Type
VB2005
   Private Structure WSADATA
        Dim wversion As Short
        Dim wHighVersion As Short
         Dim szDescription As String
         Dim szSystemStatus As String
        Dim iMaxSockets As Short
        Dim iMaxUdpDg As Short
        Dim lpszVendorInfo As Integer
   End Structure

Any型の移行

VB6のどんな型でも受けられるAny型は、VB2005ではサポートされませんでした。
VB2005では、『どんな型でも』をオーバーロードで対応します。
つまり、引数タイプの異なる同名のAPI複数定義するのです。

VB6
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)
VB2005
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (ByRef hpvDest As Integer, ByVal hpvSource As Integer, ByVal cbCopy As Integer)
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (ByRef hpvDest As HOSTENT, ByVal hpvSource As Integer, ByVal cbCopy As Integer)
    Private Declare Sub RtlMoveMemory Lib "KERNEL32" (ByRef hpvDest As Byte, ByVal hpvSource As Integer, ByVal cbCopy As Integer)