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