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

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

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

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

среда, 29 декабря 2010 г.

Простенький пример выполнения запроса в Wininet

По просьбе трудящихся выкладываю вот такой простенький исходник программки с помощью, которой можно получить ТИЦ и PR  сайта путем выполнения POST запроса

Скрин примера



unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,WinInet, StdCtrls;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    edtSite: TEdit;
    lblTC_PR: TLabel;
    lblSite: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}
const
  // дефолное название приложение через которое якобы происходит соединение
  DefaultAppName ='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6';

function exam(msData: TMemoryStream):string;
  function DataAvailable(hRequest: pointer; out Size: cardinal): BOOLEAN;
  begin
    Result := WinInet.InternetQueryDataAvailable(hRequest, Size, 0, 0);
  end;
var
  hInternet, hConnect, hRequest: pointer;
  dwBytesRead, i, L: cardinal;
  sTemp: AnsiString; // текст страницы
  sHeader: String;
begin
  Result:='';
  try
    hInternet := InternetOpen(PChar(DefaultAppName),INTERNET_OPEN_TYPE_PRECONFIG, Nil, Nil, 0);
    if Assigned(hInternet) then
    begin
      // Открываем сессию
      //http://ip-whois.net/pr_cy_check.php обратите внимание как записал в коде адрес сайта
      hConnect := InternetConnect(hInternet, PWideChar('ip-whois.net'),INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
      if Assigned(hConnect) then
      begin
        // открываем запрос
        hRequest := HttpOpenRequest(hConnect, PWideChar('POST'),
          PWideChar('/pr_cy_check.php'), HTTP_VERSION, nil, Nil,
          INTERNET_FLAG_KEEP_CONNECTION, 1);

        sHeader:='Accept: */*';
        HttpAddRequestHeaders(hRequest, Pointer(sHeader), Length(sHeader), HTTP_ADDREQ_FLAG_ADD);
        sHeader:= 'Content-Type: application/x-www-form-urlencoded';
        HttpAddRequestHeaders(hRequest, Pointer(sHeader), Length(sHeader), HTTP_ADDREQ_FLAG_ADD);
        sHeader:= 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
        HttpAddRequestHeaders(hRequest, Pointer(sHeader), Length(sHeader), HTTP_ADDREQ_FLAG_ADD);
        sHeader:= 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7';
        HttpAddRequestHeaders(hRequest, Pointer(sHeader), Length(sHeader), HTTP_ADDREQ_FLAG_ADD);

        if Assigned(hRequest) then
        begin
          // Отправляем запрос
          i := 1;
          if HttpSendRequest(hRequest, nil, 0, msData.memory, msData.Size) then
          begin
            repeat
              DataAvailable(hRequest, L); // Получаем кол-во принимаемых данных
              if L = 0 then
                break;
              SetLength(sTemp, L + i);
              if not InternetReadFile(hRequest, @sTemp[i], sizeof(L),dwBytesRead) then
                break; // Получаем данные с сервера
              inc(i, dwBytesRead);
            until dwBytesRead = 0;
            sTemp[i] := #0;
            Result:=sTemp;
          end;
        end;
      end;
    end;
  finally
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hInternet);
  end;
end;

function TC_PR(aValue:string):string;
var
  i:Integer;
  TC,PR:string;
begin
  i:=AnsiPos('</h2><h3>ТИЦ: ',aValue);
  if i=0 then
  begin
    Result:='Неизвестно!';
    Exit;
  end;
  Delete(aValue,1,i+length('</h2><h3>ТИЦ: ')-1);
  i:=AnsiPos('</h3><h3>PR: ',aValue);
  TC:=Copy(aValue,0,i-1);
  Delete(aValue,1,i+length('</h3><h3>PR: ')-1);
  i:=AnsiPos('</h3><br>',aValue);
  PR:=Copy(aValue,0,i-1);
  Result:='ТИЦ '+TC+' PR '+PR;
end;

procedure TfrmMain.Button1Click(Sender: TObject);
var
  zapros:TStringStream;
  sTemp:string;
begin
  zapros:=TStringStream.Create;
  zapros.WriteString('T1='+edtSite.Text+'&B1=T2=%D3%E7%ED%E0%F2%FC+%D2%C8%D6+%E8+PR');
  sTemp:=exam(zapros);
  if Length(sTemp)>0 then
    lblTC_PR.Caption:=TC_PR(sTemp);

  zapros.Free;
end;

end.

Скачать исходник проекта можно отсюда Download

четверг, 2 декабря 2010 г.

Конкурс на WebDelphi с неограниченным призовым фондом.

Хочу поздравить всех со вторым днем зимы и сообщить о прекрасном известии.

1 декабря 2010 года (т.е. вчера) начался конкурс по программированию с неограниченным призовым фондом ( все зависит от количества принявших в нем участие людей( 50 рублей за каждого нового конкурсанта), но начальный призовой фонд составляет 1000 рублей ).

Принять участие в конкурсе могут все программисты круг не ограничивается только Delphi (нас ни так много, но мы в тельняшках).

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

Правила и требования для участия в конкурсе можете просмотреть на сайте автора конкурса!


Желаю удачи!!!

пятница, 19 ноября 2010 г.

Время простоя ПК

function CheckIddleTime: DWord;
var
   LastInput: TLastInputInfo;
begin
   LastInput.cbSize := SizeOf(TLastInputInfo);
   GetLastInputInfo(LastInput);
   Result := GetTickCount - LastInput.dwTime;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption:= 'Время простоя: ' + vartostr(CheckIddleTime/1000)+' секунд(ы)';
