Dial-Up
От: DeHuC  
Дата: 31.07.03 02:49
Оценка:
Проблема в следующем: мне надо диагностировать наличие подключения к сети и если оно Offline то вывести диалог дозвона по Dial-Up, если клиент подключается только по LAN то это уже не мои проблемы
Решаю данную задачу следующим образом:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, WinInet, dialogs,
  ShellApi, IdBaseComponent, IdIntercept, RasManager, IdComponent,
  IdTCPConnection, IdTCPClient;

const
  INTERNET_CONNECTION_MODEM = $1;
  INTERNET_CONNECTION_LAN = $2;
  INTERNET_CONNECTION_PROXY = $4;
  INTERNET_RAS_INSTALLED = $10;
  INTERNET_CONNECTION_OFFLINE = $20;
  INTERNET_CONNECTION_CONFIGURED = $40;
  winetdll='wininet.dll';

  function InternetGetConnectedStateEx(var dwFlags:DWORD; lpszConnectionName:LPTSTR; dwNameLen,dwReserved:WORD):BOOL; stdcall;
  function InternetAutodial(dwFlags: DWORD; dwReserved: DWORD): BOOL; stdcall; external winetdll;

type
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  WinInetDLL: THandle  =0;
  _InternetOpenA: function(lpszAgent:PAnsiChar; dwAccessType:DWORD; lpszProxy,lpszProxyBypass: PAnsiChar; dwFlags:DWORD):HINTERNET; stdcall;
  _InternetOpenURLA: function(hInet:HINTERNET; lpszUrl:PAnsiChar; lpszHeaders:PAnsiChar; dwHeadersLength:DWORD; dwFlags:DWORD; dwContext:DWORD):HINTERNET; stdcall;
  _InternetReadFile: function(hFile:HINTERNET; lpBuffer:Pointer; dwNumberOfBytesToRead:DWORD; var lpdwNumberOfBytesRead:DWORD):BOOL; stdcall;
  _InternetCloseHandle: function(hInet:HINTERNET): BOOL; stdcall;


implementation
  function InternetGetConnectedStateEx; external winetdll name 'InternetGetConnectedStateEx';


{$R *.dfm}


procedure  InitWinInet;
var
  OldError: Longint;
begin
  OldError:=SetErrorMode(SEM_NOOPENFILEERRORBOX);
  try
    if (WinInetDLL=0) then
    begin
      WinInetDLL:=LoadLibrary('wininet.dll');
      if (WinInetDLL<>0) then
      begin
        @_InternetOpenA:=GetProcAddress(WinInetDLL,'InternetOpenA');
        @_InternetOpenURLA:=GetProcAddress(WinInetDLL,'InternetOpenUrlA');
        @_InternetReadFile:=GetProcAddress(WinInetDLL,'InternetReadFile');
        @_InternetCloseHandle:=GetProcAddress(WinInetDLL,'InternetCloseHandle');
      end;
    end;
  finally
    SetErrorMode(OldError);
  end;
end;



procedure TForm1.FormClick(Sender: TObject);
var
  dwFlags: DWORD;
  msg: string;
  conName: LPTSTR;
  b: boolean;
begin
  if (WinInetDLL=0) then InitWinInet;
  if (WinInetDLL<>0) then
  begin
    // долго и нудно проверяем тип и статус подключения  :) 
    // если это модемное соединение и оно оффлайн то
    b:=InternetAutoDial(0,0);
    if (b=true) then showMessage('true');
  end else ShowMessage('Не удалось загрузить  WinInet.dll');

end;

end.


и вот проблема в том что InternetAutoDial всегда возвращает true, а окно диалога не появляется чего я делаю не так? В системе настроено 2 подключения модемное и LAN, даже после удаления LAN подключения диалог не появляется...
пробовал как в W2К так и в ХР, под 5-ми и 7-ми делфями
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.