NetServerGetInfo で ローカルコンピュータ名を取得する
仕事で、ローカルコンピュータ名を取得する必要がありそうなのですが、WinSock で取得しても面白くないので、今回は NetServerGetInfo
で、VB 用の関数を作ってみました。ただし、Windows Me、98、95 等では関数定義が異なるため、使用できません。
Attribute VB_Name = "basNetApi" Option Explicit Private Const mcstrMODULE_NAME As String = "basNetApi" Private Const MAX_PATH As Long = 260& Public Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public Declare Function lstrcpynA Lib "kernel32" (lpString1 As Any, lpString2 As Any, ByVal iMaxLength As Long) As Long Public Declare Function lstrcpyA Lib "kernel32" (lpString1 As Any, lpString2 As Any) As Long Public Declare Function lstrcpynW Lib "kernel32" (lpString1 As Any, lpString2 As Any, ByVal iMaxLength As Long) As Long Public Declare Function lstrcpyW Lib "kernel32" (lpString1 As Any, lpString2 As Any) As Long Private Declare Function NetServerGetInfo Lib "NETAPI32.DLL" (lpwszServerName As Any, ByVal dwLevel As Long, lpBufPtr As Any) As Long Private Declare Function NetApiBufferFree Lib "NETAPI32.DLL" (lpBuffer As Any) As Long Private Type mtypSERVER_INFO_100 sv100_platform_id As Long sv100_name As Long End Type Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = &H100& Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200& Private Const FORMAT_MESSAGE_FROM_STRING As Long = &H400& Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800& Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000& Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = &H2000& Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = &HFF& Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, lpBuffer As Any, ByVal nSize As Long, Arguments As Long) As Long '****************************************************************** 'プロシージャ名: :GetLocalHostName '説明: :ローカルコンピュータ名を取得する '戻り値 :String型 '****************************************************************** Public Function GetLocalHostName() As String '============= Declare ============== Dim udtBuf As mtypSERVER_INFO_100 Dim lngRet As Long Dim lngBuf As Long Dim rgbytBuf() As Byte Dim strRet As String '============= Initiarize =========== On Error GoTo GetLocalHostName_E00 GetLocalHostName = "" '============= Main ================= ' 情報を取得 lngRet = NetServerGetInfo(ByVal 0&, 100, lngBuf) If lngRet Then Call DllErrRaise(Err.LastDllError, "NETAPI32") On Error GoTo GetLocalHostName_E10 ' ポインタより構造体をコピー Call MoveMemory(udtBuf, ByVal lngBuf, Len(udtBuf)) ' コンピュータ名コピー ReDim rgbytBuf(MAX_PATH - 1&) Call lstrcpyW(rgbytBuf(0), ByVal udtBuf.sv100_name) ' 文字列型で受けるとユニコードに再変換されてしまうため、 strRet = rgbytBuf ' いったんバイト配列で受ける GetLocalHostName = Left(strRet, InStr(strRet, vbNullChar) - 1&) '============= Release ============== GetLocalHostName_L00: Call NetApiBufferFree(ByVal lngBuf) Exit Function '============= Error ================ GetLocalHostName_E10: Call NetApiBufferFree(ByVal lngBuf) GetLocalHostName_E00: Call Err.Raise(vbObjectError Or Err.Number, mcstrMODULE_NAME & ".GetLocalHostName" & "(" & Err.Source & ")", Err.Description, Err.HelpFile, Err.HelpContext) End Function '****************************************************************** 'プロシージャ名: :pDllErrRaise '説明: :Err.LastDllErrorよりエラーを発生する '引数: :plngLastDllError I Err.LastDllError ' :pstrErrSource O エラーソース文字列 '****************************************************************** Public Sub DllErrRaise(ByVal plngLastDllError As Long, pstrErrSource As String) '============= Declare ============== Const clngMAX_BUFFER As Long = 1024& Dim bytBuf(clngMAX_BUFFER - 1&) As Byte 'バッファ Dim lngRet As Long 'APIの戻り値 Dim strErrDescription As String '============= Initiarize =========== If plngLastDllError = 0& Then Exit Sub End If Erase bytBuf strErrDescription = "" '============= Main ================= '@@ エラー値に対応するメッセージを取得する lngRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _ ByVal 0&, _ plngLastDllError, _ 0&, _ bytBuf(0), _ clngMAX_BUFFER, _ ByVal 0&) If lngRet Then strErrDescription = StrConv(LeftB(bytBuf, lngRet), vbUnicode) End If '@@ エラーを発生する Call Err.Raise(plngLastDllError Or vbObjectError, pstrErrSource, strErrDescription) End Sub
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/319
コメント