end;

четверг, 18 ноября 2010 г.

Создание именованной, совместно используемой памяти (Delphi)

Отображение файла в память для совместного использования несколькими процессами.



Первый процесс создает файл Temp.txt, после чего проецирует его в память

//первый процесс
unit mainServ;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

среда, 17 ноября 2010 г.

Файлы, проецируемые в память

Технология файлов, проецируемых в память, является изящным средством для разделения ресурсов файловой системы между процессами.
При проецировании файла на адресное пространство процесса процесс может обращаться к содержимому файла так, как если бы файл был загружен в оперативную память.
Если несколько процессов выполняют проецирование одного и того же файла, то содержимое файла будет доступно для всех процессов, то есть позволит избежать загрузки множества экземпляров файла в оперативную память.
Для проецируемых файлов применяется 64-битная адресация, что позволяет использовать данную технологию для обработки сверхбольших (до 18 экзабайт) файлов, преодолевая, тем самым, ограничение на размер файла в 2 гигабайта.

пятница, 12 ноября 2010 г.

Программа для информирования пользователя о смене языка ввода 2 (Написана на Delphi)

Немного изменил интерфейс, добавил то, что просили






Если нужен дополнительный функционал пишите.

Скачать программу под Windows XP SP3 можно отсюда Download
Скачать программу под Windows XP SP3 и Windows 7 64 можно отсюда Download

Как и просили  исходник Windows 7 64
Так как нет возможности создания 64-х разрядной DLL сделал по таймеру))

пятница, 5 ноября 2010 г.

Программа для информирования пользователя о смене языка ввода (Написана на Delphi)

Программа информирует вас о смене языка ввода так, как это не всегда происходит при нажатии комбинации клавиш которые, как раз отвечают за это дело, но эта программа известит вас об этом звуковым сигналом или сменой указателя мыши и гудком все это дело настраивается без проблем в программе.
Программа работает в ОС Windows XP SP3
Скриншот программы


Программа бесплатная так, что вы ее используете на свой страх и риск!
Я не несу ответственности за вред который вы причините используя эту программу!
ВИРУСОВ НЕТ!
Скачать программу под Windows XP SP3 можно отсюда Download
Скачать программу под Windows 7 64 можно отсюда Download

В дополнение ко все хочу сказать, что я не пытался сделать PuntoSwithcher, слишком много автоматизации иногда мешает им ни когда не пользовался и не собираюсь, каждому своё!

понедельник, 1 ноября 2010 г.

Google Chrome Frame for Delphi 2010

Компонент для использования функций Google Chrome в своих приложениях или же написания своего браузера на основе Google Chrome в Delphi.
Скриншот примера идущего в комплекте с компонентом.


ActiveX из npchrome_frame.dll не импортируется полностью и один хороший человек написал компонент на радость пользователям Delphi сайт автора компонента.

Компонент Google Chrome Frame для Delphi 2010 можно скачать отсюда Download

суббота, 23 октября 2010 г.

Организация межзадачного обмена

Задание. Организовать работу программы-сервера и нескольких программ клиентов следующим образом:
Сервер предоставляет клиентам кокой-либо из своих ресурсов (например, собственное окно)
Клиенты подключаются к серверу и начинают запись в окно,  причем первый клиент пишет только «1», второй – только «2», и т.д. Клиентов может быть произвольное количество, но не менее пяти.
 Если клиент подключается к серверу в монопольном режиме, он получает исключительные права на использование ресурса сервера. Все остальные клиенты, пытающиеся подключиться в данный момент, не должны получить доступ к ресурсу сервера и должны оказаться в очереди на обслуживание.

воскресенье, 17 октября 2010 г.

MEMORY_BASIC_INFORMATION структура

Содержит сведения о диапазоне страниц в виртуальном адресном пространстве процесса. Функции VirtualQuery и VirtualQueryEx использовать эту структуру.

Синтаксис Delphi
type
  PMemoryBasicInformation = ^TMemoryBasicInformation;
  _MEMORY_BASIC_INFORMATION = record
    BaseAddress : Pointer;
    AllocationBase : Pointer;
    AllocationProtect : DWORD;
    RegionSize : DWORD;
    State : DWORD;
    Protect : DWORD;
    Type_9 : DWORD;
  end;
  {$EXTERNALSYM _MEMORY_BASIC_INFORMATION}
  TMemoryBasicInformation = _MEMORY_BASIC_INFORMATION;
  MEMORY_BASIC_INFORMATION = _MEMORY_BASIC_INFORMATION;
  {$EXTERNALSYM MEMORY_BASIC_INFORMATION}

Члены
BaseAddress
Указатель на базовый адрес региона страниц.
AllocationBase
Указатель на базовый адрес диапазона страниц ассигнован функцией VirtualAlloc. Страница, на которую указывает член BaseAddress, содержится в пределах этого диапазона распределения.
AllocationProtect
Выбор защиты памяти, когда область была первоначально ассигнована. Этот участник может быть одной из констант защиты памяти или 0, если у гостя нет доступа.
RegionSize
Размер в регионе, начиная с базового адреса, в которой все страницы имеют идентичные атрибуты, в байтах. 
State
Состояние страницы в регионе. Этот член может быть одним из следующих значений.
Состояние Смысл

MEM_COMMIT
0x1000
Указывает на фиксированные страницы, для которых физическое хранение было выделено, или в памяти или в страничном файле на диске.

MEM_FREE
0x10000
Указывает свободных страниц, не доступных для вызывающего процесса и которые будут выделены. Для свободных страниц информация в AllocationBase, AllocationProtect, Protect, тип и элементы не определены.

