DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WSAStartup関数について

環境/言語:[Windows2000 VB.NET]
分類:[.NET]

はじめまして

VB6のPingプログラムをアップグレードしたのですが、
WSAStartup関数でエラーとなります。
戻り値は、10014です。
「無効なバッファアドレス」という事のようですが、
原因が分かりません。

ご存知の方がいらっしゃいましたら御教授願えないでしょうか?
宜しくお願いいたします。

以下、ソースの抜粋です。
''定数宣言
Public Const WS_VERSION_REQD As Integer = &H101S

''構造体定義
<StructLayout(LayoutKind.Sequential)> Public Structure WSADATA
<FieldOffset(0)> Dim wVersion As Short
<FieldOffset(2)> Dim wHighVersion As Short
<VBFixedArray(MAX_WSADescription)> Dim szDescription() As Byte
<VBFixedArray(MAX_WSASYSStatus)> Dim szSystemStatus() As Byte
Dim wMaxSockets As Integer
Dim wMaxUDPDG As Integer
Dim dwVendorInfo As Integer

Public Sub Initialize()
ReDim szDescription(MAX_WSADescription)
ReDim szSystemStatus(MAX_WSASYSStatus)
End Sub
End Structure

''API宣言
Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Integer, _
ByVal lpWSADATA As WSADATA) As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim WSAD As WSADATA
Dim X As Integer

WSAD.Initialize()
X = WSAStartup(WS_VERSION_REQD, WSAD)
End Sub
> VB6のPingプログラムをアップグレードしたのですが、
Pingなら、Win32_PingStatus クラスなんてのもありますね。WMIの。

> Public Const WS_VERSION_REQD As Integer = &H101S
あれ。&H101I ではなく、&H101S ですか。(まぁ、結果は同じですけど)

> <StructLayout(LayoutKind.Sequential)> Public Structure WSADATA
WinSock2.h には、『#include <pshpack4.h>』の記述があるので、
StructLayoutAttributeに Pack:=4 も指定しておいた方が良いと思います。
そうすれば、FieldOffsetAttribute を省けますし。

> <VBFixedArray(MAX_WSADescription)> Dim szDescription() As Byte
> <VBFixedArray(MAX_WSASYSStatus)> Dim szSystemStatus() As Byte
この場合は、String型を使った方が良いかと。
配列にすると、初期化の手間が必要ですし。
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=WSADESCRIPTION_LEN + 1)> _
Dim szDescription As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=WSASYS_STATUS_LEN + 1)> _
Dim szSystemStatus As String

> Dim wMaxSockets As Integer
> Dim wMaxUDPDG As Integer
これらの型が正しく無いように見えます。

WinSock2.h を見る限り、本来の定義は、
》 unsigned short iMaxSockets;
》 unsigned short iMaxUdpDg;
となっていますので、UInt16 、もしくは Int16(Short) では無いかと。


> Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Integer, _
> ByVal lpWSADATA As WSADATA) As Integer
今回の場合、第2引数は ByRef にする必要がありますね。

VB6では、「ByVal/ByRef」を省略すると ByRef 扱いになりますが、
VB.NETでは、省略時は ByVal 扱いになる事に注意してください。
レスありがとうございます。

ご指摘の部分を修正する事で、
WSAStartup関数が正常に終了しました。

ありがとうございましたm(_ _)m
以上
解決済み!
どうも、黒崎です。

魔界の仮面弁士殿から教えていただいたWMIですが、
Windows 2000では利用できないみたいですね。

「無効なクラスです」という例外エラーが発生しました。
コードも短くてお手軽そうだったのに残念・・・

DOBON.NET | プログラミング道 | プログラミング掲示板