关于使用Modem的一个问题!痛苦!

singsing26 2005-06-14 09:50:35
我个人要编写一个拨号程序.程序要求当Modem正在使用的时候不进行拨号.
现在问题出现的,就是怎样判断Modem正在使用的问题.
例如我有其它程序(如NetTerm)正在使用Modem进行连接,这个时候我就不需要进行拨号.
那如何判断Modem正在使用呢?
我的Modem是外置的,使用com1.
我曾使用FileOpen("COM1",fmOpenReadWrite);来判断,但好像完全没有效果.
我也试过使用InternetConnectionState来测试,也是没有效果.
请问各位大虾有什么方法可以判断Modem正在使用.
PS:还有另外一个问题,当MODEM吊死的时候听说可以通过复位COM1(我的MODEM外置在COM1)来实现软重启,请问用什么方法来实现复位COM1呢?难道是用FileOpen然后FileClose?我试过好像没有什么用?
...全文
236 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
singsing26 2005-07-02
  • 打赏
  • 举报
回复
第三方控件啊?
能不能纯BCB代码,不使用其它方控件呢?
magicdu 2005-07-02
  • 打赏
  • 举报
回复
你可以使用SPCOMM控件,控件中有个method可以进行判断。而且还有SOURCE CODE。
singsing26 2005-07-01
  • 打赏
  • 举报
回复
UP一下
jadeluo 2005-06-24
  • 打赏
  • 举报
回复
当然不是要用报错来确定Modem是否在使用
串口不能打开的错误(其实不会抛出异常)是能被代码捕获了。
singsing26 2005-06-24
  • 打赏
  • 举报
回复
难道要用报错来确定Modem是否在使用?
我想在拨号前进行检测耶!
jadeluo 2005-06-22
  • 打赏
  • 举报
回复
=============================================================================
例如我有其它程序(如NetTerm)正在使用Modem进行连接,这个时候我就不需要进行拨号.
=============================================================================

我想问楼主的问题是: 如果有一个程序正在使用Modem, 那么还能有第二个程序能打开这个Modem的端口(串口)而去拨号吗?

在Windows中串口是不能共享的, 第二个程序会因为无法打开的这个串口而报错的。
singsing26 2005-06-20
  • 打赏
  • 举报
回复
我已经建立了一个拨号连接了
只不过是在特定的情况下才不进行拨号。
Pasp 2005-06-19
  • 打赏
  • 举报
回复
看看TAPI的用户手册,对你会很有帮助
ktcserver 2005-06-19
  • 打赏
  • 举报
回复
modem与计算机连接并不是说串口打开了就连接上了,关键是看DTS状态是否为高位,也就是是否modem是否已经准备好了可以传输数据了,你可以看看关于串口连接的书,CB的好像就有一本哦。
sczyq 2005-06-19
  • 打赏
  • 举报
回复
楼主的做法,最好要先建立一个拔号连接,然后依据这个连接名来识别当前MODEN状态。

若使用 OpenFile 打开COM1的做法,难度会很高,而且必须熟悉MODEN的AT指令,AT命令估计也能查询到状态,只是不敢妄说。
sczyq 2005-06-19
  • 打赏
  • 举报
回复
// 引自:http://cdlist.diy.myrice.com/note/doc2k07/VC_Dial.htm

VC++实现拨号上网程序

大家知道,在Netants、DownLoad Expert等软件中都带有定时拨
号上网下载软件的功能。而一般用户的拨号上网,利用的是Windows
的Remote Access Service(RAS,远程访问服务)。下面介绍一下其
在Visual C++下的实现。
  Visual C++为我们提供了包含RAS API声明的“ras.h″头文件