MEM_RESERVE
0x2000
Указывает на зарезервированные страницы, где диапазон виртуального адресного пространства процесса зарезервирован без любого физического выделяемого хранения. Для зарезервированных страниц информация в элементе защита не определена.
Protect
Защита доступа страницы в регионе. Этот член является одним из значений, перечисленных для элемента AllocationProtect.
Type
Тип страниц в регионе. Определены следующие типы.
Тип Смысл

MEM_IMAGE
0x1000000
Указывает, что страницы памяти в пределах региона сопоставляются в представление изображения раздела.

MEM_MAPPED
0x40000
Указывает, что страницы памяти в пределах региона сопоставляются в представление раздела.

MEM_PRIVATE
0x20000
Указывает на страницах памяти в пределах частного региона (что не разделяется другими процессами).
Замечания
Чтобы позволить отладчику отладить цель, которая используется на различной архитектуре (32-битовый против 64-битового), используйте одну из явных форм этой структуры.

Копия
typedef struct _MEMORY_BASIC_INFORMATION32 {
    DWORD BaseAddress;
    DWORD AllocationBase;
    DWORD AllocationProtect;
    DWORD RegionSize;
    DWORD State;
    DWORD Protect;
    DWORD Type;
} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;

typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {
    ULONGLONG BaseAddress;
    ULONGLONG AllocationBase;
    DWORD     AllocationProtect;
    DWORD     __alignment1;
    ULONGLONG RegionSize;
    DWORD     State;
    DWORD     Protect;
    DWORD     Type;
    DWORD     __alignment2;
} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;

Требования

Минимальная поддерживаемая клиента
Windows 2000 Professional
Минимальный поддерживаемый сервер
Windows 2000 Server
Заголовок
Windows.pas

VirtualQuery Delphi

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

Синтаксис Delphi

function VirtualQuery(lpAddress: Pointer;
  var lpBuffer: TMemoryBasicInformation; dwLength: DWORD): DWORD; stdcall;
lpAddress [in, необязательно]
Указатель на базовый адрес региона страниц для запрашиваться. Это значение округляется до следующей границу страницы. Чтобы определить размер страницы на главном компьютере, используйте функцию GetSystemInfo.
Если lpAddress указывает адрес выше наивысший адрес памяти, доступной для процесса, функция завершается с ERROR_INVALID_PARAMETER.
lpBuffer [out]
Указатель на структуру MEMORY_BASIC_INFORMATION, в которых информация указанная страница возвращается диапазон.
dwLength [in]
Размер буфера указывает параметр lpBuffer, в байтах.
Возвращаемое значение
Возвращаемое значение является фактическим количество байтов, возвращенных в буфере сведений.
Если вызов функции был неуспешен, возвращаемое значение равно нулю. Чтобы получить расширенные сведения об ошибке, вызовите функцию GetLastError. Значения возможной ошибки включают ERROR_INVALID_PARAMETER.

Замечания
VirtualQuery предоставляет информацию о регионе последовательных страниц, начиная с указанного адреса, которые разделяют следующие атрибуты:
  • Состояние всех страниц равно же (MEM_COMMIT, MEM_RESERVE, MEM_FREE, MEM_PRIVATE, MEM_MAPPED или MEM_IMAGE).
  • Если начальная страница не свободна, все страницы в регионе являются частью же первоначальное распределение страниц созданных один вызов VirtualAlloc, MapViewOfFile или один из следующих расширенных версий этих функций: VirtualAllocEx, VirtualAllocExNuma, MapViewOfFileEx, MapViewOfFileExNuma.
  • Права доступа, предоставляемые всех страниц это же (PAGE_READONLY, PAGE_READWRITE, PAGE_NOACCESS, PAGE_WRITECOPY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY, PAGE_GUARD или PAGE_NOCACHE).
Функция определяет атрибуты на первой странице в регионе и затем сканирует последующих страниц до тех пор, пока она сканирует весь диапазон страниц или пока встретится страница с nonmatching набором атрибутов. Функция возвращает атрибуты и размера региона страниц с помощью подходящих атрибутов, в байтах. Например если существует область 40 мегабайт (МБ), свободной памяти и VirtualQuery называется на странице, которая составляет 10 МБ в регион, функция получит состояние MEM_FREE и размером 30 МБ.
Если изменить общую страницу copy-on-write, становится частным процессу изменения страницы. Однако функции VirtualQuery продолжит представлять такие страницы как MEM_MAPPED (для представления данных) или MEM_IMAGE (для исполняемого образа просмотров), а не MEM_PRIVATE. Чтобы определить, произошла ли copy-on-write для конкретной страницы, либо доступ к странице или блокировки его с помощью функции VirtualLock убедитесь, что страница находится в памяти, а затем используйте функцию QueryWorkingSetEx, чтобы проверить Общие бит в расширенная информация о рабочем множестве для страницы. Если бит Shared ясно, страница является частным.
Эта функция доклады на регионе страниц в памяти вызывающего процесса, и функцию VirtualQueryEx доклады о регионе страниц в памяти указанным процессом.

Требования
Минимальная поддерживаемая клиента
Windows 2000 Professional
Минимальный поддерживаемый сервер
Windows 2000 Server
Заголовок
Windows.pas
Библиотека
Kernel32.lib
DLL
Kernel32.dll

