rasdial在ide成功拨号,编译成exe一拨号就崩溃

lmhcs 2008-10-16 01:43:20
好痛苦的感觉。明明在vb ide代码没有问题,也能编译出来exe程序,但一运行编译好的程序就出错,说遇到问题要关闭,如果处于进程中可能丢失数据。。。。。
查了很久很久,都查不多错误。。。快疯了

Public Function rasDialUp(sLinkName As String, sDIP As String, sUserName As String, sPassWord As String) As Boolean
Dim rasEiffo As RasEapInfo, rasEx As RASDIALEXTENSIONS, rasDialP As RASDIALPARAMS
Dim ret As Long

With rasEx
.dwSize = LenB(rasEx)
.dwfOptions = RDEOPT_PausedStates
.hwndParent = 0
.RasEapInfo = rasEiffo
.reserved = 0
.reserved1 = 0
End With
Dim len5 As Long, i As Long
len5 = LenB(rasDialP)
i = (4 - (len5 Mod 4)) Mod 4
With rasDialP
.dwSize = LenB(rasDialP) ' 1052
'.dwSize = len5 + i '1052'好奇怪的,不懂为什么要这样
CopyMemory .szPhoneNumber(0), ByVal sDIP, Len(sDIP)
CopyMemory .szUserName(0), ByVal sUserName, Len(sUserName)
CopyMemory .szPassword(0), ByVal sPassWord, Len(sPassWord)
CopyMemory .szEntryName(0), ByVal sLinkName, Len(sLinkName)

End With
frmDialState.Show‘这个是一个显示拨号进程的窗体,模拟xp那个样子的
'用回调函数
lphRasConn = 0
ret = RasDial(rasEx, vbNullString, rasDialP, 0, AddressOf RasDialFunc, lphRasConn)’异步拨号
'MsgBox RasDial(rasEx, vbNullString, rasDialP, 0&, 0&, lphRasConn)‘同步


End Function

这个函数是异步拨号,放在一个类模块中
下面是回调函数

Public Sub RasDialFunc(ByVal unMsg As Long, ByVal ConnState As Long, ByVal dwError As Long)
Dim s As String
s = getRasConningInfo(ConnState)

Select Case ConnState
Case 0 To 23
frmDialState.Label1.Caption = s
form1.Print ConnState Mod 3
frmDialState.Caption = "正在拨号" & Choose((ConnState Mod 3), ".", "..", "...")
Case RASCS_PAUSED To RASCS_PAUSED + 3
frmDialState.Label1.Caption = s
frmDialState.Caption = "正处于暂停状态"
Case RASCS_DONE '连接成功
frmDialState.Caption = "拨号成功"
frmDialState.Label1.Caption = s
'显示托盘消息
TrayAddIcon form1.ImageList1.ListImages(3).Picture.Handle
TrayPopUpInfo NIIF_INFO, "互连通", "互连通已经成功连接上高速网络" & vbCrLf & "你可以安冲浪了!", 8

Case RASCS_DONE + 1 '连接失败
frmDialState.Caption = "拨号失败"
frmDialState.Label1.Caption = s
'显示托盘消息
TrayAddIcon form1.ImageList1.ListImages(4).Picture.Handle
TrayPopUpInfo NIIF_INFO, "互连通", "拨号失败!错误码:" & dwError, 8
End Select

End Sub

'获得状态中文说明
Public Function getRasConningInfo(ByVal rasState As RASConnState) As String
Dim sState() As String, s$
s = "即将打开一个通信端口,通信端口已打开,准备与一个连接,已经成功连接设备,物理连接已建立,RAS身份验证进程已开始,运行身份验证事件已发生,运行服务器已请求尝试另一个身份验证,运行服务器已请求一个回拨号码,运行客户机已请求改变 RAS 账号上的密码,运行协议发送准备进行,链接速度正在计算过程中,身份验证据请求正在确认过程中,回拨之后的身份验证进程准备开始,客户机已成功结束身份验证,线路即将取消连接,准备回拨,准备回拨之前,客户机等待Modem的重新设置,客户机等待服务器发出的接入拨号,协议发送已完成,用户身份验证已开始或已完成,已经回拨客户机,客户机正在登录远程网络,多链路电话簿条目的子条目已接入?RasDialFunc2的dwSubEntry参数中将包括一个已连接子条目的索引,多链路电话簿条目已取消连接?RasDialFunc2的dwSubEntry参数中将包含这个已取消连接的子条目的索引,RASCS_Interactive,RasDial正在等待新的用户凭据,RasDial正在等待客户机的回拨号码,RasDial希望用户提供一个新密码,RAS连接成功,处于活动状态,RAS连接失败或处于不活动状态"
sState = Split(s, ",")
If rasState >= RASCS_PAUSED Then
If rasState >= RASCS_DONE Then
rasState = rasState - RASCS_DONE + 28
Else
rasState = rasState - RASCS_PAUSED + 24
End If
End If
getRasConningInfo = sState(rasState)
End Function



