Whenever you try to connect to connect to a Internet server while no Internet connection is present you can be almost certain an Access Violation will fire.
The only way around this is to check whether a connection is present or not. You can use the code below.
uses
Windows, SysUtils, Registry, WinSock, WinInet;
...
type
TConnectionType = (ctNone, ctProxy, ctDialup);
...
function ConnectedToInternet: TConnectionType;
function RasConnectionCount: Integer;
...
implementation
...
const
ERROR_BUFFER_TOO_SMALL = 603;
RAS_MAXENTRYNAME = 256;
RAS_MAXDEVICENAME = 128;
RAS_MAXDEVICETYPE = 16;
type
ERasError = class(Exception);
HRASConn = DWORD;
PRASConn = ^TRASConn;
TRASConn = record
dwSize: DWORD;
rasConn: HRASConn;
szEntryName: array[0..RAS_MAXENTRYNAME] of Char;
szDeviceType: array[0..RAS_MAXDEVICETYPE] of Char;
szDeviceName: array[0..RAS_MAXDEVICENAME] of Char;
end;
TRasEnumConnections =
function(RASConn: PrasConn; // Buffer to receive Connections data
var BufSize: DWORD; // Size of buffer (in bytes)
var Connections: DWORD // Number of Connections written to buffer
): Longint;
stdcall;
...
function ConnectedToInternet: TConnectionType;
var
UseProxy: LongWord;
Reg: TRegistry;
begin
Result := ctNone;
Reg := TRegistry.Create;
with Reg do
try
try
RootKey := HKEY_CURRENT_USER;
if OpenKey('Software\\Microsoft\\Windows\\CurrentVersion\\Internet settings', False) then begin
if GetDataType('ProxyEnable') = rdBinary then
ReadBinaryData('ProxyEnable', UseProxy, SizeOf(Longword))
else
UseProxy := Integer(ReadBool('ProxyEnable'));
if (UseProxy <> 0) and (ReadString('ProxyServer') <> '') then
Result := ctProxy;
end;
except
// No connection through proxy
end;
finally
Free;
end;
if Result = ctNone then
if RasConnectionCount > 0 then
Result := ctDialup;
end;
function RasConnectionCount: Integer;
var
Conns: array[1..4] of TRasConn;
BufSize, NumConns: DWORD;
RasDLL: HInst;
RasResult: Longint;
RasEnums: TRasEnumConnections;
begin
Result := 0;
// Load the RAS DLL
RasDLL := LoadLibrary('rasapi32.dll');
if RasDLL = 0 then
Exit;
try
RasEnums := GetProcAddress(RasDLL, 'RasEnumConnectionsA');
if @RasEnums = nil then
raise ERasError.Create('RasEnumConnectionsA not found in rasapi32.dll');
Conns[1].dwSize := SizeOf(Conns[1]);
BufSize := SizeOf(Conns);
RasResult := RasEnums(@Conns, BufSize, NumConns);
if (RasResult = 0) or (Result = ERROR_BUFFER_TOO_SMALL) then
Result := NumConns;
finally
FreeLibrary(RasDLL);
end;
end;
Tags: access violation, borland, class exception, connection, Delphi, dialup, hkey current user, ie, internet, internet explorer, internet server, internet settings, proxy, proxyserver, ras, System, tip, trick, windows, winsock
Merlin’s Delphi Forge
Leave a comment