SYSTEM_INFO Delphi

  PSystemInfo = ^TSystemInfo;
  _SYSTEM_INFO = record
    case Integer of
      0: ( dwOemId: DWORD);
      1: (wProcessorArchitecture: Word;
        wReserved: Word;
        dwPageSize: DWORD;
        lpMinimumApplicationAddress: Pointer;
        lpMaximumApplicationAddress: Pointer;
        dwActiveProcessorMask: DWORD;
        dwNumberOfProcessors: DWORD;
        dwProcessorType: DWORD;
        dwAllocationGranularity: DWORD;
        wProcessorLevel: Word;
        wProcessorRevision: Word);
  end;
  {$EXTERNALSYM _SYSTEM_INFO}
  TSystemInfo = _SYSTEM_INFO;
  SYSTEM_INFO = _SYSTEM_INFO;
  {$EXTERNALSYM SYSTEM_INFO}

Эта структура содержит сведения о текущей системе компьютера. Она включает в себя тип процессора, размер страницы, адреса памяти и идентификатор OEM.

Blogger совет

Для того, чтобы повысить находимость вашего блога в инете поисковиками пишите название статьи в транслите, а потом уже на русском языке. Так название у вашей страницы будет осмысленным, а не просто датой написания сообщения!

Пример
Название было Blogger sovet
На выходе получил страницу http://nmdsoft.blogspot.com/2010/10/blogger-sovet.html

Потом просто отредактировал название статьи на  Blogger совет

GetSystemInfo (Delphi)

Эта функция возвращает сведения о текущей системе.

Синтаксис Delphi
procedure GetSystemInfo(var lpSystemInfo: TSystemInfo); stdcall;

Параметры
Указатель на структуру SYSTEM_INFO для заполнения этой функцией.

Возвращаемое значение
Нет

Требования
ОС: Windows CE 1.0 и более поздних версий.
Заголовок: Windows.pas
Связывание библиотеки: Coredll.lib.

суббота, 16 октября 2010 г.

Чтение карты памяти

Сессия скоро))
Если мы можем, получит список запущенных процессов, то представляется интересной возможность прочитать содержимое адресного пространства процесса с целью определить, какие регионы зарезервированы в адресном пространстве процесса, каков объем зарезервированных регионов и свободного адресного пространства, как установлен режим доступа к тем или иным регионам и т.д..  Одним словом, надо читать карту адресного пространства процесса.
При создании процесса можно управлять доступом к его адресному пространству, т.е. разрешать или не разрешать чтение адресного пространства процесса.
Естественно, что прочитать вы можете только участок адресного пространства, отведенный в собственность прикладному процессу (т.е. 2 ГБ пользовательского адресного пространства процесса)
При помощи функции GetSystemInfo() получаем границы данного региона, т.е. минимальный и максимальный адреса, доступные приложению. Теперь наша задача - прочитать содержимое адресного пространства, ограниченного данными адресами.
Читаем при помощи функции VirtualQuery()
Чтение карты адресного пространства производим, организуя цикл от минимального доступного адреса до максимального доступного.
Передаем в VirtualQuery() минимальный из доступных адресов при первой итерации цикла. Функция возвратит нам объем региона, зарезервированного по данному адресу, его объем, установленный режим защиты и т.д.
Адрес следующего региона получаем так:
<Текущий адрес региона>+<Объем текущего региона>
Далее продолжаем итерации пока не доберемся до максимального из доступных адресов.

Многопотоковая обработка.

Задание 1 на текущую сессию))

Пример: выполнить имитатор гонок (в просторечии эта задача известна как «тараканьи бега» ) при помощи создания нескольких потоков. Каждый поток обслуживает свою «беговую дорожку». На исполнение все потоки запускаются одновременно, после  чего потоки произвольным образом приостанавливаются и запускаются вновь функциями SuspendThread() и ResumeThread().

На исполнение каждому потоку выделяется квант времени (например, 500 мс или 1 с). За этот период поток производит выполнение задачи, например, увеличивает позицию гонщика на некоторую величину. После истечения кванта времени поток приостанавливается на производный период времени, определяемый при помощи генератора случайных чисел.
После завершения гонки производиться выдача результатов(очередность завершения).
Завершение потока после завершения исполнения можно произвести при помощи функций ExitThread() и TerminateThread().



Использование класса TThread, включенного в поставку interise Delphi или C++ Builder, допускается в ознакомительных целях.

пятница, 15 октября 2010 г.

XML без переносов

Для удобства разбора XML использую Notepad++ и дополнение XML Tools с помощью которой вот такой вот xml документ



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

вторник, 12 октября 2010 г.

Counter-Strike informer for Delphi


Получение информации о текущем состоянии сервера Counter-Strike в сети по средством выполнения Udp запроса.
Основная сложность состояла в разборе ответа сервера.


Проверял на работоспособность на серверах использующий 37 протокол, а на 47, 48 не проверял.

суббота, 2 октября 2010 г.

Gecko for Delphi

Компонент TGeckoBrowser 15.01.2010
Для использования всех возможностей движка  Gecko в своих приложениях на Delphi




Компонент идет с исходниками и примерами.

Компонент TGeckoBrowser можно скачать тут. Download 

Компонент TGeckoBrowser Delphi 2007 можно скачать тут. Download 
Инструкция по установке
1- инсталим .dpk файл из папки GeckoSDK
2- инсталим .dpk файл из папки GeckoComponents
3- добавляем путь до папок

четверг, 30 сентября 2010 г.

Получение очередного значения генератора Firebird

select
    gen_id(generator_name, 1 ) as field_id
from rdb$database

одна запись в поле  field_id со значением очередного значения генератора generator_name

воскресенье, 26 сентября 2010 г.

Диалоговое окно WebBrowser ошибка сценария

