Блог по программированию в среде Delphi

Поиск по блогу

Есть идея по созданию интересной программы?

Опиши тут и я по возможности постараюсь это реализовать специально для тебя! Без $ ))

воскресенье, 27 июня 2010 г.

GetLastError

function GetLastError: DWORD; stdcall;

Функция возвращает значение последней ошибки в потоке.

Пример
begin
   if DeleteFile('CanDeletMe.txt') then
     ShowMessage('Файл удален')
   else
     ShowMessage('Файл не удален, код ошибки = '+IntToStr(GetLastError));
end;

InternetCloseHandle

Закрытие дескриптора любой функции Wininet

Синтаксис Delphi

function InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall;


hInet Дескриптор который необходимо закрыть.

Возвращает True если дескриптор закрыт успешно, в противном случае False для получения дополнительной информации вызовите функцию GetLastError

InternetReadFile

Чтение результатов выполнения функций InternetOpenUrl, FtpOpenFile или HttpOpenRequest

Синтаксис Delphi

function InternetReadFile(hFile: HINTERNET; lpBuffer: Pointer;
                         dwNumberOfBytesToRead: DWORD;
                         var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall;

hFile     Дескриптор сессии, полученный вызовом функции.
lpBuffer  Адрес буфера в который будут записаны данные
dwNumberOfBytesToRead  Размер буфера в который будут записаны данные.
lpdwNumberOfBytesRead  Число прочитанных байт.

HttpSendRequest

Посылает указанный запрос на сервер HTTP
Синтаксис Delphi

function HttpSendRequest(hRequest: HINTERNET; lpszHeaders: PChar;
                                        dwHeadersLength: DWORD; lpOptional: Pointer;
                                        dwOptionalLength: DWORD): BOOL; stdcall;
 
hRequest  Дескриптор, полученный вызовом предыдущей функции.

lpszHeaders, dwHeadersLength  Позволяет добавлять дополнительные заголовки к запросу. Подробнее об HTTP заголовках можно узнать на www.w3.org.

lpOptional,dwOptionalLength  Указатель на данные, которые будут посланы на сервер вместе с запросом. Используется в методах "POST" и "PUT".

Простенький пример отправки POST запроса в wininet

HttpOpenRequest

HTTP запрос выполняется в несколько этапов: открытие запроса, определение HTTP заголовка, собственно отправка запроса, чтение и обработка данных. Эта функция, как следует из её названия, открывает HTTP запрос.

Синтаксис Delphi 

function HttpOpenRequest(hConnect: HINTERNET; lpszVerb: PChar;
                                          lpszObjectName: PChar; lpszVersion: PChar; lpszReferrer: PChar;
                                          lplpszAcceptTypes: PLPSTR; dwFlags: DWORD;
                                          dwContext: DWORD): HINTERNET; stdcall;

hConnect Дескриптор сессии.

lpszVerb Задаёт имя команды запроса. Мы будем использовать методы "GET" и "POST".

lpszObjectName Имя целевого объекта. Это может быть просто HTML файл, скрипт или выполняемый модуль на сервере.

lpszReferer URL адрес предыдущей страницы. Чаще всего этот параметр игнорируется серверами, но если вдруг сервер перестанет подавать признаки жизни, попробуйте задать его, может помочь.

lpszAcceptTypes Определяет тип содержимого допускаемого клиентской стороной. Иногда MS IE передаёт сюда вот такую длинную строчку: "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*", иногда это просто "*/*".

dwFlags Комбинация интернет флагов. Например, при использовании SSL соединений мы будем указывать флаг INTERNET_FLAG_SECURE. Так же нам будет полезен флаг INTERNET_FLAG_KEEP_CONNECTION, который позволяет удерживать соединение с сервером между запросами. Это бывает полезно, если мы хотим, чтобы сервер не забыл о нас во время сессий требующих входа по паролю.

Простенький снифер

Иногда требуется написать приложение в функционал которого входит авторизация на каком нибудь до селе нам неизвестном сайте. Для того, чтобы узнать, что необходимо отправить или какой запрос сделать серверу, чтобы программно авторизироваться на сайте и есть специальные программы которые помогают нам это сделать.


Лично я использую плагин для Firefox HTTPfox с помощью которого можно получить всю интересующую нас информацию.

Запускаю плагин кнопочкой Play после чего выполняю авторизацию на необходимом сайте
и смотрю, что же необходимо отправить или получить.
Вот пример того как выглядит запрос GET при обращении к www.google.ru
Так же есть еще большое кол-во сниферов, но пока для моих целей мне хватает функционала HTTPfo. Сам плагин можно скачать отсюда

суббота, 26 июня 2010 г.

InternetReadFile

Синтаксис Delphi 
function InternetReadFile(hFile: HINTERNET; 
                          lpBuffer: Pointer; 
                          dwNumberOfBytesToRead: DWORD; 
                          var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall;

Параметры:
  • HFile – указатель на файл, полученный после вызова функции InternetOpenUrl.
  • LpBuffer – указатель на буфер, куда будут заноситься данные.
  • DwNumberOfBytesToRead - число байт, которое нужно причитать.
  • lpdwNumberOfBytesRead - содержит количество прочитанных байтов. Устанавливается в 0 перед проверкой ошибок.
Функция позволяет считывать данные, используя указатель, полученный в результате вызова InternetOpenUrl, FtpOpenFile, GopherOpenFile, или HttpOpenRequest. Так же, как и все остальные функции, возвращает TRUE или FALSE. После завершения работы функции нужно освободить указатель Hfile, вызвав InternetCloseHandle(hUrlFile) .
Вот, в принципе, и все об самых основных функциях. Для простейшего приложения можно определить примерно такой упрощенный алгоритм использования Internet- функций Win32 API взамен стандартным компонентов. HSession:= InternetOpen - открывает сессию.
HConnect:= InternetConnect - устанавливает соединение.
hHttpFile:=httpOpenRequest
HttpSendRequest - HttpOpenRequest и HttpSendRequest используются вместе для получения доступа к файлу по HTTP- протоколу. Вызов HttpOpenRequest создает указатель и определяет необходимые параметры, а HttpOpenRequest отсылает запрос HTTP серверу, используя эти параметры.

InternetOpenUrl

Синтаксис Delphi   
function InternetOpenUrl(hInet: HINTERNET; 
                         lpszUrl: PChar; 
                         lpszHeaders: PChar; 
                         dwHeadersLength: DWORD; 
                         dwFlags: DWORD; 
                         dwContext: DWORD): HINTERNET; stdcall;

Параметры:
  • HInet – указатель, полученный после вызова InternetOpen.
  • LpszUrl – URL , до которого нужно получить доступ. Обязательно должен начинаться с указания протокола, по которому будет происходить соединение. Поддерживаются следующие протоколы - ftp:, gopher:, http:, https:.
  • LpszHeaders – содержит заголовок HTTP запроса.
  • DwHeadersLength – длина заголовка. Если заголовок nil, то можно установить значение –1, и длина будет вычислена автоматически.
  • DwFlags – флаг, задающий дополнительные параметры перед выполнением функции. Вот некоторые его значения: INTERNET_ FLAG_EXISTING_CONNECT, INTERNET_FLAG_HYPERLINK, INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP, INTERNET_FLAG_NO_AUTO_REDIRECT, INTERNET_FLAG_NO_CACH E_WRITE, INTERNET_FLAG_NO_COOKIES.
Возвращается значение TRUE, если соединение успешно, или FALSE - в противном случае. Теперь можно спокойно считывать нужный файл функцией InternetReadFile.

InternetConnect

Функция открывает сессию с указанным сервером, используя протокол FTP, HTTP, Gopher.

Синтаксис Delphi  
function InternetConnect (hInet: HINTERNET;
                                      lpszServerName: PChar;
                                      nServerPort: INTERNET_PORT;
                                      lpszUsername: PChar;
                                      lpszPassword: PChar;
                                      dwService: DWORD;
                                      dwFlags: DWORD;
                                      dwContext: DWORD): HINTERNET; stdcall;
Параметры:
  • HInet – указатель, полученный после вызова InternetOpen.
  • LpszServerName – имя сервера, с которым нужно установить соединение. Может быть как именем хоста – domain.com.ua, так и IP- адресом – 134.123.44.67.
  • NServerPort – указывает на TCP/IP порт, с которым нужно соединиться. Для задания стандартных портов служат константы: NTERNET_DEFAULT_FTP_PORT (port 21), INTERNET_DEFAULT_GOPHER_PORT (port 70), INTERNET_DEFAULT_HTTP_PORT (port 80), INTERNET_DEFAULT_HTTPS_ PORT (port 443), INTERNET_DEFAULT_SOCKS_PORT (port 1080), INTERNET_INVALID_PORT_NUMBER – порт по умолчанию для сервиса, описанного в dwService. Стандартные порты для различных сервисов находятся в файле SERVICES в директории Windows.
  • LpszUsername – имя пользователя, желающего установить соединение. Если установлено в nil , то будет использовано имя по умолчанию, но для HTTP это вызовет исключение.
  • LpszPassword – пароль пользователя для доступа к серверу. Если оба значения установить в nil, то будут использованы параметры по умолчанию.
  • DwService – задает сервис, который требуется от сервера. Может принимать значения INTERNET_SERVICE_FTP, INTERNET_SERVICE_GOPHER, INTERNET_SERVICE_HTTP.
  • DwFlags - Задает специфические параметры для соединения. Например, если DwService установлен в INTERNET_SERVICE_FTP, то можно установить в INTERNET_FLAG_PASSIVE для использования пассивного режима.
Функция возвращает указатель на установленную сессию или nil в случае невозможности ее установки.
Итак, мы имеем связь с сервером, нужный нам порт открыт. Теперь следует открыть соответствующий файл. Для этого определена функция InternetOpenUrl. Она принимает полный URL файла и возвращает указатель на него. Кстати, перед ее использованием не нужно вызывать InternetConnect.

InternetOpen

Эта функция инициализирует WinInet  и возвращает дескриптор, который необходим для вызова других функций WinInet. В случае неудачи возвращается NULL.

Синтаксис Delphi
function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD;
lpszProxy, lpszProxyBypass: PChar; dwFlags: DWORD): HINTERNET; stdcall;

Параметры:
lpszAgent
– строка символов, которая передается серверу и идентифицирует программное обеспечение, пославшее запрос.
dwAccessType
- задает необходимые параметры доступа. Принимает следующие значения:
  • INTERNET_OPEN_TYPE_DIRECT – обрабатывает все имена хостов локально.
  • INTERNET_OPEN_TYPE_PRECONFIG – берет установки из реестра.
  • INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY - берет установки из реестра и предотвращает запуск Jscript или Internet Setup (INS) файлов.
  • INTERNET_OPEN_TYPE_PROXY – использование прокси-сервера. В случае неудачи использует INTERNET_OPEN_TYPE_DIRECT. LpszProxy – адрес прокси-сервера. Игнорируется только если параметр dwAccessType отличается от INTERNET_OPEN_TYPE_PROXY. LpszProxyBypass - спис ок имен или IP- адресов, соединяться с которыми нужно в обход прокси-сервера. В списке допускаются шаблоны. Так же, как и предыдущий параметр, не может содержать пустой строки. Если dwAccessType отличен от INTERNET_OPEN_TYPE_PROXY, то значения игнорируютс я, и параметр можно установить в nil. DwFlags – задает параметры, влияющие на поведение Internet- функций . Возможно применение комбинации из следующих разрешенных значений: INTERNET_FLAG_ASYNC, INTERNET_FLAG_FROM_CACHE, INTERNET_FLAG_OFFLINE
Функция инициализирует использование Internet- функций Win32 API. В принципе, ваше приложение может неоднократно вызывать эту функцию, например, для доступа к различным сервисам, но обычно ее достаточно вызвать один раз. При последующих вызовах других фун кций возвращаемый указатель HINTERNET должен передаваться им первым. Таким образом, можно дважды вызвать InternetOpen, и, имея два разных указателя HINTERNET, работать с HTTP и FTP параллельно. В случае неудачи, она возвращает nil, и для более детального анализа следует вызвать GetLastError.

Wininet Delphi for MSDN (Мой корявый перевод)




HINTERNET

Это дескриптор, который создают и используют функции Wininet. Этот тип дескриптора не является взаимозаменяемым с другими дескрипторами. Поэтому он не может быть использован в таких функциях, как ReadFile или CloseHandle. Так же, кроме того, другие дескрипторы не могут быть использованы с функциями WinINet. Например, дескриптор полученный в результате работы CreateFile не может быть использован в InternetReadFile.




Функциями WinInet создающие дескрипторы HINTERNET

вторник, 22 июня 2010 г.

Synapse авторизация на www.free-lance.ru

var
  html:TStringList;
  httpsend: THTTPSend;
  stream:TStringStream;
  sSecur:TStringList;
begin
  //инициализация всего необходимого
  html:=TStringList.Create;
  stream:=TStringStream.Create('');
  httpsend:=THTTPSend.Create;
  //очистка
  httpsend.Document.Clear;
  //получение страницы
  httpsend.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3';
  if not httpsend.HTTPMethod('get','http://www.free-lance.ru/') then
    ShowMessage('Не получилось скачать:(');
  //запись страницы
  httpsend.Document.SaveToStream(stream);
  //вывод страницы
  Memo1.Lines.add(stream.DataString);
  sSecur:=TStringList.Create;
  sSecur.Clear;
  sSecur:=Security(stream.DataString);
  //Memo2.Lines:=sSecur;
  stream:=TStringStream.Create('');
  stream.WriteString('action=login');
  stream.WriteString('&login=ЛОГИН');
  stream.WriteString('&passwd=ПАРОЛЬ');
  stream.WriteString('&x=3');//хотели обмануть)) нужно менять рандомно иначе забанят
  stream.WriteString('&y=3');//хотели обмануть))
  httpsend.Document.Clear;
  httpsend.Document.LoadFromStream(stream);
  httpsend.MimeType:='application/x-www-form-urlencoded';
  if httpsend.HTTPMethod('post','http://www.free-lance.ru/') then
    Memo2.Lines.Add(httpsend.Headers.Text);
  Memo2.Lines.Add(IntToStr(httpsend.ResultCode));
  sSecur.Free;
end;

Знаки вопросов вместо русских букв (?????????? ???????)

Пробовал с Indy 10.5.5 c indy 9 пока без успехов))

