PDA

View Full Version : 关于Notes获取本机IP地址的解决方案


空空空
28-10-06, 09:44 PM
前段时间看到有会员要获取IP地址,而自己曾经也想实现这个,虽然目前还没有在实际应用中用到,不过在业余时间还是自己尝试实现一下,随便也提供给有这个需求的会员:
为了实现这个功能,还是单独创建一个Script库吧,命名为LocalIP,将以下声名放到(Declarations)里
Private Const WS_VERSION_REQD = &H101
Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD = 1
Private Const SOCKET_ERROR = -1
Private Const WSADescription_Len = 256
Private Const WSASYS_Status_Len = 128
Private Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type
Private Type WSADATA
wversion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpszVendorInfo As Long
End Type
Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Declare Function WSAStartup Lib "WSOCK32.DLL" (Byval wVersionRequired As Integer, lpWSAData As WSADATA) As Long
Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Declare Function gethostname Lib "WSOCK32.DLL" (Byval hostname$,Byval HostLen As Long) As Long
Declare Function gethostbyname Lib "WSOCK32.DLL" (Byval hostname$) As Long
Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, Byval hpvSource&, Byval cbCopy&)
以下一些相关函数:
这是用户调用的函数
Function GetLocalIPAddress() As Variant

%REM
功能:获得本机IP地址
%END REM

Dim hostname As String * 256
Dim hostent_addr As Long
Dim host As HOSTENT
Dim hostip_addr As Long
Dim temp_ip_address() As Byte
Dim i As Integer
Dim ip_address As String

If gethostname(hostname, 256) = SOCKET_ERROR Then
Msgbox "Windows Sockets error " & Str(WSAGetLastError())
Exit Function
Else
hostname = Trim$(hostname)
End If

hostent_addr = gethostbyname(hostname)

If hostent_addr = 0 Then
Msgbox "Winsock.dll is not responding."
Exit Function
End If

RtlMoveMemory host, hostent_addr, Lenb(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4

Msgbox hostname

'get all of the IP address if machine is multi-homed

Do
Redim temp_ip_address(1 To host.hLength)
RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength

For i = 1 To host.hLength
ip_address = ip_address & temp_ip_address(i) & "."
Next
ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)

Msgbox ip_address

ip_address = ""
host.hAddrList = host.hAddrList + Lenb(host.hAddrList)
RtlMoveMemory hostip_addr, host.hAddrList, 4
Loop While (hostip_addr <> 0)


End Function

Function hibyte(Byval wParam As Integer)

hibyte = wParam \ &H100 And &HFF&

End Function

Function lobyte(Byval wParam As Integer)

lobyte = wParam And &HFF&

End Function

Function SocketsInitialize()
Dim WSAD As WSADATA
Dim iReturn As Integer
Dim sLowByte As String, sHighByte As String, sMsg As String

iReturn = WSAStartup(WS_VERSION_REQD, WSAD)

If iReturn <> 0 Then
Msgbox "Winsock.dll is not responding."
End
End If

If lobyte(WSAD.wversion) <WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = _
WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then

sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
sMsg = "Windows Sockets version " & sLowByte & "." & sHighByte
sMsg = sMsg & " is not supported by winsock.dll "
Msgbox sMsg
End
End If

'iMaxSockets is not used in winsock 2. So the following check is only
'necessary for winsock 1. If winsock 2 is requested,
'the following check can be skipped.

If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
sMsg = "This application requires a minimum of "
sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets."
Msgbox sMsg
End
End If

End Function

Function SocketsCleanup()
Dim lReturn As Long

lReturn = WSACleanup()

If lReturn <> 0 Then
Msgbox "Socket error " & Trim$(Str$(lReturn)) & " occurred in Cleanup "
End
End If

End Function

Function Form_Load()

SocketsInitialize

End Function

Function Form_Unload(Cancel As Integer)

SocketsCleanup

End Function

用户可以在表单按钮或者操作将此Script库引用,然后运行函数就可以,其实这是微软针对VB获取IP地址的方案,我只不过用在Notes里,并相应处理一下,
详细资料可以参考http://support.microsoft.com/kb/q160215 (http://support.microsoft.com/kb/q160215)

[ 本帖最后由 空空空 于 2006-10-28 09:45 PM 编辑 ]

madeinchina
28-10-06, 11:45 PM
不错,谢谢分享,顶你一下:-)

bestkaka
03-01-07, 10:48 AM
非常感謝,試試先﹕)

bestkaka
03-01-07, 10:58 AM
有錯誤呀,樓主幫忙看看

bestkaka
03-01-07, 11:25 AM
byte->string就OK了
但是還有兩個問題:
1. 取出來的是電腦名
2. 取完之后notes就down了

tyling
03-01-07, 10:45 PM
不是使用CGI变量就可以解决问题吗

bestkaka
11-01-07, 03:06 PM
能说详细点吗?

tyling
16-01-07, 05:18 PM
在表单中建一个Server_Name文本域,他将自动取得浏览器的IP,你可以隐藏他,在公式或LS中使用就行了。

fish_happy
01-06-07, 04:46 PM
dddddddddddd

xiaolang
03-06-07, 09:36 AM
原帖由 bestkaka 于 2007-1-3 11:25 AM 发表 http://www.lotusfans.com/bbs/images/common/back.gif (http://www.lotusfans.com/bbs/redirect.php?goto=findpost&pid=42434&ptid=7949)
byte->string就OK了
但是還有兩個問題:
1. 取出來的是電腦名
2. 取完之后notes就down了

我也遇到相同的情况。调用WinAPI是比较麻烦,虽然速度很快,但经常会遇到莫名其妙的错误。

bgs_chen
04-06-07, 02:24 PM
如果notes版本是6.0以下,那么定义字节类型就不能用了,请问如何解决字节类型?

tonyteng
05-06-07, 10:35 AM
不错试过了

lizs_bj
13-11-08, 03:51 PM
好像运行不了,有错误,无法保存?谁能说的更具体一些呢?

blacktail
10-12-08, 02:39 PM
非常感谢提供资源!