Избавляемся от окна путем установки значения свойства Silent:=True

WebBrowser1.Silent:=True;

Свойство Silent запрет демонстрации ошибок сценария на сайте

Этот документ был изменен. Сохранить изменения?

Это диалоговое окно возникает только когда  WebBrowser находиться в режиме редактора и происходит загрузка другого документа, а в документ который был первоначально загружен были произведены изменения.
Чтобы избавиться от этого диалогового окна следует отключить режим редактора в WebBrowser и загрузить документ после чего снова включить режим редактора.
Включения редактора в WebBrowser я повесил на событие возникающие по окончанию загрузки документа в WebBrowser NavigateComplite.
.....
WebBrowser1.OnNavigateComplete2: = NavigateComplite;
(WebBrowser1.Document as IHTMLDocument2).designMode := 'off';
WebBrowser1.Navigate('Документ');
 .....
procedure NavigateComplite (ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  (WebBrowser1.Document as IHTMLDocument2).designMode := 'On';

end;

суббота, 11 сентября 2010 г.

FIBPlus + Ehlib локальная сортировка

Для того, чтобы в гриде Ehlib'а работала сортировка и фильтрация необходимо добавить в uses модуль находящийся в папке EhLib 5.2.84\DataService\Others естественно если вы работаете с
Ado необходимо выбрать EhlibADO в нашем случае необходимо выбрать EhlibFib
после чего в свойствах грида выставить значения так
 .SortLocal := True;
 .STFilter.InstantApply := True;
 .STFilter.Local := True;
 .STFilter.Visible := True;
после чего фильтрация должна работать в гриде нормально без написания дополнительного кода

И необходимо в Uses прописать EhlibFIB (для фибов)

Загрузка изображения из интернета в поток (Delphi)

uses wininet;

function LoadImage(url:string): TMemoryStream;
var
  hInternet, hConnect: pointer;
  dwBytesRead, i, L: cardinal;
  sTemp: AnsiString;
begin
  Result:=TMemoryStream.Create;
  hInternet := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if Assigned(hInternet) then
    begin
      hConnect := InternetOpenUrl(hInternet, PChar(url), nil, 0, 0, 0);
      if Assigned(hConnect) then
        try
          i := 1;
          repeat
            SetLength(sTemp, L + i);
            if not InternetReadFile(hConnect, @sTemp[i], sizeof(L),dwBytesRead) then
              break;
            inc(i, dwBytesRead);
            until dwBytesRead = 0;
        finally
          InternetCloseHandle(hConnect);
        end;
    end;
  finally
    InternetCloseHandle(hInternet);
  end;
  Result.Write(sTemp[1], Length(sTemp));
  Result.Position := 0;
end;

Данную функцию использовал для загрузки изображений с различными форматами:
bmp, gif, png, jpeg, tiff, ico и др. Проблем не возникало. Главное, что необходимо сделать это сохранять картинки с теми же расширениями которые у них были, чтобы потом не возникало путаницы. Я сохранял с именами файлов которые брал из прямых ссылок на картинки.

Для получения имени файла из Url использую функцию

function ExtractUrlFileName(const AUrl: string): string;
var
  i: Integer;
begin
  i := LastDelimiter('/', AUrl);
  Result := Copy(AUrl, i + 1, Length(AUrl) - (i));
end;

воскресенье, 29 августа 2010 г.

Компонент Clipper версия 2.35 (Delphi)

Компонент Clipper выполняет логические операции отсечения (пересечение, объединение, разность и XOR) на 2D полигонах. Он с легкостью справляется со сложными (само пересекающимися ) полигонами, полигонами с отверстиями и полигонами с перекрытием совместного линейного края. Данный компонент быстрее остальных выполняет эти сложные операции.

Компонент TDirwatch (Delphi)

Не визуальных компонент, который уведомляет, когда файлы (или подкаталоги) в выбранном каталоге изменились.Этот компонент инкапсулирует функцию FindFirstChangeNotification WinAPI в просмотре потока.

Версия Delphi: 3-7
Freeware с полным исходным кодом, а также Demo.

Компонент TDirwatch можно скачать отсюда download

Компонент TDiff версии 4.1 (Delphi)

Не визуальных компонент используется в основном для сравнения изменения в файле.
Freeware с исходными кодами и включает в себя две простые demo программы.



Версия Delphi: 7, 2009


Компонент TDiff версии 4.1 можно скачать отсюда download

Компонент TZipFix - Версия 1.1 (Delphi)

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


Версия Delphi: 3-7
Freeware с полным исходным кодом, файл справки и примеры.
Последнее обновление: 6 апреля 2003 


Компонент TZipFix можно скачать отсюда download

суббота, 28 августа 2010 г.

Компонент GLibWMI 1.8beta All (Delphi)

Данная библиотека позволяется получить полную информацию о
  • Bios
  • Аудио карта
  • Жесткий диск
  • Принтер
  • Дисплей
  • Клавиатура
  • Процессор
  • CD-Rom
  • Батарея (если есть)
  • ОС
  • "Мышь"
  • Оперативная память
  • Процессы ПК
  • Службы ОС
  • Рабочий стол
  • Автозапуск
  • Сетевое оборудование
  • Аккаунты в ОС
  • Расшаренные папки
  • Задания на принтере
  • USB
  • Разделы жесткого диска
  • Переменные среды ОС
и все это вы можете использовать в вашем приложении.

четверг, 26 августа 2010 г.

Remote Registry (Удаленное редактирование реестра) Delphi

Просто для прикола над другом решил написать программку редактирования реестра у него на компе, основная ее часть заключается в подключении к компу жертвы и естественно получение прав на редактирование. Так как я знаю пароль админа домена мне это не составило труда))
Всегда ему говорил же отключай ты службу удаленного реестра, ну вот не слушался))