rasdial 我是这么声明的:
Private Declare Function RasDial Lib "rasapi32.dll" Alias "RasDialA" (ByRef lpRasDialExtensions As RASDIALEXTENSIONS, ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByVal dword As Long, ByVal lpvoid As Long, ByRef lphRasConn As Long) As Long

...全文
222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
迈克揉索芙特 2008-10-16
  • 打赏
  • 举报
回复
拨号、断网、枚举连接名称,判断是否在线、连接方式。
http://blog.csdn.net/Modest/archive/2006/10/20/1342633.aspx
lmhcs 2008-10-16
  • 打赏
  • 举报
回复
搞定了,只是不明白 getRasConningInfo 这个函数放在rasdialfun回调里面为什么会出错。
lmhcs 2008-10-16
  • 打赏
  • 举报
回复
先谢谢Modest 的热心拉,这里可以上传附件吗?我可以把代码传上来。
经过不断的测试,发现只要注释掉getRasConningInfo自定义函数里面的内容,就不会出错,可是getRasConningInfo 函数看起来没有问题啊,难道是不停赋值操作出问题?
现在还是人类 2008-10-16
  • 打赏
  • 举报
回复
我记得我的一个程序,用了N个钩子,有收关机信息的,有异步Winsock的,有托盘的,还有鼠标滚轮的,还有滚动条的。
呵呵,特别是收关机信息的,因为没有封装,经常出错,后来我调试的时候就屏蔽掉拦截关机信息的钩子,编译的时候才
开放他。其他封装好的到没什么问题。

你最好注意一下,托盘程序最好封装一下,还有Microsoft的范例其实我感觉不是很好,特别是在钩子函数取得托盘类对
象的时候,感觉方法不是很好,可以改良一下,其实主要就是类地址传递的渠道问题。
迈克揉索芙特 2008-10-16
  • 打赏
  • 举报
回复
把完整代码贴上来,带声明的。我帮你调试一下。
lmhcs 2008-10-16
  • 打赏
  • 举报
回复
SupermanKing 说的也许是个好主意。唉呀。我之前已经调试好了,后来程序写复杂,忽然发现编译好的exe居然不能运行,但已经查不出错误在哪里,上面的回调也不用钩子的,回调函数我重新写,条理算很清晰了,不过,都不知道错误在哪里。Tray开头是我写模块的操作托盘系列函数,倒是用子类化技术,不过我现在把所有托盘函数注释掉,也会出错。很郁闷。
lmhcs 2008-10-16
  • 打赏
  • 举报
回复
呵呵,我郁闷的是,我把所有非拨号都注释掉了,只留个拨号,还是不行,但ide环境都没有错,编辑出来了,都不知道代码运行到哪里出错,感觉是RasDialFunc回调函数有问题,因为,我该为同步拨号就不会问题了。可是我研究很久,异步代码都没有问题啊。而且,ide环境都没有问题啊,可以正常拨号阿。


谢谢 Modest ,我之前就是用InternetDial函数拨号,后来才改用ras系列函数拨号的。ras系列函数感觉好用些,虽然难点,但实用。
现在还是人类 2008-10-16
  • 打赏
  • 举报
回复
说到拨号上网,WMI应该也可以实现这样的操作,你可以看看这方面的资料。
毕竟VB调用WMI,用起来要比用钩子来得稳定,特别是在VB里调试,如果多用
几个钩子或忘记SetWindowLong回来,VB经常崩溃。不过WMI速度不是很快
到是,呵呵。
内容概要:本文系统介绍了基于核主成分分析(KPCA)的故障检测方法,重点实现了T²和Q统计指数的可视化,并提供了完整的Matlab代码实现与仿真分析流程。该方法通过核函数映射将原始非线性过程数据转换至高维特征空间,进行主成分提取与降维处理,进而构建T²和Q两种统计量用于监控系统运行状态,有效识别工业过程中的早期故障与异常行为。文中详细阐述了KPCA的数学原理、故障检测机制、控制限计算方法,并结合实际案例展示其在复杂非线性系统中的应用效果与优越性,具有较强的工程实用性。; 适合人群:具备一定信号处理、机器学习理论基础及Matlab编程能力的研究生、科研人员和工程技术人员,特别适用于从事工业过程监控、故障诊断、智能制造等相关领域的研究人员。; 使用场景及目标:①应用于化工、电力、制造等行业中关键设备的在线故障监测与早期预警;②作为学术研究中非线性降维与异常检测算法的对比基准;③帮助开发者掌握KPCA模型构建、参数调优及T²-Q统计图可视化等核心技术环节。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解KPCA算法的核心步骤,重点关注核函数选择、主成分数确定及统计量阈值设定等关键参数的影响,以提升故障检测的灵敏度与准确性。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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