Функция WinAPI RasDial возвращает Error 668

  • Автор темы ivs4
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

ivs4

#1
Господа, помогите. Уже не первый форум пытаю. Запускаю RasDial в составе ActiveX контрола в цикле для дозвона. Под Win98 цикл отрабатывает столько сколько ему положено, а под Win2K/XP после первого вызова метода ActiveX контрола выбрасывается ошибка 668. Причем если запустить цикл в ручную, то он начнет снова звонить, а на втрором проходе цикла опять в ошибку... Как уйти от этого т.к. цикл для этого метода ActiveX контрола принципиально необходим.
Примерно так на WSH:
set obj=Wscript.CreateObject(Dialing.RasDial)
for i=0 to 4
obj.Dial(.....)
next
 
B

Barmutik

#2
Дело в том что связь сразцу не рвётся и должна быть выдержана пауза секунды 2-3 перед очередным набором..

Больше информации по адресу:

http://msdn.microsoft.com/library/default....asclnt_2ks0.asp

Вот выдержка из MSDN:

Remarks

An application should not call RasHangUp and then immediately exit. The connection state machine needs time to properly terminate. If the system prematurely terminates the state machine, the state machine can fail to properly close a port, leaving the port in an inconsistent state. Also, an immediate attempt to use the same connection may fail leaving the connection unusable. A simple way to avoid these problems is to call Sleep(3000) after returning from RasHangUp; after that pause, the application can exit. A more responsive way to avoid these problems is, after returning from RasHangUp, to call RasGetConnectStatus(hrasconn) and Sleep(0) in a loop until RasGetConnectStatus returns ERROR_INVALID_HANDLE.
 
G

Guest

#3
Уважаемый, Barmutik.
Описываемый вами момент я учитывал в своей программе. После неудачного дозвона я выполняю RasHangUp. После него вызываю в цикле RasGetConnectStatus(hrasconn), пока эта функция не возвратит значение 6.
 
B

Barmutik

#4
Ну тогда нужно больше инфы что б понять Вашу проблему... данная проблема возникает на всех компьютерах или только на ограниченном их количестве ? На каких операционных системах ?
 
I

ivs4

#5
Проблема возникает на всех компьютерах на ОС WinXPPro/2000Pro/2003Server.
Вкратце код функции DIAL AxtiveX (по памяти):
Код:
Err=RasDial(....);
f err<>0 then
begin
Err=RasHahgUp(h);
if Err=0 then
begin
do
 Err=RasGetConnectStatus(h);
while Err<>6
end; 
end;
Вызов этой функции из Win Script:

set t=createobject("dialing.ringx")
For i=1 to 2
h=t.DIAL(...) 
next
P.S. Спасибо за отклик и помощь.
 
B

Barmutik

#6
Ну так вообщем проблем не видно по этому коду .. хотя полный код был бы лучше... единственное что может быть стоит добавить:

Код:
do
Err=RasGetConnectStatus(h);

Sleep(1000);
Application.ProcessMessages;

while Err<>6
Для того что б отдать системе время на выполнение ... потому как потенциально Вы можете занять 100% времени в цикле и у системы простоне будет времени что бы закрыть соединение.
 
G

Guest

#7
Уважаемый, Barmutik.
Попробовал предложенный вами вариант. К сожалению проблема осталась. Настораживает что все это под NT операционками.
 
B

Barmutik

#8
Просто нет машины под руками что б проверить :) Но как-то странно .. если б наоборот по 95\98 была проблема было бы понятно .. а вот так .. надо поискать машину и попробовать ...

Потенциально проблема может быть в использовании ActiveX контрола ...а если вынести код в отдельную программу и попробовать? Просто для теста .. что бы выяснить работает ли код в обычном приложении ...
 
G

Guest

#9
Еще занимательно то, что в ручную скрипт(внутри без цикла) запускается без ошибок сколь угодно раз и с каким угодно малым интервалом.
 
B

Barmutik

#10
Написал я тестовый примерчик ... попробовал на 2000 и ХР... всё чудно работает ... на 95 и иже не пробовал .. т.к. не могу их поблизости нигде найти ...

Подключает .. 30 секунд работаем .. отключаем ... 30 секунд пауза .. подключаем ... всё прекрасно работает ...
 
B

Barmutik

#11
Забыл добавить что прожка тестовая НЕ ActiveX .. а просто виндовс приложение...

Ну так если проблема в цикле .. что в принципе странно .... и если надо цикл только 2 раза позвонить .. так может разложить цикл на итерации и не мучаться ?
 
Z
#12
Я пишу клиент-серверный компонент DualUp соединения для Delphi. Так вот у меня была похожая проблема - без цикла тест-программа работала, а в цикле ни в какую. Свою ошибку я нашел - причина в том, что буфер Com-порта не успевал очищаться. Похоже здесь такая же проблема.
 
I
#13
Перевел свой вариант дозвона в exe. Без изменений.
Код:
receive:=RasDial(nil,nil,pRas,0,nil,hConnect);
в запись pRas записываю размер записи, имя точки входа, логин, пароль.
 
Статус
Закрыто для дальнейших ответов.