procedure TForm1.Button2Click(Sender: TObject);
var
  UserName,Password,DomainName:PAnsiChar;
  tolken:THandle;
  vReg: TRegistry;
begin
  UserName:='Логин';
  Password:='Пароль';
  DomainName:='Домен к которому принадлежит ПК';
  //коннектимся к компу
  try
    if LogonUser(UserName,DomainName,Password,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,tolken) then
    begin
      Beep;
      ImpersonateLoggedOnUser(tolken);
      vReg := TRegistry.Create(KEY_ALL_ACCESS);
      try
        vReg.RootKey := HKEY_CURRENT_USER;
        if vReg.RegistryConnect('\\noname') then //если не указать имя пк то редактирование будет происходить на локальном ПК будьте бдительны
        begin
          vReg.OpenKey('Control Panel\Mouse',False);
          Memo1.Lines.add('До: '+vReg.ReadString('MouseSensitivity'));

          vReg.WriteString('MouseSensitivity','20');
          Memo1.Lines.add('После: '+vReg.ReadString('MouseSensitivity'));

          vReg.CloseKey;
        end;
      finally
        vReg.Free;
      end;
    end;
  finally
    CloseHandle(tolken);
  end;
end;

В целом код не сложный если прочитать msdn, но вот только я по началу не заметил того что редактирование реестра HKEY_CURRENT_USER происходит у админа ПК под которым я залогинился, а не под логином моего друга)), но в ветке HKEY_USERS я нашел все учетки и друга и админа да и вообще всех пользователей пк которые можно изменять без проблем.

Утилита для проверки файлов которые еще живы на Turbobit (TurbobitLinkChecker)

Данная утилита написана по просьбе NoSch, который является администратором сайта и тесно связан с этим файлообменником.
Программа написана с использованием библиотеки Indy входящей в комплект поставки Delphi 2010, просто нужно было быстро это сделать, а ни чего другого под рукой не было.
Думаю кому нибудь эта утилита пригодиться и мой труд не пропадет даром.
Внешний вид программы весьма аскетичный, чтобы ни чего не отвлекало.

  
Имеется 3 списка в первом указываем все ссылки которые необходимо проверить, во втором и третьем получаем список рабочих ссылок и список нерабочих ссылок соответственно.

суббота, 21 августа 2010 г.

Создание иконки для компонента Delphi 2010 (Creating an icon for the component Delphi 2010)

Создадим пакет для будущего компонента (если у вас нет компонента (так для эксперимента))

Зайдем File->New->Package


если у вас нет этого пункта то File->New->Other->Package


Получим пустой пакет. После чего его необходимо сохранить в какую нибудь папку


пятница, 20 августа 2010 г.

Проблема с иконками в палитре компонентов Delphi 2010

Проблема  заключается в том, что при добавлении компонента у него иконка то есть то ее нет.
На мой взгляд проблема вызвана тем, что в файле ресурсов имеется иконка компонента только одного размера и оно 24 битное, а среда требует 32 бита, а сама палитра поддерживает иконки размерами  16х16, 24х24 и 32х32

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

TMyComponent  16х16
TMyComponent24 24х24
TMyComponent32 32х32

После чего все должно корректно отображаться.
Так же необходимо,чтобы изображение было 32bit

Было выявлено в процессе создания иконки для своего компонента. Возможно конечно это единичный случай, но следует о нем просто знать

Отличный редактор ресурсов (Resource Editor)

Нашел на просторах интернета интересную бесплатную программу для редактирования ресурсов, аналог Image Editor идущей с Delphi7 по какой то причине она отсутствует во всех последующих версиях Delphi. Автор этой программы решил это исправить, но он не может связать свою программу со средой по причине отсутствия интерфейсов необходимых для этого

Внешний вид программы


понедельник, 2 августа 2010 г.

Blogger robot.txt

Решение проблемы Blogger robot.txt 

URL заблокирован файлом robots.txt Modifying Robots.txt on Blogger possible? Create a robots.txt file

Для обхода robot.txt вашего блога в шаблоне вашего блога необходимо добавить следующую строку


<meta content='INDEX, FOLLOW' name='robots'/>

После чего все ваши страницы будут разрешены к индексации.

Запрещение индексации ссылок

<noindex><a href="http://сайт">ссылка</a></noindex>
и
<a rel="nofollow" href="http://сайт">ссылка</a>

TRegExpr (Delphi)

Универсальный инструмент для проверки пользовательского ввода на соответствие шаблонам, для замены подстрок и самого изощренного поиска.


Вы можете проверить синтаксическую корректность e-mail адреса, извлечь номера телефонов из не формализованного текста, найти необходимую информацию в web-странице - возможности ограничены только Вашим воображением. Правила (шаблоны) можно изменять не пере компилируя Вашу программу!

Proxy Parser (Delphi)

Компонент позволяющий получать список прокси серверов с сайтов их раздающих (единственное не все их дают просто так некоторые используют методы защиты от таких вот сборщиков ). Мой самый первый компонент, впервые в нем использовал коллекции и для его работы необходима библиотека indy(на тот момент почему то они меня устраивали глюков по крайней мере не было).


Компонент идет со всеми исходниками, работал на Delphi 7 на Delphi 2010 должен пойти тоже после пере компиляции пакета. Так же идет demo проект в котором показан пример использования компонента на практике.

