pb 获取ip地址
forward
global type n_adapters from nonvisualobject
end type
end forward
global type n_adapters from nonvisualobject
end type
global n_adapters n_adapters
type prototypes
Function ulong GetLastError( &
) Library "kernel32.dll"
Function ulong FormatMessage( &
ulong dwFlags, &
ulong lpSource, &
ulong dwMessageId, &
ulong dwLanguageId, &
Ref string lpBuffer, &
ulong nSize, &
ulong Arguments &
) Library "kernel32.dll" Alias For "FormatMessageA"
Function ulong GetAdaptersInfo ( &
Ref IP_ADAPTER_INFO pAdapterInfo[], &
Ref ulong pOutBufLen &
) Library "iphlpapi.dll" Alias For "GetAdaptersInfo"
Subroutine CopyMemory ( &
Ref blob Destination, &
long Source[], &
long Length &
) Library "kernel32.dll" Alias For "RtlMoveMemory"
Subroutine CopyMemory ( &
Ref integer Destination, &
blob Source, &
long Length &
) Library "kernel32.dll" Alias For "RtlMoveMemory"
end prototypes
forward prototypes
public function string of_getlasterror ()
public function string of_nbr2hex (unsignedlong aul_number, integer ai_digit)
public function boolean of_getadaptersinfo (ref string as_macaddress[], ref string as_description[], ref string as_adaptername[], ref string as_ipaddress[])
public function string of_getaddr ()
end prototypes
public function string of_getlasterror ();// SCRIPT: n_adapters.of_GetLastError
//
// PURPOSE: This function returns the last Windows API error.
//
// RETURN: Error message text
//
// -----------------------------------------
Constant ULong FORMAT_MESSAGE_FROM_SYSTEM = 4096
Constant ULong LANG_NEUTRAL = 0
String ls_buffer, ls_errmsg
ULong lul_error
lul_error = GetLastError()
ls_buffer = Space(255)
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, &
lul_error, LANG_NEUTRAL, ls_buffer, 255, 0)
ls_errmsg = "Error# " + String(lul_error) + "~r~n~r~n" + ls_buffer
Return ls_errmsg
end function
public function string of_nbr2hex (unsignedlong aul_number, integer ai_digit);// SCRIPT: n_adapters.of_Nbr2Hex
//
// PURPOSE: This function converts a number to a hex string.
//
// ARGUMENTS: aul_number- A number to convert
//ai_digit- The number of hex digits expected
//
// RETURN: Hex string
//
// -----------------------------------------
ULong lul_temp0, lul_temp1
Char lc_ret
If ai_digit > 0 Then
lul_temp0 = Abs(aul_number / (16 ^ (ai_digit - 1)))
lul_temp1 = lul_temp0 * (16 ^ (ai_digit - 1))
If lul_temp0 > 9 Then
lc_ret = Char(lul_temp0 + 55)
Else
lc_ret = Char(lul_temp0 + 48)
End If
Return lc_ret + of_Nbr2Hex(aul_number - lul_temp1, ai_digit - 1)
End If
Return ""
end function
public function boolean of_getadaptersinfo (ref string as_macaddress[], ref string as_description[], ref string as_adaptername[], ref string as_ipaddress[]);// SCRIPT: n_adapters.of_GetAdaptersInfo
//
// PURPOSE: This function returns information about network adapters.
//
// ARGUMENTS: as_macaddress- Array of MAC addresses
//as_description- Array of Descriptions
//as_adaptername- Array of Adapter names
//as_ipaddress- Array of IP addresses
//
// -----------------------------------------
Constant ULong ERROR_SUCCESS = 0
Constant ULong ERROR_BUFFER_OVERFLOW = 111
IP_ADAPTER_INFO lstr_Adapter[]
ULong lul_OutBufLen
Integer li_idx, li_max, li_macidx, li_macmax, li_byte
Blob lblob_address
// call function to get buffer size
If GetAdaptersInfo(lstr_Adapter, lul_OutBufLen) = ERROR_BUFFER_OVERFLOW Then
// how many adapters?
li_max = lul_OutBufLen / 640
// allocate structure
lstr_Adapter[li_max].NextPtr = 0
// call function to get data
If GetAdaptersInfo(lstr_Adapter, lul_OutBufLen) = ERROR_SUCCESS Then
For li_idx = 1 To li_max
// get adapter information
as_description[li_idx] = String(lstr_Adapter[li_idx].Description)
as_adaptername[li_idx] = String(lstr_Adapter[li_idx].AdapterName)
as_ipaddress[li_idx] = String(lstr_Adapter[li_idx].IpAddressList.IpAddress)
// convert MAC address from blob data
li_macmax = lstr_Adapter[li_idx].AddressLength
lblob_address = Blob(Space(li_macmax))
CopyMemory(lblob_address, lstr_Adapter[li_idx].Address, li_macmax)
For li_macidx = 1 To li_macmax
CopyMemory(li_byte, BlobMid(lblob_address, li_macidx, 1), 1)
as_macaddress[li_idx] += of_Nbr2Hex(li_byte, 2)
If li_macidx < li_macmax Then
as_macaddress[li_idx] += "-"
End If
Next
Next
Return True
End If
End If
MessageBox("Error in of_GetAdaptersInfo", &
of_GetLastError(), StopSign!)
Return False
end function
public function string of_getaddr ();String ls_macaddress[], ls_description[]
String ls_adaptername[], ls_ipaddress[]
Integer li_cnt, li_max, li_row
boolean lb_ok
lb_ok=of_GetAdaptersInfo(ls_macaddress, ls_description, &
ls_adaptername, ls_ipaddress)
if lb_ok=false then return ""
li_max = UpperBound(ls_macaddress)
For li_cnt = 1 To li_max
if right(ls_ipaddress[li_cnt],2)<>".0" then
return ls_ipaddress[li_cnt];
end if
Next
return ""
end function
on n_adapters.create
call super::create
TriggerEvent( this, "constructor" )
end on
on n_adapters.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on