vfp中关于取本地 IP的问题?

KQX7381 2012-09-11 01:18:40
LOCAL ipsocket

ipsocket=CREATEOBJECT("MSWinsock.Winsock")
IF TYPE("ipsocket")="O"
WITH ipsocket &&as MSWinsockLib.Winsock
ipaddress=.LocalIP
localhost=.LocalHostName
ENDWITH
MESSAGEBOX("你的IP地址是:"+ipaddress+CHR(13)+CHR(10)+"你的服务器名是:"+localhost)
ELSE
MESSAGEBOX("系统未装winsock控件")
ENDIF
RELEASE ipsocket

在我本机上使用正常,安装到另外 一台机器上出错,提示:找不到MSWinsock.Winsock类定义。怎么办?多谢各位了。
...全文
454 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2012-09-11
  • 打赏
  • 举报
回复
在开发的机器上(安装了VFP)运行正常,而在没安装VFP的机子运行却提示“类别未授权使用”

因为开发的机子安装VFP时,取得了OCX授权,而在未安装VFP的机器上没有取得OCX授权

使用纯代码建立winsock对象,对于开发的那台机器没问题,别的机器都用不了。

所以这不是ocx的注册问题,而是ocx的授权问题。

解决方法:

对于mswinsck.ocx来说,如果想不报错,请不要用纯代码来建立winsock对象,改用可视化,即把这个ocx拖到表单上。

因为可视化建立的winsock连编成EXE时会自动带上授权密钥.



MS 很多控件都有这种设计/运行时授权的限制,要动态创建这些对象,运行的机器上必须有授权许可,而拖入表单中的控件已携带了授权许可,所以不需要。
把下列内容保存到一个 vbctrls.reg 文件中,然后双击它导入注册表,即可拥有动态创建时的授权许可:

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\Licenses]
@="Licensing: Copying the keys may be a violation of established copyrights."

[HKEY_CLASSES_ROOT\Licenses\12B142A4-BD51-11d1-8C08-0000F8754DA1]
@="aadhgafabafajhchnbchehfambfbbachmfmb"

[HKEY_CLASSES_ROOT\Licenses\190B7910-992A-11cf-8AFA-00AA00C00905]
@="gclclcejjcmjdcccoikjlcecoioijjcjnhng"

[HKEY_CLASSES_ROOT\Licenses\1F3D5522-3F42-11d1-B2FA-00A0C908FB55]
@="gcfjdjecpchcncdjpdejijgcrdoijjfcieod"

[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]
@="mlrljgrlhltlngjlthrligklpkrhllglqlrk"

[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]
@="kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"

[HKEY_CLASSES_ROOT\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905]
@="gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj"

[HKEY_CLASSES_ROOT\Licenses\4F86BADF-9F77-11d1-B1B7-0000F8753F5D]
@="iplpwpnippopupiivjrioppisjsjlpiiokuj"

[HKEY_CLASSES_ROOT\Licenses\57CBF9E0-6AA7-11cf-8ADB-00AA00C00905]
@="aahakhchghkhfhaamghhbhbhkbpgfhahlfle"

[HKEY_CLASSES_ROOT\Licenses\6FB38640-6AC7-11cf-8ADB-00AA00C00905]
@="gdjkokgdldikhdddpjkkekgknesjikdkoioh"

[HKEY_CLASSES_ROOT\Licenses\72E67120-5959-11cf-91F6-C2863C385E30]
@="ibcbbbebqbdbciebmcobmbhifcmciibblgmf"

[HKEY_CLASSES_ROOT\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9]

[HKEY_CLASSES_ROOT\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\11.0]

[HKEY_CLASSES_ROOT\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\11.0\Retail]
@="sbbcdcprktpjtapmmfdacmupasbhscddncgp"

[HKEY_CLASSES_ROOT\Licenses\78E1BDD1-9941-11cf-9756-00AA00C00908]
@="yjrjvqkjlqqjnqkjvprqsjnjvkuknjpjtoun"

[HKEY_CLASSES_ROOT\Licenses\7C35CA30-D112-11cf-8E72-00A0C90F26F8]
@="whmhmhohmhiorhkouimhihihwiwinhlosmsl"

[HKEY_CLASSES_ROOT\Licenses\80E80EF0-DBBE-11D0-BCE2-00A0C90DCA10]
@="qijimitpmpnpxplpvjnikpkpqoxjmpkpoivj"