При публикации данного компонента у себя на сайте или блоге прошу указать ссылку на мой блог думаю это не большая плата за авторство.

Компонент Proxy Parser можно скачать отсюда Download

Color Controls u2300 (Delphi)

Описание компонента Color Controls u2300

Красивый компонент Delphi для организации очень разнообразных таблиц в которых можно разными цветами выделять: поля, текст, цвет выделения. В комплекте идут исходники для delphi 5, delphi 6 и delphi 7 Demo пример в котором вы сможете увидеть все, что можно реализовать с помощью данного компонента (маленькой палитры).

воскресенье, 1 августа 2010 г.

Property XXXX does not exist (Delphi)

Возникает при обращении к свойству которого нет. Оно даже может и есть только имя его изменилось, на это тоже следует обращать внимание.
Причиной может служит использование другой версии компонента, в котором данного свойства нет. Установка нового компонента после некорректного удаления старого.

пятница, 30 июля 2010 г.

Описание DemoGoogleLogin

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

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

GoogleLogin Delphi часть 2

И так в предыдущей статье посвященной GoogleLogin я описал практически все, что было необходимо, но не описал методов нашего компонента. На сегодняшний день компонент претерпел некоторые изменения и я не стал удалять старую статью, а решил оставить ее для того, чтобы четко было видно отличия компонента от версии к версии.

Свойства компонента GoogleLogin
Свойства компонента остались практически без изменений, появилось лишь дополнительное поле Captha


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

Функция по загрузке jpg в Timage (Delphi)

Не скажу, что прям моя разработка, но к ней я свою корявую руку приложил))

//непосредственно сама функция по загрузке картинки формата jpg из сети интернет
//для работы функции необходимо добавить в uses ... wininet, Jpeg;


function GetImage(url:string): TPicture;
var
  hInternet, hConnect: pointer;
  dwBytesRead, i, L: cardinal;
  sTemp,aUrl: AnsiString; // текст страницы
  memStream: TMemoryStream;
  jpegimg: TJPEGImage;
begin
  hInternet := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if Assigned(hInternet) then
    begin
      hConnect := InternetOpenUrl(hInternet, PChar(url), nil, 0, 0, 0);
      if Assigned(hConnect) then
        try
          i := 1;
          repeat
            SetLength(sTemp, L + i);
            if not InternetReadFile(hConnect, @sTemp[i], sizeof(L),dwBytesRead) then
              break; // Получаем данные с сервера
            inc(i, dwBytesRead);
            until dwBytesRead = 0;
        finally
          InternetCloseHandle(hConnect);
        end;
    end;
  finally
    InternetCloseHandle(hInternet);
  end;
  memStream := TMemoryStream.Create;
  jpegimg := TJPEGImage.Create;
  try
    memStream.Write(sTemp[1], Length(sTemp));
    memStream.Position := 0;
    //загрузка изображения из потока
    jpegimg.LoadFromStream(memStream);
    Result:=TPicture.Create;
    Result.Assign(jpegimg);
  finally
    //очистка
    memStream.Free;
    jpegimg.Free;
  end;
end;

среда, 21 июля 2010 г.

GoogleLogin Delphi

Доброго времени суток)))

Сегодня мы обсудим компонент googleLogin написанный Владиславом Баженовым aka Vlad (его сайт), ну и я его немного доработал (хотя для кого-то может, сделал его хуже)
Короче как бы то ни было, но я решил рассказать о нем подробнее, чтобы любой программист смог его применить по назначению и получить  максимум из того, что в нем реализовано

Установка компонента в Delphi 2010

Для установки компонента необходимо зайти в папку  googleapi\packages\googleLogin_pack
в ней найти файл GoogleLogin.dpk открыть его в среде Delphi 2010 (он был написан в ней)
в настройках среды прописать переменные окружения, в общем указать путь  (где то на диске)\googleapi\packages\googleLogin_pack\ после чего в менеджере проекта нажать на надписи GoogleLogin.bpl правой клавишей мыши и выбрать пункт меню Install после чего если вы все сделали правильно должно появиться окно с информацией о том, что компонент успешно установлен в систему



Установка компонентов в среду Delphi 7

Для того чтобы установить компонент в среду Delphi, который идет с файлом [nameComponent].dpk необходимо выполнить следующие действия.

Выполнить двойной клик на файле [nameComponent].dpk после чего откроется среда разработки с окном Package - [nameComponent].dpk

Пример окна
В нем мы видим кнопки Compile, Add, Remove, Install, Options
Кнопка Compile компилирует как это понятно из названия компонент (иногда это требуется перед установкой специфических компонентов)
Кнопка Add добавляет файлы к пакету компонента, а кнопка Remove в свою очеред удаляет файлы из пакета в основном они нужны только для разработчиков компонентов.
Кнопка Install необходима для установки компонента в среду разработки.
Кнопка Options вызывает окно настройки пакета компонента

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

Сollapsepanel (Delphi)

Отличный компонент. Каждый знаком с панельками, которые сворачиваются и разворачиваются. В отличие от подобных "групп" в Windows XP, CollapsePanel имеют сравнительно простой внешний вид, но здорово украсят любую программу.


Скачать Сollapsepanel можно отсюда  download

NewSpeedButton (Delphi)

TNewSpeedButton (LSSpeedButton) - Кнопка, подобная той, что используется в программе QIP Infium. Классные кнопочки для delphi. Неприхотливые в установке меня очень порадовали
Можно использовать для создания оригинального интерфейса с минимальным количеством кнопок на главной форме сочетающих в себе выпадающие списки, при грамотном использовании которых интерфейс станет интуитивно понятен и прост в обращении.



