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

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

ivs4

Господа, помогите. Уже не первый форум пытаю. Запускаю 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-3 перед очередным набором..

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



Вот выдержка из 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

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

Barmutik

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

ivs4

Проблема возникает на всех компьютерах на ОС 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

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

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

Sleep(1000);
Application.ProcessMessages;

while Err<>6

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

Guest

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

Barmutik

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

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

Guest

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

Barmutik

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

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

Barmutik

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

Ну так если проблема в цикле .. что в принципе странно .... и если надо цикл только 2 раза позвонить .. так может разложить цикл на итерации и не мучаться ?
 
Z

zubr

Я пишу клиент-серверный компонент DualUp соединения для Delphi. Так вот у меня была похожая проблема - без цикла тест-программа работала, а в цикле ни в какую. Свою ошибку я нашел - причина в том, что буфер Com-порта не успевал очищаться. Похоже здесь такая же проблема.
 
I

ivs4

Перевел свой вариант дозвона в exe. Без изменений.
Код:
receive:=RasDial(nil,nil,pRas,0,nil,hConnect);
в запись pRas записываю размер записи, имя точки входа, логин, пароль.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!