[HKEY_CLASSES_ROOT\Licenses\899B3E80-6AC6-11cf-8ADB-00AA00C00905]
@="wjsjjjlqmjpjrjjjvpqqkqmqukypoqjquoun"

[HKEY_CLASSES_ROOT\Licenses\9E799BF1-8817-11cf-958F-0020AFC28C3B]
@="uqpqnqkjujkjjjjqwktjrjkjtkupsjnjtoun"

[HKEY_CLASSES_ROOT\Licenses\B1EFCCF0-6AC1-11cf-8ADB-00AA00C00905]
@="qqkjvqpqmqjjpqjjvpqqkqmqvkypoqjquoun"

[HKEY_CLASSES_ROOT\Licenses\BC96F860-9928-11cf-8AFA-00AA00C00905]
@="mmimfflflmqmlfffrlnmofhfkgrlmmfmqkqj"

[HKEY_CLASSES_ROOT\Licenses\BEA2ED97-562A-4510-974C-C4F20AE429AD]
"1"=hex:d2,00,57,01,18,01,7e,01,de,00,77,01,a5,00,9a,00,e1,00,16,01,9d,00,f1,\
00,4e,01,73,00,30,01,5c,00,23,01,c5,00

[HKEY_CLASSES_ROOT\Licenses\CDE57A55-8B86-11D0-b3C6-00A0C90AEA82]
@="ekpkhddkjkekpdjkqemkfkldoeoefkfdjfqe"

[HKEY_CLASSES_ROOT\Licenses\CEDD4F80-B43C-11cf-837C-00AA00573EDE]
@="gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz"

[HKEY_CLASSES_ROOT\Licenses\DC4D7920-6AC8-11cf-8ADB-00AA00C00905]
@="iokouhloohrojhhhtnooiokomiwnmohosmsl"

[HKEY_CLASSES_ROOT\Licenses\E32E2733-1BC5-11d0-B8C3-00A0C90DCA10]
@="kmhfimlflmmfpffmsgfmhmimngtghmoflhsg"

[HKEY_CLASSES_ROOT\Licenses\ED4B87C4-9F76-11d1-8BF7-0000F8754DA1]
@="knlggnmntgggrninthpgmnngrhqhnnjnslsh
十豆三 2012-09-11
  • 打赏
  • 举报
