ソケットの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)