。要在程序中实现拨号上网功能,其大致过程如下:
  1.利用Modem拨号进行连接,应使用RasDial函数。
  其声明如下:
  DWORD Ras Dial(LPRASDIALEXTENSIONS lpRas DialExtensions,LPCTSTR
lpszPhonebook,LPRASDIALPARAMS lp Ras DialParams,DWORD dw Notifier
Type,LPVOID lpv Notifier,
  LPHRASCONN lph Ras Conn )
  参数说明:
  lpRasDialExtensions和lpszPhonebook:仅在Windows NT下有效,
在Windows 95下,这两个参数被忽略。
  lpRasDialParams:这个参数很重要,它指向一个RASDIALPARAMS
结构,该结构包含以下几个成员:
  dwSize:应设定为sizeof(RASDIALPARAMS);
  szEntryName和szPhoneNumber:这两个参数有联系,szEntryName
可以指定要建立的连接,比方说“我的连接”等等,这是处理用户已
经在“拨号网络”里建立的连接的。这时,Modem将拨打你在“我的
连接”中设定的ISP号码,此时szPhoneNumber成员设为空字符串“”
即可;如果你要在程序中自行指定要拨打的ISP号码的话,szEntryName
可以设定为空字符串“”,此时应设置szPhoneNumber为你的ISP号码
(169,663等),特别的,对于用201电话卡来上网的情况,可以设
为“201,,,账号,密码#,,ISP号码#”(其中“,”表示停顿一
段时间(以等待确认账号,密码等),你可以根据自己所在位置的线
路状况自行调节。
  SzCallBackNumber,szDomain:设为空串“”即可。
  SzUserName,szPassword:登录用户名和密码。如169公用账号guest,guest

  其他成员不必设置。
  DwNotifierType:指定是由窗口还是由回调函数来处理确认消息
。通过确认消息我们可以得到RasDial过程的当前状态。如“正在打
开段口”,“正在验证用户名和密码”等。也可设为NULL。
  dwNotifier:指定处理确认消息的窗口或回调函数。也可设为NULL

  LphRasConn:指向一个类型为HRASCONN的变量。在调用RasDial
前必须指定为NULL,RasDial若成功返回,则将RAS连接的句柄存放于
它所指向的变量中。我们也可以通过此句柄来断开连接。
  只要在程序中适当位置调用RasDial函数即可建立连接。
  2.理确认消息以得到拨号过程的当前状态。
  我们以指定窗口来处理确认消息为例说明如何得到拨号过程的当
前状态。
  在处理确认消息的对话框类(或视图类等)的实现代码中加入:
  const UINT WM_RASEVENT = ::RegisterWindowMessageA(RASDIALEVENT);
  在Message Map中手工加入消息映射:(****是你定义的对话
框类名称)
  BEGIN_MESSAGE_MAP(****, CDialog)
  //AFX_MSG_MAP(****)
  ……
  ON_REGISTERED_MESSAGE(WM_RASEVENT, OnRasDialEvent)(<-
加入此句)
  //AFX_MSG_MAP
  END_MESSAGE_MAP()
  加入成员函数处理消息:
  LRESULT CDialInfo::OnRasDialEvent(WPARAM wp, LPARAM lp)

  {
  RASCONNSTATE rasstate= (RASCONNSTATE)wp;
  CListBox*info =(CListBox*)GetDlgItem(IDC_INFOLIST);
  //用ListBox控件(ID为IDC-INFOLIST)来显示状态)
  switch(rasstate)
  {
  case RASCS_OpenPort:
  info→AddString(_T(″打开端口……″));
  break;
  case RASCS_PortOpened:
  info→AddString(_T(″端口已打开.″));
  break;
  case RASCS_ConnectDevice:
  info→AddString(_T(″连接设备……″));
  break;
  case RASCS_DeviceConnected:
  info→AddString(_T(″设备已连接.″));
  break;
  case RASCS_Authenticate:
  info→AddString(_T(″验证用户及密码″));
  break;
  case RASCS_Authenticated:
  info→AddString(_T(″通过″));
  break;
  case RASCS_Connected:
  info->AddString(_T(″已连接″));
  reak;
  case RASCS_Disconnected:
  info->AddString(_T(″连接已断开″));
  m_hRasConn=NULL;
  //可定义类型为HRASCONN的成员变量m_hRasConn来保存RAS连接
的句柄。
  //在调用RasDial时用指向m_hRasConn的指针作为lphRasConn参
数。
  //既然用m_hRasConn来保存连接句柄,连接断开后应重置为NULL.

  break;
  default:
  return (LRESULT)0;
  }
  return (LRESULT)0;
  }
  3.断开连接:
  if (m_hRasConn != NULL)
  {
  RasHangUp(m_hRasConn);
  m_hRasConn = NULL;
  m_OnDial=TRUE;
  :Sleep(2000);
  }
  注意:
  你也许注意到了以上代码中的Sleep函数,这里是必需的。需要