var
  html:String;
  stream: tStream;
  strings1: tStringList;
begin
   stream := tMemoryStream.Create;
   IdHTTP1.Get('http://nmdsoft.blogspot.com',stream);
   stream.Position := 0;
   strings1 := tStringList.Create;
   strings1.LoadFromStream(stream);
   memo1.Lines.Assign(strings1);
   strings1.Free;
   stream.Free;
   //memo1.Text:=Utf8ToAnsi(memo1.Text);
end;

Кракозябры вместо русских букв (решение)

function RussianToUnicode(S: String): String;
var Wrd:Word;
  pW,pR:PWord;
  len:Integer;
begin
  pW:=@S[1];
  len:=Length(S);
  SetLength(Result,len);
  pR:=@Result[1];
  while Len<>0 do begin
    Wrd:=pW^;
    case Wrd of
      $C0..$DF,$E0..$FF:pR^:=Wrd+50;
      else pR^:=Wrd;
    end;
    inc(pW);
    inc(pR);
    dec(Len);
  end;
end;

понедельник, 21 июня 2010 г.

Компоненты для Delphi 7

Indy 10.5.5 скачана с SVN сегодня смотрим дату поста

Indy актуальная версия

не тут ftp://indy.fulgan.com/ZIP/
а тут SVN https://svn.atozed.com:444/svn/Indy10/
login Indy-Public-RO
Pass ПУСТО
SVN скачать можно тут
Можно так же скачать отсюда чтобы не заморачиваться  с SVN