View difference between Paste ID: xLjzE3Aa and NCkhmVyT
SHOW: | | - or go back to the newest paste.
1
//uses wininet;
2
function InternetCheckUrl( AURL: WideString;
3
                           AHTTPStatus: PDWORD = nil;
4
                           AConnectTimeout: Cardinal = INFINITE;
5
                           ARecieveTimeout: Cardinal = INFINITE;
6
                           ASendTimeout: Cardinal = INFINITE ): Integer;
7
const
8
  C_CLIENT: WideString = 'checkurl';
9
  C_HTTP_W : WideString = 'http';
10
  C_ADD_W: WideString = '://';
11
var
12
  lSession,
13
  lFile: hInternet;
14
  lBuf,
15
  lLen,
16
  lIdx: DWORD;
17
begin
18
  if Pos( C_HTTP_W, WideLowerCase( AURL ) ) <> 1 then
19
    AURL := C_HTTP_W + C_ADD_W + AURL;
20
  Result := -1;
21
  lSession := InternetOpenW( PWideChar(C_CLIENT), PRE_CONFIG_INTERNET_ACCESS, nil, nil, 0);
22
  if not Assigned(lSession) then
23
    Result := GetLastError
24
  else
25
  try
26
    if InternetSetOption( lSession, INTERNET_OPTION_CONNECT_TIMEOUT, @AConnectTimeOut, SizeOf(Cardinal) ) and
27
       InternetSetOption( lSession, INTERNET_OPTION_RECEIVE_TIMEOUT, @ARecieveTimeOut, SizeOf(Cardinal) ) and
28
       InternetSetOption( lSession, INTERNET_OPTION_SEND_TIMEOUT, @ASendTimeout, SizeOf(Cardinal) ) then
29
    begin
30
      lFile :=InternetOpenURLW( lSession, PWideChar(AURL), nil, 0 , INTERNET_FLAG_RELOAD, 0);
31
      if not Assigned( lFile ) then
32
        Result := GetLastError
33
      else
34
      try
35
        lIdx := 0;
36
        lLen := SizeOf(lBuf);
37
        if not Assigned( AHTTPStatus ) then
38
          AHTTPStatus := @lBuf;
39
        if not HttpQueryInfoW( lFile, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, AHTTPStatus, lLen, lIdx) then
40
          Result := GetLastError
41
        else
42
        if (AHTTPStatus^ = 200 ) or (AHTTPStatus^ = 302 ) then
43
          Result := 0 //если все ОК, то обнулим результат;
44
      finally
45
        InternetCloseHandle( lFile )
46
      end;
47
    end;
48
  finally
49
    InternetCloseHandle(lSession);
50
  end;
51
end;
52
///////////////////////////////////////////////////////////////////////
53
//использование
54
while InternetCheckUrl('http://www.***сайт',nil,3000,3000,3000)<>0 do begin
55
LabelB2.Caption:='NO_CONNECT_URL';
56
Application.ProcessMessages;
57
if (FileExists(ExtractFilePath(ParamStr(0))+'OKSOUND.WAV')) and alarm then
58
PlaySound(pchar(ExtractFilePath(ParamStr(0))+'OKSOUND.WAV'), 0, SND_ASYNC);
59
Sleep(10000);
60
end;
61
///////////////////////////////////////////////////////////////////////
62
{
63
Как пользоваться:
64
AURL - соотв ссылка, которую проверяем.
65
AHTTPStatus - HTTP статус запрошенной странички на сервере.
66
AConnectTimeout,
67
ARecieveTimeout,
68
ASendTimeout - соответственно таймауты на подключение, чтение и посылку данных. по умолчанию - бесконечность.
69
Result функции будут следующие:
70
-1: запрос по адресу странички выдал HTTP Status Code <> 200 или 302. если был передан указатель на DWORD вторым параметром, то по его адресу можно прочитать собственно выданный сервером статус.
71
0: Все нормально, сервер существует и вернул HTTP Status Code равным 200 или 302.
72
>0: ошибка произошла при вызове функций WinInet. результат работы GetLastError. для получения текстового представления (не для всех ошибок) можно вызвать SysErrorMessage для получения текста с сообщением об ошибке.
73
74
единственный косяк в функции, который сразу заметен, это разные типы Result'а функции и типа, возвращаемого GetLastError...
75
з.ы. можно сделать и асинхронный вариант проверки...
76
}