% 为什么我的问题总是够冷门? % RasDial拨号为何时常找不到modem? 报错797 ( 积分: 100 )

S

someset

Unregistered / Unconfirmed
GUEST, unregistred user!
我用RasDial拨号,常常会发生这样的错误
"连接失败,因为没有找到调制解调器(或其它连接设备)。请确认安装了调制解调器(或其它连接设备)。"RasDial返回错误号码797。
一会儿可能又正常了。因为我的程序是会不断重新试图拨号的,一次没成功往往(并非绝对)后面几次都不成功。可是用系统的拨号功能成功率就比我的程序高得多,至少不会说找不到调制解调器。问题会出在哪儿呢?

我的部分代码如下,异步调用
DWORD __fastcall RasConnUtil::SynthRasDial(LPRASDIALPARAMS lpparams)
{
RasStatus = RasDial(NULL, NULL, lpparams, 0, RasDialFunc, &hrasconn);
if (RasStatus != 0)
return RasStatus;
RasStatus = 0xffffffff;
while (RasStatus == 0xffffffff)
{
SendMessage(NotifyWnd, NotifyMsg, 0, 0);
};
return RasStatus;
}

void WINAPI RasConnUtil::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
if (dwError != 0)
RasStatus = dwError;
else
if (rasconnstate == RASCS_Connected)
RasStatus = 0;
}
 
我用RasDial拨号,常常会发生这样的错误
"连接失败,因为没有找到调制解调器(或其它连接设备)。请确认安装了调制解调器(或其它连接设备)。"RasDial返回错误号码797。
一会儿可能又正常了。因为我的程序是会不断重新试图拨号的,一次没成功往往(并非绝对)后面几次都不成功。可是用系统的拨号功能成功率就比我的程序高得多,至少不会说找不到调制解调器。问题会出在哪儿呢?

我的部分代码如下,异步调用
DWORD __fastcall RasConnUtil::SynthRasDial(LPRASDIALPARAMS lpparams)
{
RasStatus = RasDial(NULL, NULL, lpparams, 0, RasDialFunc, &hrasconn);
if (RasStatus != 0)
return RasStatus;
RasStatus = 0xffffffff;
while (RasStatus == 0xffffffff)
{
SendMessage(NotifyWnd, NotifyMsg, 0, 0);
};
return RasStatus;
}

void WINAPI RasConnUtil::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
if (dwError != 0)
RasStatus = dwError;
else
if (rasconnstate == RASCS_Connected)
RasStatus = 0;
}
 
内猫外猫?
有的外猫开机后不能直接用,要在设备管理器里诊断几次才能用,我这里就是
 
是不是拨号参数设置不对,这是我用API直接写的,拨号成功率100%
var
rasentrynames:array[0..10] of TRASENTRYNAME;
rasconns: array[0..10] of TRASCONN;
rasparam: TRASDIALPARAMS;
hrasconn:THandle;
EntryNum: Integer;
ConnNum: DWord;
cb: Integer;
procedure RasDialFunc(unMsg: UInt;rasconnstate: TRASCONNSTATE; dwError: DWORD);
var
ErrorStr: array[0..99] of char;
begin
if dwError = 0 then
frmMain.StatusBar.Panels[0].Text := RasConnectionStateToString(rasconnstate)
else
begin
RasGetErrorStringA(dwError,ErrorStr,100);
frmMain.StatusBar.Panels[0].Text := string(ErrorStr);
end;
end;

procedure TfrmMain.OpenPhoneBook;//打开电话簿
begin
rasentrynames[1].dwSize:=sizeof(trasentryname);
RasEnumEntriesA(nil,nil,@rasentrynames,@cb,@EntryNum);
ZeroMemory(@rasparam,sizeof(TRASDIALPARAMS));
rasparam.dwSize := sizeof(TRASDIALPARAMS);
rasConns[0].dwSize := sizeof(TRASCONN);
strcopy(rasparam.szEntryName,rasentrynames[1].szEntryName);
strcopy(rasparam.szPhoneNumber,'*99***1#');
strcopy(rasparam.szUserName,'');
strcopy(rasparam.szPassword,'');
end;

procedure TfrmMain.GPRSDial; //拨号
var
ret: DWORD;
begin
RasEnumConnectionsA(@rasconns,@cb,@ConnNum);//枚举当前连接
hrasconn := 0;

if (EntryNum>0) and (ConnNum=0) then //电话簿不为空且没有连接
begin
ret := RasDialA(nil,nil,@rasparam,0,@RasDialFunc,@hrasconn);
if ret <> 0 then
begin
StatusBar.Panels[0].Text := '拨号失败';
end;
end;

end;

procedure TfrmMain.GPRSHangUp; //挂断
begin
RasEnumConnectionsA(@rasconns,@cb,@ConnNum);
if connnum <> 0 then
begin
RasHangUpA(rasconns[0].hrasconn);
Sleep(3000);
end;
end;
 
哇塞,救命的终于来了!
不过,代码好像区别不大。。。
我的代码用了一段循环来等待拨号完成,直至成功(回调将全局变量RasStatus置0)或出错(置错误代码)。
因为我发现,好像无论什么情况,RasDial异步调用都会立刻返回0,无法判断成功与否,下面的代码没法继续。

若说是参数的问题,我没查出来,但它有时还会拨号成功,成功率高于50%,而出错大都返回797,让我找不着北。
更找不着北的是,它有时明明已经返回出错信息,但拨号竟然在继续,而且还成功了!?
郁闷的是没法调试,调试时异步流程就变得明显不同,拨号成功率也几乎是100%了。
 
我终于找到原因了,居然是。。。
服务器上的远程登录导致的!!!
缘于我这个程序是在自动运行的,并且自以为在程序中加入了不可多次启动的判断就万无一失了。。
却未料,远程登录的多用户却没受此限,且时常有人远程登录此机,便自动运行了程序。。
由于拨号的触发条件相同,所以两个程序常常“同时”试图使用MODEM!以至造成了始终会有一方抢不到设备,拨号成功率正好在概率意义上的50%附近。。。

哭笑不得地。。解决了。。。:(
分,给了。。
 
顶部