编程论坛
注册
登录
编程论坛
→
VB6论坛
VB窗体损坏怎么办
leziyi
发布于 2018-12-05 20:08, 2231 次点击
我在帮同学开发一个防火墙,有一天我按Ctrl+S保存程序,关掉电脑睡觉
第二天起来打开程序提示主窗体加载错误,我点确认,一看工程资源管理器,主窗体不翼而飞,用记事本打开主窗体文件一看,文件空了,但资源管理器里显示有21KB大小
请各位兄弟帮忙解决一下,下附附件:
只有本站会员才能查看附件,请
登录
7 回复
#2
wmf2014
2018-12-05 20:52
没办法,FrmMain.frm填充的是全0。
自己开发的,重写也不难吧。
#3
ZHRXJR
2018-12-06 10:43
Ctrl+S 是保存当前活动窗体或模块,Ctrl+V 是保存工程,保存全部窗体模块及工程文件 *.vbp,你是保存了一个窗体或模块,而没有保存工程,因此其他不活动的窗体或模块肯定没有保存。
ClsLog.cls类模块、FrmLog.frm窗体、FrmMain.frm窗体、FrmMenu.frm窗体、FrmOption.frm窗体均没有保存,并且 FrmMain.frm窗体连基本窗体都没有。 可能仅仅保存的是 ModNetstat.bas 模块。
程序文件中的ClsLog.cls类模块、FrmLog.frm窗体、FrmMain.frm窗体、FrmMenu.frm窗体、FrmOption.frm窗体 是以前保存的,有些窗体有一点内容,有些窗体一点内容都没有。
现在没有任何办法恢复,只能重新做了。
#4
leziyi
2018-12-06 20:51
顺便帮忙看一下这段代码:
程序代码:
Call
GetTcpTable(ByVal0&, cbRequired,
1
)
显示错误:用户定义类型不能用
改成ByRef后显示错误:用户类型未定义
#5
ZHRXJR
2018-12-07 09:09
Call GetTcpTable(ByVal0&, cbRequired, 1)
GetTcpTable 可能是一个过程或一个函数,这里是调用这个过程或函数,在调用时的参数是变量名或具体的值,不能在调用时再次声明变量的数据类型。
你这个过程或函数有三个参数 ByVal0&, cbRequired, 1,第一个参数后面带 & 号,系统认为你重新声明变量的数据类型,所以发生错误。ByVal0 是变量名!
由于没有看到你的具体的过程或函数,其他就不清楚了。至于 ByVal 与 ByRef 传递方式是在过程或函数中体现的,不能在调用中体现。
#6
leziyi
2018-12-07 12:41
函数声明:
程序代码:
'
GetTcpTable函数能返回当前系统中全部有效的 TCP连接
Declare
Function
GetTcpTable
Lib
"
iphlpapi.dll
"
(
ByRef
pTcpTable
As
MIB_TCPTABLE,
ByRef
pdwSize
As
Long
,
ByVal
bOrder
As
Long
)
As
Long
程序代码:
Call
GetTcpTable(
ByVal
0
&, cbRequired,
1
)
#7
ZHRXJR
2018-12-08 09:35
哎,你调用函数的语句估计是错误的,因为函数 GetTcpTable 在声明时有三个参数 pTcpTable 参数的数据类型是:MIB_TCPTABLE,按地址传递的; pdwSize 参数的数据类型是: Long, 按地址传递的; bOrder 参数的数据类型是: Long,是按值传递的。
而你在调用时,改变了第一个参数的传递方式与数据类型,肯定要发生错误。
我认为应该是这样:
你可以在 API 浏览器 中查询 GetTcpTable 函数的声明语句,但我没有查到API有这个函数,如图:
只有本站会员才能查看附件,请
登录
#8
leziyi
2018-12-08 11:09
帮忙看一下:
Private Sub GetTcpDatas()
Dim tcpt As MIB_TCPTABLE
Dim TcpRow As MIB_TCPROW
Dim Buffer() As Byte
Dim LngRequired As Long
Dim LngStructureSize As Long
Dim LngRows As Long
Dim LngCounter As Long
Dim strTemps As String
Dim ListX As ListItem
LvwTcpTable.ListItems.Clear
GetTcpTable tcpt, LngRequired, 1
If LngRequired > 0 Then
ReDim Buffer(0 To LngRequired - 1) As Byte
If GetTcpTable(
Buffer
(0), LngRequired, 1) = ERROR_SUCCESS Then
LngStructureSize = LenB(TcpRow)
'起始的四个字节,是做为表示进入点的数字
CopyMemory LngRows, Buffer(0), 4
For LngCounter = 1 To LngRows
' 将上述获得四个字节的相关数据,拷贝到 TcpRow 的结构之中
CopyMemory TcpRow, Buffer(4 + (LngCounter - 1) * LngStructureSize), LngStructureSize
' 将结果传送到 ListView 之中
With TcpRow
Set ListX = ListView1.ListItems.Add(, , GetInetAddrStr(.dwLocalAddr))
ListX.SubItems(1) = ntohs(.dwLocalPort)
ListX.SubItems(2) = GetInetAddrStr(.dwRemoteAddr)
ListX.SubItems(3) = ntohs(.dwRemotePort)
ListX.SubItems(4) = (.dwState)
Select Case .dwState
Case MIB_TCP_STATE_CLOSE_WAIT: strTemps = "结束等待"
Case MIB_TCP_STATE_CLOSED: strTemps = "已结束"
Case MIB_TCP_STATE_CLOSING: strTemps = "结束中..."
Case MIB_TCP_STATE_DELETE_TCB: strTemps = "已删除TCB"
Case MIB_TCP_STATE_ESTAB: strTemps = "已连接"
Case MIB_TCP_STATE_FIN_WAIT1: strTemps = "FIN延时处理1"
Case MIB_TCP_STATE_FIN_WAIT2: strTemps = "FIN延时处理2"
Case MIB_TCP_STATE_LAST_ACK: strTemps = "上次取得的确认信号"
Case MIB_TCP_STATE_LISTEN: strTemps = "监听中..."
Case MIB_TCP_STATE_SYN_SENT: strTemps = "传送"
Case MIB_TCP_STATE_SYN_RCVD: strTemps = "数据接收中"
Case MIB_TCP_STATE_TIME_WAIT: strTemps = "等候中..."
End Select
ListX.SubItems(4) = ListX.SubItems(4) & "(" & strTemps & ")"
strTemps = ""
End With
Next
End If
End If
End Sub
---------------------------
Microsoft Visual Basic
---------------------------
编译错误:
ByRef 参数类型不符
---------------------------
确定 帮助
---------------------------
1