一定时间来断开连接。如果不等待一段时间,计算机有可能无法正常
关闭端口。导致下一次无法拨号,只有重新启动Windows才能解决。
要预防此问题也可以调用RasGetConnectStatus函数,方法如下:
  RASCONNSTATUS rStatus;
  while(RasGetConnectStatus(m_hRasConn,&rStatus)!=ERROR_INVALID_HANDLE)
  {
  ::Sleep(0);
  }
  4.在以下情况下:
  ①浏览网页时有时会出现停止响应,重启explorer后任务栏上的
连接状态图标也许会消失。
  ②希望在连接成功后,退出程序,再次执行此程序可选择断开连
接。
  可以调用RasEnumConnection函数来得到当前连接的句柄。
  举例如下:
  HRASCONN hRasConnect;DWORD dwBuffferSize, dwNumofConnections;//
缓冲区大小,连接数
  LPRASCONN lpRasConn;
  lpRasConn = new RASCONN[3];//最多可得到3个连接句柄,客
户端程序其实不必设为3,因连接数有限,大部分仅一个连接。
  lpRasConn[0].dwSize = sizeof(RASCONN);
  dwBuffferSize = 32*sizeof(RASCONN);//求出由3个RASCONN结
构构成的缓冲区大小
  RasEnumConnections(lpRas Conn,&dw Buffer Size,&dw Numof
Connections);//此函数若成功则返回零。
  for(DWORD i=0; i  {
  hRasConnect = lpRasConn[i].hrasconn;//RASCONN结构的hrasconn
成员为RAS连接句柄
  RasHangUp(hRasConnect);
  ::Sleep(2000);
  }
  delete[]lpRasConn;
  在Windows 98,Visual C++6.0下调试通过。
  这样,一个实现基本拨号上网功能的程序就完成了。如果你要了
解更多有关情况或服务器端程序设计,可以参考MSDN→Platform SDK
→Networking and Distributed Services→Remote Access Service
的有关内容。
singsing26 2005-06-18
  • 打赏
  • 举报
回复
不是吧!
大侠们都去哪里了
难道都去和他们的老爸庆祝去了?
singsing26 2005-06-17
  • 打赏
  • 举报
回复
modem是否连通?
我的是外置的,我看他们说外置是使用FileOpen来操作串口的!
那到底怎样啊?
有没有一些函数的说明啊?
singsing26 2005-06-16
  • 打赏
  • 举报
回复
不是吧!
这么多天了,连一个人都没有?
happyct 2005-06-16
  • 打赏
  • 举报
回复
要查询其是否“正在拨号”,不会...这个过程,如果能查询其工作状态的话,我想也是由modem本身是否支持来决定吧?(个人理解)

你不如先查询一下Modem是否连通(这个变通方法很多)来决定好了

singsing26 2005-06-15
  • 打赏
  • 举报
回复
不是吧!!
没有人理睬我?
singsing26 2005-06-14
  • 打赏
  • 举报
回复
自己先顶一下!
各位大虾要帮帮我啊1

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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