• 締切済み

VB6でのgethostbyaddrの使用方法について

IPアドレスからホスト名(コンピュータ名)を取得するため gethostbyaddrを使用したいのですがうまくいきません。 (動くのですが戻り値が常に0となります。名前解決はできています。また、gethostbynameは正常に動きました。) すみませんが教えてください。 HOSTENT = gethostbyaddr(addr,inglen,ingtype) 上記のaddr、inglen、ingtypにはどのような値を入れればよいので しょうか? addrはgethostbynameで取得した値(102379333)を入れるのでしょうか? それとも「10.10.999.999」のような値を入れるのでしょうか? 環境は以下の通りです。 OS:Windows XP またはWindows2003 server 言語:VB6 使用関数はgethostbyaddrを使用しないといけません。 調べたところいろいろありましたが 具体的なコーディングがありませんでした。 お手数ですがよろしくお願いします。

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.2

二重ポインタを処理しなければなりません。以下は回答です。 Declare Function WSAStartup Lib "WS2_32" _   (ByVal V As Integer, ByRef D As Byte) As Long Declare Function inet_addr Lib "WS2_32" _   (ByVal A As String) As Long Declare Function gethostbyaddr Lib "WS2_32" _   (ByRef A As Long, ByVal S As Long, ByVal T As Long) As Long Declare Function WSACleanup Lib "WS2_32" () As Long Declare Function SysAllocStringByteLen Lib "OLEAUT32" _   (ByVal S As Long, ByVal L As Long) As String Declare Function lstrlenA Lib "KERNEL32" _   (ByVal P As Long) As Long Declare Sub RtlMoveMemory Lib "KERNEL32" _   (ByRef D As Long, ByVal S As Long, ByVal L As Long) Sub Main() Dim A As Long, P As Long, N As String ReDim D(397) As Byte 'WSADataの定義を横着した A = inet_addr("192.168.0.1") '文字列のIPアドレスを数値化 WSAStartup &H202, D(0) 'WinSockを初期化 P = gethostbyaddr(A, 4, 2) 'IPアドレスから情報を取得 If P = 0 Then   P = Err.LastDllError 'エラーコードを取得   MsgBox "WinSock Error Code = " & P ,vbCritical Else   RtlMoveMemory P, P, 4 '二重ポインタ→単ポインタ   A = lstrlenA(P) 'ホスト名のバイト数を取得   N = SysAllocStringByteLen(P, A) 'VB文字列に変換   MsgBox "Host = " & N End If WSCleanup End Sub gethostbyaddr(A, 4, 2) について (1)A はIPアドレスを数値化したもの (2)4 は変数Aのバイト数 (3)2 は定数 AF_INET の定義値 ホスト名はANSI文字列なのでVB文字列に変換しています。

zibika
質問者

お礼

ありがとうございました。 解決しました。 本当に助かりました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

MSDNなどで WinAPIのリファレンスをちゃんと引いて見ましょう addrはByte(Char)型の配列で 192.168.1.10でしたら4つの要素を持つ配列で addr(0)=192, addr(1)=168, addr(2)=1, addr(3)=10といった具合になるでしょう inglenは addrがどれだけの長さなのかですから 4 ingtypeはaddrの数値がどのタイプですので TCP/UDPなどなら2 (AF_INET)を設定でしょう