回复
Local oWMI As Object,oLocal As Object,oHARDWARE As Object,object1 As Object,lcCPUID,LcMAC,lcHDID,lcSerial
oWMI=Createobject("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer(".", "root\cimv2")

oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
For Each object1 In oHARDWARE
LcIP=object1.Properties_('IPAddress').Value
Exit
Endfor
?'IP地址:',LcIP
taohua300 2012-09-11
  • 打赏
  • 举报
回复
以前用的一段代码,复制保存为getip.prg
DO decl

*| typedef struct _MIB_IPADDRTABLE {
*| DWORD dwNumEntries; // number of entries in the table
*| MIB_IPADDRROW table[ANY_SIZE]; // array of IP address entries
*| } MIB_IPADDRTABLE, *PMIB_IPADDRTABLE; total bytes = 4 + undef

*| typedef struct _MIB_IPADDRROW {
*| DWORD dwAddr; // IP address 0:4
*| DWORD dwIndex; // interface index 4:4
*| DWORD dwMask; // subnet mask 8:4
*| DWORD dwBCastAddr; // broadcast address 12:4
*| DWORD dwReasmSize; // re-assembly size 16:4
*| unsigned short unused1; // not currently used 20:2
*| unsigned short unused2; // not currently used 22:2
*| } MIB_IPADDRROW, *PMIB_IPADDRROW; total bytes = 24
#DEFINE MIB_IPADDRROW_SIZE 24

PRIVATE lWinsockEnabled
lWinsockEnabled = InitWinsock()

LOCAL lcBuffer, lnBufsize, lnEntries, lnIndex, lcEntryBuf
* allocate a space large enough to keep the data
lnBufsize = 8192

lcBuffer = Repli(Chr(0), lnBufsize)
= GetIpAddrTable (@lcBuffer, @lnBufsize, 1)
lnEntries = buf2dword(SUBSTR(lcBuffer, 1,4))

* resulting cursor
CREATE CURSOR cs (ipaddr C(15), iindex N(3), smask C(15),;
bcast C(15), rsize N(12), hostname C(50))

FOR lnIndex = 1 TO lnEntries
lcEntryBuf = SUBSTR(lcBuffer, 5+(lnIndex-1)*MIB_IPADDRROW_SIZE,;
MIB_IPADDRROW_SIZE)
= AddEntry (lcEntryBuf)
ENDFOR

IF lWinsockEnabled
= WSACleanup()
ENDIF

*!* GO TOP
*!* BROW NORMAL NOWAIT
* end of main

PROCEDURE AddEntry (lcEntryBuf)
LOCAL lcIPAddrBuf, lcIPAddr, lcHostName, lnIndex,;
lcMask, lcBCast, lnRSize

* IP address and the host name
lcIPAddrBuf = SUBSTR(lcEntryBuf, 1,4)
lcIPAddr = inet_ntoa(buf2dword(lcIPAddrBuf))
lcHostName = GetHostName(lcIPAddrBuf)

* the index of the interface associated with this IP address
lnIndex = buf2dword(SUBSTR(lcEntryBuf, 5,4))

* the subnet mask for the IP address
lcMask = inet_ntoa(buf2dword(SUBSTR(lcEntryBuf, 9,4)))

* the broadcast address
lcBCast = inet_ntoa(buf2dword(SUBSTR(lcEntryBuf, 13,4)))

* the maximum re-assembly size for received datagrams
lnRSize = buf2dword(SUBSTR(lcEntryBuf, 17,4))

INSERT INTO cs valueS (lcIPAddr, lnIndex, lcMask, lcBCast,;
lnRSize, lcHostName)
RETURN

FUNCTION GetHostName (lcAddrBuf)
#DEFINE AF_INET 2 && internetwork: UDP, TCP, etc.
#DEFINE HOSTENT_SIZE 16
LOCAL lcResult, lnHOSTENTptr, lcHOSTENT
lcResult = ""

IF lWinsockEnabled
lnHOSTENTptr = gethostbyaddr(lcAddrBuf, 4, AF_INET)
IF lnHOSTENTptr <> 0
lcHOSTENT = GetMemBuf (lnHOSTENTptr, HOSTENT_SIZE)
lcResult = GetMemStr(buf2dword(SUBSTR(lcHOSTENT, 1,4)))
ENDIF
ENDIF
RETURN lcResult

FUNCTION InitWinsock()
* Initializing the Winsock service for the application
#DEFINE WSADATA_SIZE 398
#DEFINE WS_VERSION 514 && 0x0202
LOCAL lcWSADATAln, lnInitResult
lcWSADATA = Repli(Chr(0), WSADATA_SIZE)
lnInitResult = WSAStartup (WS_VERSION, @lcWSADATA)
RETURN (lnInitResult = 0)

FUNCTION GetMemBuf (lnAddr, lnBufsize)
* returning data from a memory block
LOCAL lcBuffer
lcBuffer = Repli(Chr(0), lnBufsize)
= Heap2Str (@lcBuffer, lnAddr, lnBufsize)
RETURN lcBuffer

FUNCTION GetMemStr (lnAddr)
* returning data from a memory block
* before the first occurence of a zero byte
LOCAL lcBuffer
lcBuffer = GetMemBuf (lnAddr, 250)
RETURN SUBSTR(lcBuffer, 1, AT(Chr(0),lcBuffer)-1)

FUNCTION buf2dword (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(lcBuffer, 4,1)) * 16777216

PROCEDURE decl
DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
DECLARE INTEGER WSACleanup IN ws2_32
DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING @lpWSAData

DECLARE INTEGER gethostbyaddr IN ws2_32;
STRING addr, INTEGER len, INTEGER type

DECLARE RtlMoveMemory IN kernel32 As Heap2Str;
STRING @Dest, INTEGER Src, INTEGER nLength

DECLARE INTEGER GetIpAddrTable IN iphlpapi;
STRING @pIpAddrTable, INTEGER @pdwSize, INTEGER bOrder



调用:
因为一个机器有时候要设置多个ip
所以用循环来取出
getip()
GO TOP
cIp = '|'
FOR i = 1 TO RECCOUNT('cs')
GO (i)
IF LEFT(ALLTRIM(cs.ipaddr),3) != '127' &&本机保留ip地址不要,即127.0.0.1
cIp = cIp + ALLTRIM(cs.ipaddr) + '|'
ENDIF
NEXT

cIp 中保存的就是以|分割的ip地址串

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