Скачать NewSpeedButton  можно отсюда  download

ImageButton (Delphi)

Графическая кнопка (поддерживаемый формат файлов - *.bmp). Выглядит подобно кнопке выбора статуса в Skype.


При нажати на кнопку появляется красивое меню с дополнительными кнопками

Скачать ImageButton можно отсюда  download

Pngcp (Delphi)

Кнопка с возможностью вставки изображения. изображение можно позиционировать. так же имеются дополнительные стили отображения кнопки на форме. На скрине все прекрасно видно.


Скачать Pngcp можно отсюда  download

Freebutton (Delphi)

Компонент Freebutton-это фигурная цветная кнопка с тенью, у которой можно изменить цвет. Также на кнопку можно поместить изображение. Очень красивые кнопочки, ну сами видите


Скачать Freebutton можно отсюда  download

Btncomps (Delphi)

5 нестандартных красивых кнопочек в палитру Delphi))


Скачать Btncomps можно отсюда  download

Userslistbox_28 (Delphi)

Компонент реализующий нестандартный ListBox с возможностью вставки графики, нестандартной подсветкой и многое другое


Скачать Userslistbox_28 можно отсюда  download

Mxcalendar 1.21 (Delphi)

Красивый календарик для delphi


Скачать Mxcalendar 1.21 можно отсюда   download

SYSinfo (Delphi)

Компонент для получения информации о системе
Сам его не проверял

Скачать SYSinfo можно отсюда  download

CX_cpu (delphi)

Компонент для получения исчерпывающей информации о процессоре ПК


Скачать CX_cpu можно отсюда  download

HotKeyManager (Delphi)

С помощью этого компонента можно реализовать в своих программах глобальные горячие клавиши без написания большого количества кода. Так же комбинация горячих клавиш не обязательно должна состоять из двух , она может быть и их трех одновременно нажатых клавиш.
В комплекте пример использования и сам компонент

Скачать HotKeyManager  Delphi можно отсюда  download

Coolhints2k Delphi

Компонент для Delphi с помощью которого можно реализовать интересные всплывающие подсказки с поиском  выводом определенного раздела справки и тд.


Скачать Coolhints2k можно отсюда  download

Сbasyncdirscan (Delphi)

Компонент Cbasyncdirscan реализует много поточный поиск по директориям на вашем пк.

Компонент Cbasyncdirscan  можно скачать отсюда  download

PNG Delphi

Delphi7 не работает с PNG, но с этой библиотекой будет. Этот модуль облегчил жизнь многим программистам у которых появилась необходимость использовать PNG изображения в своих проектах, который позволяет в обычный Image грузить PNG изображения. В общем очень удобная вещь с pngButton который идет в качестве примера использования их модуля в VCL

Скачать PNGDelphi7 можно отсюда  download

Delphi Gif

Компонент не визуальный, позволяющий отображать на форме GIF-изображения без всяких таймеров.
Для того чтобы ваше приложение научилось работать с  GIF-изображениями необходимо просто прописать gifimage в uses  и в процессе работы приложения в обычный Timage загрузить GIF-изображение.

Компонент Gifimage можно скачать осюда

Видео урок по этому компоненту здесь

Drawobjects (delphi)

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


Компонент Drawobjects можно скачать отсюда download

Atimagebox (Delphi)

Компонент Atimagebox для Delphi/C++Builder, показывающий изображение в прокручиваемой области. Компонент имеет такие полезные свойства как ImageFitToWindow, ImageCenter, ImageScale и т.д., поэтому с помощью него очень удобно отображать изображения.
Практически часть просмоторщика картинок реализована за вас. (при проверке работал компонент шустро. по край не мере в демке )


Компонент Atimagebox можно скачать отсюда download

Shapedform

Компонент для среды Delphi который по заданной картинке маске формирует регион формы.
С помощью этого компонента можно создать Форму любой формы)))
Пример использования компонента.
Буквы на рабочем столе это форма приложения которую можно так же закрыть, переместить и все, что с обычной формой, просто эта форма не квадратная.
В общем область использования этого компонента ограничивается лишь вашим воображением


Скачать компонент Shapedform можно отсюда download

TKMAlert (Delphi)

Компонент реализующий всплывающее окошко, как у программы Qip
Можно использовать для оповещения пользователя о наступлении какого либо события, которое не будет ему мешать заниматься делами и для того, чтобы закрыть окошко ему просто будет достаточно щелкнуть левой кнопкой мыши в его области и оно скроется с глаз долой и будет ждать своей участи.


Компонент тестировался на Delphi 7 все прекрасно работало.
Скачать можно отсюда DOWNLOAD

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

Synchronize

Используется для синхронизации потоков. Важно помнить, что параметром Synchronize (параметр)
может быть метод без параметров.
Запись типа  Synchronize(myProcedure(fdsf)); будет расценена как ошибка, а Synchronize(myProcedure) будет работать, как надо.

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

Удивительное рядом

В процессе разработки компонента с использованием потоков обратил внимание на вставку кода которую использовал программер, который писал подобный компонент для работы с сетью и периодически делал вставку вот этого кода

while PeekMessage(msg,0,0,0,PM_REMOVE) do
begin
  TranslateMessage(msg);
  DispatchMessage(msg);
end;

решил разобраться, что же делает этот код, оказалось, что ни чего сверх естественного в нем нет
Проще говоря это даже всем известный код, который мы ни раз использовали в местах где могут происходит зависания формы. Ладно не буду томить это код   Application.ProcessMessages;

воскресенье, 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.