| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 674 人关注过本帖
标题:请教怎么在VFP里触发一次网络通讯?
只看楼主 加入收藏
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:528
专家分:748
注 册:2019-10-11
收藏
已结贴  问题点数:20 回复次数:24 
请教怎么在VFP里触发一次网络通讯?
目前我是用这个方式触发一次网络访问,不知道还有没有更简洁的方法
test=CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
test.OPEN("get","http://www.baidu.com",.F.)
test.SEND
LOCAL dwSize, stTable, nTableCount, dwLocalAddr, dwOwningPid,szLocalAddr,CurrentProcessId,ii
store "0.0.0.0" TO dwLocalAddr
Declare Integer GetCurrentProcessId In kernel32.Dll
DECLARE LONG GetExtendedTcpTable IN "Iphlpapi.dll" STRING@, LONG@, LONG, LONG, LONG, LONG
DECLARE LONG inet_ntoa IN "Ws2_32" LONG
DECLARE LONG ntohs IN "Ws2_32" LONG
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE Long GetModuleFileNameEx IN PsApi Long hProcess, Long hModule, String @ lpExename, Long dwSize
DECLARE Long OpenProcess IN WIN32API Long dwDesiredAccess, Long bInheritHandle, Long dwProcessId
CurrentProcessId=GetCurrentProcessId()
dwSize=0
GetExtendedTcpTable(NULL, @dwSize, 1, 2, 5, 0) && TCP_TABLE_OWNER_PID_ALL
IF m.dwSize > 0
    stTable = REPLICATE(0h0, m.dwSize) && 分配数据空间
    GetExtendedTcpTable(@stTable, @dwSize, 1, 2, 5, 0)
    nTableCount = CTOBIN(SUBSTR(m.stTable, 1, 4), "4Rs")
    IF m.nTableCount > 0
        stTable = STUFF(m.stTable, 1, 4, "")
        FOR ii = 1 TO m.nTableCount
            szLocalAddr = CTOBIN(SUBSTR(m.stTable, 5, 4), "4R")+2^31 && 本地 IP地址
            szLocalAddr = SYS(2600, inet_ntoa(m.szLocalAddr), 16)
            szLocalAddr = LEFT(szLocalAddr, AT(0h00, m.szLocalAddr)-1)
            dwOwningPid = CTOBIN(SUBSTR(m.stTable, 21, 4), "4R")+2^31 && 关联的进程ID
            IF m.CurrentProcessId=m.dwOwningPid
                dwLocalAddr=m.szLocalAddr
                exit
            endif
            stTable = STUFF(m.stTable, 1, 24, "")
        NEXT
    ENDIF
ENDIF
retu m.dwLocalAddr

[此贴子已经被作者于2026-6-2 11:38编辑过]

收到的鲜花
  • kangss2026-06-02 14:41 送鲜花  1朵  
搜索更多相关主题的帖子: 触发 test VFP LONG 网络 
2026-06-02 11:02
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11447
专家分:43658
注 册:2014-5-20
收藏
得分:0 
好像是获取连接的本端和远端IP和端口
2026-06-02 12:00
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:528
专家分:748
注 册:2019-10-11
收藏
得分:0 
是的
2026-06-02 14:28
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:528
专家分:748
注 册:2019-10-11
收藏
得分:0 
如果本地有两块网卡,就知道是通过哪块网卡访问了网络
2026-06-02 14:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11447
专家分:43658
注 册:2014-5-20
收藏
得分:10 
远端也可以用 cmd 命令:
ping -4 www.baidu.com

本地用 ipconfig
2026-06-02 16:02
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:528
专家分:748
注 册:2019-10-11
收藏
得分:0 
回复 5楼 吹水佬
ping好像不行,不算是本应用程序发起的网络访问,ipconfig不知道在装有两块网卡的机器上会是什么结果

[此贴子已经被作者于2026-6-2 16:44编辑过]

2026-06-02 16:43
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11447
专家分:43658
注 册:2014-5-20
收藏
得分:0 
在你的进程中执行 cmd 命令算是本程序发起的吧?
2026-06-02 17:02
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:528
专家分:748
注 册:2019-10-11
收藏
得分:0 
不算,我刚才试过了,我用的是下面的函数,稍等我直接cmd试试,直接cmd也不算
IF CreateProcess(null,cmd,NULL,NULL,1,CREATE_NO_WINDOW,NULL,null,@si,@pi) == 0


[此贴子已经被作者于2026-6-2 17:16编辑过]

2026-06-02 17:12
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:528
专家分:748
注 册:2019-10-11
收藏
得分:0 
aa="!cmd/c ping -4 www.baidu.com"
&aa
LOCAL dwSize, stTable, nTableCount, dwLocalAddr, dwOwningPid,szLocalAddr,CurrentProcessId,ii
store "0.0.0.0" TO dwLocalAddr
Declare Integer GetCurrentProcessId In kernel32.Dll
DECLARE LONG GetExtendedTcpTable IN "Iphlpapi.dll" STRING@, LONG@, LONG, LONG, LONG, LONG
DECLARE LONG inet_ntoa IN "Ws2_32" LONG
DECLARE LONG ntohs IN "Ws2_32" LONG
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE Long GetModuleFileNameEx IN PsApi Long hProcess, Long hModule, String @ lpExename, Long dwSize
DECLARE Long OpenProcess IN WIN32API Long dwDesiredAccess, Long bInheritHandle, Long dwProcessId
CurrentProcessId=GetCurrentProcessId()
dwSize=0
GetExtendedTcpTable(NULL, @dwSize, 1, 2, 5, 0) && TCP_TABLE_OWNER_PID_ALL
IF m.dwSize > 0
    stTable = REPLICATE(0h0, m.dwSize) && 分配数据空间
    GetExtendedTcpTable(@stTable, @dwSize, 1, 2, 5, 0)
    nTableCount = CTOBIN(SUBSTR(m.stTable, 1, 4), "4Rs")
    IF m.nTableCount > 0
        stTable = STUFF(m.stTable, 1, 4, "")
        FOR ii = 1 TO m.nTableCount
            szLocalAddr = CTOBIN(SUBSTR(m.stTable, 5, 4), "4R")+2^31 && 本地 IP地址
            szLocalAddr = SYS(2600, inet_ntoa(m.szLocalAddr), 16)
            szLocalAddr = LEFT(szLocalAddr, AT(0h00, m.szLocalAddr)-1)
            dwOwningPid = CTOBIN(SUBSTR(m.stTable, 21, 4), "4R")+2^31 && 关联的进程ID
            IF m.CurrentProcessId=m.dwOwningPid
                dwLocalAddr=m.szLocalAddr
                exit
            endif
            stTable = STUFF(m.stTable, 1, 24, "")
        NEXT
    ENDIF
ENDIF
retu m.dwLocalAddr
返回0.0.0.0
2026-06-02 17:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11447
专家分:43658
注 册:2014-5-20
收藏
得分:0 
你是要获取进程的网络连接信息吧,那就不只是要本地和远端IP。
2026-06-02 17:48
快速回复:请教怎么在VFP里触发一次网络通讯?
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019217 second(s), 10 queries.
Copyright©2004-2026, BCCN.NET, All Rights Reserved