Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на DELPHI v3-7 Сокеты


Информационный Канал Subscribe.Ru

ПРОГРАМИРОВАНИЕ НА DELPHI v1-7

  САЙТ/АРХИВ РАССЫЛКИ ::  НАШИ OFFLINE-ЖУРНАЛЫ   :: ФОРУМ

 

Привет всем!!! Извините меня за то, что так долго не было выпуска! Просто мы переезжали на новый платный хостинг и времени не было совсем:( Ну да ладно, это мы нагоним!!!

Охота вот что сказать! Как вы заметили, у рассылки новый дизайн, что вы думаете по этому поводу?
Также у рассылки новый сайт, на котором у нас теперь есть форум, где мы всегда будем рады помочь вам в поиске вашего ответа! И ещё поменялся ящик для вопросов и ответов, теперь это Delphi@GoldFaq.ru

Небольшое объявление: Вышел новый электронный оффлайн-журнал Webъ-Suxxx, это по сути уникальное издание. Почему? Да потому, что содержание сильно отличается от других журналов! Такого содержания не было и, наверное, не будет у других! Интересно? Тогда топчи сюда чтобы скачать его: http://www.goldfaq.ru

Если у вас есть предложения или замечания, прошу писать мне angel@goldfaq.ru

В этом выпуске

1)TServerSocket-->
2)TClientSocket
-->
3)ЧАТ на сокетах-->
4)Вопросы-->
5)Ответы-->

СТАТЬИ 


TServerSocket

Компонент TServerSocket используется для приёма входящих поключений и для приёма\передачи информации.
Сервер, основаный на сокетном протоколе, может обслуживать сразу множество клиентов(Их максимальное кол-во, вы можите выбрать сами
или вообще не ограничивать его, как это и сделанно по умолчанию)

Схема работы с сервером должна выглядеть так:

1)Определение св-в Port и ServerType - чтобы к серверу могли нормально подключаться клиенты, нужно, чтобы порт,
используемый сервером точно совпадал с портом, используемым клиентом (и наоборот).
Свойство ServerType определяет тип подключения;

2)Открытие сокета - открытие сокета и указанного порта.
Здесь выполняется автоматическое начало ожидания подсоединения клиентов (Событие OnListen);

3)Подключение клиента и работа с ним - здесь подключается клиент и идёт обмен данными с ним.

4)Отключение клиента - Здесь клиент отключается и закрывается его сокетное соединение с сервером;

5)Закрытие сервера и сокета - По команде администратора сервер завершает свою работу, закрывая все открытые сокетные
каналы и прекращая ожидание подключений клиентов.


Свойства

Socket - класс TServerWinSocket, через который Вы имеете доступ к открытым сокетным каналам.
Далее мы рассмотрим это свойство более подробно, т.к. оно, собственно и есть одно из главных.

ServerType - тип сервера. Может принимать одно из двух значений: stNonBlocking - синхронная
работа с клиентскими сокетами и stThreadBlocking - асинхронный тип работы. Для каждого
клиентского сокетного канала создается отдельный процесс (Thread).

ThreadCacheSize - количество клиентских процессов (Thread), которые будут кэшироваться сервером.
Здесь необходимо подбирать среднее значение в зависимости от загруженности Вашего сервера.

Active - показатель того, активен в данных момент сервер, или нет. Т.е., фактически, значение True указывает на то, что
сервер работает и готов к приему клиентов, а False - сервер выключен. Чтобы запустить сервер, нужно просто присвоить этому
свойству значение True( или вызвать процедуру OPEN, что равносильно присваиванию значения True свойству Active)

Port - номер порта для установления соединений с клиентами. Порт у сервера и у клиентов должны быть одинаковыми.
Рекомендуются значения от 1025 до 65535, т.к. от 1 до 1024 - могут быть заняты системой.

Service - строка, определяющая службу (ftp, http, pop, и т.д.), порт которой будет использован.
Это своеобразный справочник соответствия номеров портов различным стандартным протоколам.

Методы

Open - Запускает сервер. По сути, эта команда равносильна присвоению значения True свойству Active;

Close - Останавливает сервер. По сути, эта команда идентична присвоению значения False свойству Active.

События

OnClientConnect - возникает, когда клиент установил сокетное соединение. (OnAccept);

OnClientDisconnect - возникает, когда клиент отсоединился от сокетного канала;

OnClientError - возникает, когда текущая операция завершилась неудачно, т.е. произошла ошибка;

OnClientRead - возникает, когда клиент передал серверу какие-либо данные. Доступ к этим данным можно получить через
пеаедаваемый параметр Socket: TCustomWinSocket;

OnClientWrite - возникает, когда сервер может отправлять данные клиенту по сокету,т.е при соединении;

OnGetSocket - в обработчике этого события Вы можете отредактировать параметр ClientSocket;

OnGetThread - в обработчике этого события Вы можете определить уникальный процесс (Thread) для каждого отдельного
клиентского канала, присвоив параметру SocketThread нужную подзадачу TServerClientThread;

OnThreadStart, OnThreadEnd - возникает, когда подзадача (процесс, Thread) запускается или останавливается, соответственно;

OnAccept - возникает, когда сервер принимает клиента или отказывает ему в соединении;

OnListen - возникает, когда сервер переходит в режим ожидания подсоединения клиентов.


TServerSocket.Socket (TServerWinSocket)

ActiveConnections (Integer) - количество подключенных клиентов;
ActiveThreads (Integеr) - количество работающих процессов; Connections (array) - массив, состоящий из отдельных классов TClientWinSocket для каждого подключенного клиента. Например, такая команда:
ServerSocket1.Socket.Connections[0].SendText('Hello!');
отсылает первому подключенному клиенту сообщение 'Hello!'. Команды для работы с элементами этого массива - также (Send/Receive)(Text,Buffer, Stream);
IdleThreads (Integer) - количество свободных процессов. Такие процессы кэшируются сервером (см. ThreadCacheSize);
LocalAddress, LocalHost, LocalPort - соответственно - локальный IP-адрес, хост-имя, порт;
RemoteAddress, RemoteHost, RemotePort - соответственно - удаленный IP-адрес, хост-имя, порт;
Методы Lock и UnLock - соответственно, блокировка и разблокировка сокета.

Обмен данными.

Передача.
Отсылка текстовых данных производится при помощи проедуры
ServerSocket1.Socket.Connections[0].SendText('Hello!');, где ServerSocket1-экземпляр объекта TServerSocket,Socket-TServerWinSocket,Connections[0]-это для посылки сообщения только первому подключенному клиенту,SendText('Hello!')-отправка текста, также есть и SendBuffer, SendStream(для отправки данных разного типа), а так можно отправить сообщение всем клиентам:
for I:=0 to ServerSocket1.Socket.ActiveConnections-1 do{Переменная ActiveConnections содержит кол-во подключённых клиентов}
begin
ServerSocket1.Socket.Connections[I].SendText(edit1.Text);
end;

Приём.
При приёме данных от сервера вызывается код события OnClientRead, именно туда, нужно вставить следующий код:
memo1.Lines.Insert(A,socket.ReceiveText);{Вставляем принятый код на позицию A в memo1}
A:=A+1;{Прибавляем к переменной A единицу, для того,чтобы в следующий раз принятая строчка попала на позицию ниже}


TClientSocket 

Компонент TClientSocket используется для подключению к удалённому серверу и для приёма\передачи информации.
Схема работы клиента должна выглядеть так:

1)Определение св-в Port,Address- чтобы подключиться к серверу, нужно, чтобы порт,
используемый клиентом точно совпадал с портом, используемым сервером (и наоборот).
Свойство Addres-это IP-адрес удалённого компьютера

2)Подключение к удалённому серверу- подключение к ip-адресу, через указаный порт.
Здесь выполняется Событие OnConnect;

3)Работа с удалённым сервером- обмен данными с сервером.

4)Отключение- отключение от сервера.

Свойства

Active - показатель того, активен в данных момент клиент, или нет. Т.е., фактически, значение True указывает на то, что
клиент подключен к серверу, а False - сервер выключен. Чтобы запустить сервер, нужно просто присвоить этому
свойству значение True( или вызвать процедуру OPEN, что равносильно присваиванию значения True свойству Active)

Address - IP-адрес удалённого компьютера.

ClientType - тип клиента. Может принимать одно из двух значений: stNonBlocking - синхронная
работа с сервером и stThreadBlocking - асинхронный тип работы.

Host - Имя удаленной машины(При указанном IP-адресе, его можно не указывать)

Port - номер порта для установления соединений с сервером. Порт у сервера и у клиента должен быть одинаков.

Service - строка, определяющая службу (ftp, http, pop, и т.д.), порт которой будет использован.
Это своеобразный справочник соответствия номеров портов различным стандартным протоколам.

Методы

Open - Запускает клиента. По сути, эта команда равносильна присвоению значения True свойству Active;

Close - Останавливает клиента. По сути, эта команда идентична присвоению значения False свойству Active.

События

OnConnect - вызывается при подключении.

OnDisconnect - вызывается при отключении.

OnError - вызывается при ошибке клиента.

OnRead - вызывается тогда, когда клиент получает сообщение от сервера.

OnWrite - возникает когда клиент может посылать данные серверу.


Обмен данными.

Отсылка.
Отсылка текстовых данных производится при помощи проедуры
ClientSocket1.Socket.SendText('Hello!');, где ClientSocket1-экземпляр объекта TClientSocket,Socket-TCustomWinSocket,SendText('Hello!')-отправка текста серверу, также есть и SendBuffer, SendStream(для отправки данных разного типа)

Приём.
При приёме данных от сервера вызывается код события OnRead, именно туда, нужно вставить следующий код:
memo1.Lines.Insert(A,socket.ReceiveText);{Вставляем принятый код на позицию A в memo1}
A:=A+1;{Прибавляем к переменной A единицу, для того,чтобы в следующий раз принятая строчка попала на позицию ниже}


Чат на сокетах

При помощи компонентов TClientSocket и TServerSocket я неписал простенький чат, который объясняет основные примеры работы с сокетами.В принципе эта программа уневерсальна, т.к. может работать не только с сабой, но и с любым другим приложением умеющем читать\писать в порты.

Для компиляции вам понадобится:
4 экземпляра компонента TButton под именами Button1,Button2,Button3,Button4
3 экземпляра компонента TEdit под именами Edit1,Edit2,Edit3
1 экземпляр компонента TMemo под именем memo1
1 экземпляр компонента TServerSocket под именем Server
1 экземпляр компонента TClientSocket под именем Client

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
Client: TClientSocket;
Edit3: TEdit;
Button2: TButton;
Button3: TButton;
Server: TServerSocket;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button3Click(Sender: TObject);
procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button4Click(Sender: TObject);
procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerListen(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
A,I:integer;
P,P1:boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);{Код для кнопки соединения и отмены соединения}
begin
if P1=true then
begin
client.Close;
button1.Caption:='Соединить';
P1:=False;
end
else
begin
Client.Port:=StrToInt(Edit1.Text);
Client.Address:=edit2.Text;
Client.Open;
button1.Caption:='Отмена';
end;
end;

procedure TForm1.Button2Click(Sender: TObject);{Код для кнопки отсылки текста}
begin
if client.Active=true then
begin
Client.Socket.SendText(Edit3.Text);
memo1.Lines.Insert(A,'<'+edit3.Text);
A:=A+1;
Edit3.Text:='';
end;
if Server.Active=true then
begin
for I:=0 to server.Socket.ActiveConnections-1 do{Отправка ВСЕМ клиентам}
begin
server.Socket.Connections[I].SendText(edit3.Text);
end;
memo1.Lines.Insert(A,'<'+edit3.Text);
A:=A+1;
Edit3.Text:='';
end;
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);{Клиент получил сообщение}
begin
memo1.Lines.Insert(A,'>'+socket.ReceiveText);
A:=A+1;
end;

procedure TForm1.Button3Click(Sender: TObject);{Код для кнопки открытия\закрытия порта}
begin
if p=true then
begin
server.Close;
Button3.Caption:='Слушать порт';
P:=False;
end
else
begin
server.Port:=StrToInt(edit1.Text);
Server.Open;
button3.Caption:='Закрыть порт';
end;
end;

procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);{Сервер получил сообщение}
begin
memo1.Lines.Insert(A,'>'+socket.ReceiveText);
A:=A+1;
end;

procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);{Клиент подсоединился}
begin
ShowMessage('Подсоединились к '+client.Socket.RemoteAddress);
P1:=True;
end;

procedure TForm1.ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);{К серверу подсоединился клиент}
begin
ShowMessage('Подсоединился клиент '+server.Socket.Connections[0].RemoteAddress);
end;

procedure TForm1.Button4Click(Sender: TObject);{Код для кнопки очистки Mеmo}
begin
memo1.Lines.Clear;
A:=0;
end;

procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);{Клиент отсоединился}
begin
Showmessage('Соединение разорвано');
end;

procedure TForm1.ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);{Клиент отсоединился от сервера}
begin
ShowMessage('Клиент разорвал соединение:(((');
end;

procedure TForm1.ServerListen(Sender: TObject; Socket: TCustomWinSocket);
begin
P:=true;
end;

procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);{При ошибке-разрываем соединение}
begin
client.Close;
button1.Caption:='Соединить';
P1:=False;
end;

procedure TForm1.ServerClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);{При ошибке закрываем порт}
begin
server.Close;
Button3.Caption:='Слушать порт';
P:=False;
end;

end.

НОВЫЕ ОТВЕТЫ

Вопрос # 10 от Delivery

Привет Пеопл!!! Хочу сказать что в Делфи 7 Компоненты Fastnet нету,
это компонента из прошлых версий Делфи. В Делфи 7 Появились новые
компоненты для работы с сетевыми протоколами и интернет: "Indy
Clients, Indy Mics, Indy Server,...." и всё остальное связанное с
Indy. Кстати а у меня встречный вопрос:"Как Отображать те компоненты
которые в данных компонентах они есть а на вкладке их нету. К примеру
TIdFTPListItems TFileListView(Если залезть в Component->Configure
palette...->Далее выбрать вкладку System то TFileListView есть а на
вкладке его нету и поэтому у меня не получаеться использовать их???).
А как использовать TIdFTPListItems и где он находиться я не имею
представления да и хелп Хромает???"
Моё Мыло: Mikle_kpi@ukr.net
Моя Аська: 158888038

Отвечает None

К сожалению:(( на данный вопрос, ответов не поступило.


Вопрос # 11 от rasilki2@mail.kz

У меня такой вопрос, как в Delphi вызвать окно Windows форматирование
дискеты. Спасибо!!!

Отвечает santi@tut.by

ВНИМАНИЕ!!! ПРИВЕЛЕННЫЙ НИЖЕ КОД МНОЮ НЕ БЫЛ ПРОВЕРЕН! Следовательно, я не несу никакой ответственности за потерю данных на данном носителе!!! (Однако я на 75% уверен, что эта функция для диска А:)
В Shell32.dll спрятана функция WinApi SHFormatDrive, вызывающая стандартный диалог форматирования сменного носителя
....................
const
SHFMT_ID_DEFAULT = $FFFF;
// Опции форматирования
SHFMT_OPT_QUICKFORMAT = $0000;
SHFMT_OPT_FULL = $0001;
SHFMT_ORT_SYSONLY = $0002;
// Коды ошибок
SHFMT_ERROR = $FFFFFFFF;
SHFMT_CANCEL = $FFFFFFFE;
SHFMT_NOFORMAT = $FFFFFFFD;

function SHFormatDrive(Handle: HWND; Drive, ID, Options): LongInt; stdcall; external 'shell32.dll' name 'SHFormatDrive'

procedure TForm1.Button1Click(Sender: TObject);
var
retCode : LongInt;
begin
retCode := SHFormatDrive(Handle, 0, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT);
if retCode < 0 then ShowMessage('Не могу отформатировать диск!');
end;

Отвечает dig-vam

JvFormatDriveDialog1.Execute;
смотри демо
\JCL\jvcl\examples\JvDialogs


Вопрос # 11 от
Satan Claus

Люди! Помогите!
Как скрыть свое приложение из Диспетчера задач (CTRL+Alt+Del) под XP
если функция RegisterServiceProcess не пашет (Delphi пишет:
"Точка входа в процедуру RegisterServiceProcess не найдена в
библиотеке DLL KERNEL32.DLL")?????

Отвечает Димка

Трям!!! (Доброе время суток, Satan Claus!)
Тебе должна помочь функция плана

function SetWindowLong(nWnd: HWND; nIndex: Integer;
dwNewLong: Longint) : Longint; stdcall;

Где: параметр hWnd является дескритором окна. Если функция применяется еще к не созданному окну, в качестве параметра hWnd можешь применить дескриптор приложения Application.Handle. Параметр nIndex задает относительное смещение в переменной, определяющей стиль. Параметр dwNewLong определяет заменяемые составляющие стиля.
Если тебе необходимо просто спрятать свою прогу с полосы задач, то код приложения будет иметь вид:
(Необходимо вмешаться в головной модуль проги)

program Project1

uses
Forms,
Windows, //Эту строчку нужно добавить в исходный код
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
SetWindowLong(Application.Handle, GWL_EXSTYLE,
WS_EX_TOOLWINDOW); ////Эту строчку нужно добавить в исходный код
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Выше приведенный код спрячет приложение с полосы задач, но оставит доступ к нему через Ctrl-Alt-Del.

Второй вариант убрать прогу с полосы задач.
Вместо строки SetWindowLong(...) можно написать строчку:
Application.ShowMainForm := false, но здесь нужно не забыть проверить свойство Visible главной формы. Оно должно быть равным false!!!!!! Этот код полностью спрячет приложение!

А третий вариант - в обработчик события OnCreate головной формы нужно включить операторы:

Visible := false;
Application.ShowMainForm := false;

Удачи!
С Ув. mrDimon.

Отвечает Alexandr Karasev aka DemS@R

Написав приложение как службу. По другому нельзя.


Вопрос # 13 от hasan

Здравствуйте.

У меня такой вопрос.

Как узнать размер файла находящегося на сервере в интернете, но
естественно не скачивая его предварительно?

Отвечает Angel(Admin)

Глянь эту статью http://fordelphi.narod.ru/prog/formuli.htm


Вопрос # 15 от santa_k

Здравствуйте, дельфисты.
Скажите пожалуйста: как мне экспортировать таблицу Worda сложной
структуры (ячейки разной высоты) в базу данных (например: dbf).
Чтобы потом сделать просмотр этой базы средствами дельфи?

Спасибо.

 

Отвечает None

К сожалению:(( на данный вопрос, ответов не поступило.


Вопрос # 16 от Алексей

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


NMSMTP1.Host:= 'smtp.rambler.ru'; {адрес SMTP сервера}
NMSMTP1.Port := 25; {Порт SMTP сервера}
NMSMTP1.Connect; {Подключение к SMTP серверу}
With NMSMTP1 do
begin
Charset := 'windows-1251'; {Кодировка письма}
PostMessage.FromAddress:='xxx'; {Отправитель письма}
PostMessage.ToAddress.Text:='xxx' ; {Получатель письма}
PostMessage.Body.Text:='xxx'; {Текст письма}
SendMail; {Отправляем письмо}

end;
{Проверяем состояние подключения}
if NMSMTP1.Connected then
NMSMTP1.Disconnect {Отключение от сервера}

Отвечает santi@tut.by

я так отправляю:
procedure TForm1.Button1Click(Sender: TObject); //Отправляет письмо! ВНИМАТЕЛЬНО ЧИТАЙТЕ ИСХОДНИК!!!
var
LSMTP : TIdSMTP;
LMsg : TIdMessage;
// s : String;
i : Integer;
begin
LSMTP := TIdSMTP.Create(Self);
LMsg := TIdMessage.Create(LSMTP);
with LMsg do
begin
{ так присоединяется какой-нибудь аттач (ФАЙЛ!!!) ТО ЧТО ТЕБЕ И НАДО!!!
if opendialog1.Execute then
begin
s := opendialog1.FileName;
TIdAttachment.Create(LMsg.MessageParts, s);
end;
}
Subject := Edit3.Text; //тема
Recipients.EMailAddresses := Edit1.Text;//кому
From.Address := Edit5.Text;//от кого
From.Text := Edit2.Text;//от кого
Body.Text := Memo1.Lines.Text;//текст
end;
with LSMTP do
begin
AuthenticationType := atNone;
Host := Edit4.Text;
Connect;
for i := 1 to SpinEdit1.Value do Send(LMsg);
Disconnect;
ShowMessage('Finish!');
end;
FreeAndNil(LMsg);
FreeAndNil(LSMTP);
end;

Отвечает Alexandr Karasev aka DemS@R

NMSMTP.PostMessage.Attachments: TstringList; - Список файлов которые
надо присоединить.


Вопрос # 17 от SINNER

Кто нибуть знает, как правельно скомпилировать *.res файл EXE-шника с помощью drcc32. И как из первого EXE-шника
вызвать второй.
Зарание благодарен.

Отвечает Angel(Admin)

из первого EXE-шника вызвать второй можно командой Winexec(Pchar('ABCD'),SW_HIDE);, где ABCD-команда


Вопрос # 18 от Кременецкий А.Н(ОАО "МосАвтоСтекло")

Возник интересный вопрос. Требуется пропихнуть TCP-пакет через прокси,
посредством HTTP,SOCKS5. В сети нашел только старый престарый документ
"Туннелирование пакетов" который толком не понял. Если кто знает,
пожалуйста отзовитесь....

Отвечает None
К сожалению:(( на данный вопрос, ответов не поступило.


Вопрос # 19 от Oleg666

Привет народ! Кто-нибудь знает, как пишуться кряки для программ? Как можно во времы выполнения программы узнать(из другой программы) все переменные и их значения???

Отвечает AlexxO

Как пишутся кряки: кряк, ваще-то, по своей сути это тулза, которая
изменяет в другой тулзе несколько байт (а иногда и ваще 1). В Дельфи
и Паскале это реализуется так:

1) открываем файл;

2) ищем при помощи Seek(Offset: Longint; Origin: Word): Longint;
позицию, в которую надо внести изменения, и при помощи
BlockWrite(var f: File; var Buf; Count: Integer [; var
AmtTransferred: Integer]); вносим эти самые изменения;

3) закрываем файл;

З.Ы. Сначало надо ломануть тулзу вручную, а кряк пишется в последнюю
очередь. Кстати, ещё кряки можно сгенерировать с помощью тулзаков
для создания кряков CodeFusion, DzaPatcher (а поводу того как в
Дельфи реализовать генератор кряков, т. е. на выходе получить
экзешник -- сам ищу ответ на этот вопрос, если знаеш, подскажи)

Отвечает dr.Von Drake

Нужно использовать так называемые дебаггеры, которые производят
процесс отладки программы во время её исполнения. Но без
мало-мальских заний ассемблера туда лезть не советую, толку мало да
и время птратишь.
Самым известным дебаггером является SoftIce. К нему есть куча
плагинов и примочек. Где скачать: не знаю сам искал и без
результатно.

Отвечает p_kolya

Привет!
Кого ты там крякнуть то решил?
Если в памяти, то поможет любая ломалка игр, ковыряющаяся в
памяти(например ArtMoney: http://www.artmoney.ru) или можешь с помощью
debug'еров. Есть правда проблемка, что прога занимает не менее
~700kb(А то и более 3mb)
в памяти и как долго ты будешь ковырятся в адресах?
А если ломать файл, то самое элементарное, это зная адреса
значений, которые нужно изменить менять, через API или стандартыми
процедурами Delphi.

Отвечает Kin

Куча статей на тему крака здесь: http://cracklab.narod.ru/doc/index.htm
Вообще (очень упрощенно) принцип такой: дизассемблером или дебаггером изучаешь ассемблеровский код проги (не просто так, а прицельно, конечно, на том учаске где прога работает с введенным тобой регистрационным кодом, если программа, например, требует его ввести), исправляешь этот код (в hex-редакторе) так, чтоб прога не проверяла правильность введенного кода (это если дизассемблером пользуешься), или находишь место где прога сравнивает введенный тобой код с правильным и подсматриваешь значение регистра с правильным кодом (это в дебаггере). А вот как найти тот самый регистр, что и как менять в коде на ассемблере, читай статьи на сайте. Там много тонкостей, но если разберешься, то поймешь, что кракинг это дело крайне увлекательное. Конечно потребуется кой какой софт, если чего не найдешь пиши, дам ссылки.
А вот проги которая показывает все переменные и их значения нет (иначе кракинг был бы слишком прост:). Дело в том, что в откомпилированном (exe) файле собственно переменных как в исходном коде уже нет, есть лишь набор инструкций для процессора (типа этот байт заслать в тот регистр, а теперь эти регистры сравнить и т. п., там не до переменных:).
PS ДА собственно о том как пишуться краки: когда ты уже нашел что надо менять (и хочешь подарить крак всему размному человчеству:) пишешь небольшую программку заменяющую определенные байты в файле на другие. Есть даже программы автоматизирующие написание такой программки, например InqSoft Sign 0f Misery

Отвечает Alexandr Karasev aka DemS@R

Краки пишутся так, дебагером просматривается код ломаемой программы программы и
находится алгоритм защиты. Далее если понятен
алгоритм защиты пишется keygen или patch если алгоритм защиты не
понятен.

Во время выполнения чужой??? программы узнать имена переменных
нельзя, можно только их значения (просмотрев сегмент данных).


Вопрос # 20 от Заргаров Александр

Здраствуйте!

Есть небольшая проблема.. Интересно занимался ли кто-нибудь этим ранее - может подскажут.
Вообщем, есть какой-то компонент-контейнер (для текста - Memo, RichEdit ..). Хотелось бы сделать выделение по столбцам, как в Делфи при нажатии Alt+Shift+стрелки. Пробовал делать с отрисовкой выделения, но что-то не очень симпатично получается и неудобно.. Ведь в Делфи, Фаре и у Мелкософта сделано как обычное выделение.. Делал ли кто-нибудь такое. Советовали мне компоненты SynEdit, но что-то там намудрено.. и я так и не увидел желаемого результата. Заранее спасибо.

Отвечает None

К сожалению:(( на данный вопрос, ответов не поступило.


Вопрос # 21 от Polivanov Nikolay Sergeevich

Привет! Как на Delphi узнать(вычислить, определить) скорость связи с удаленным
сервером(Желательно используя WinSock)?
С уважением p_kolya.

Отвечает Angel(Admin)

Глянь эту статью http://fordelphi.narod.ru/prog/formuli.htm


Вопрос # 22 от Юрий Васильев

Подскажите, please, как скрыть приложение на панели задач и упрятать
значок в трэй? Спасибо заранее.
С уважением, NoN

Отвечает Vadim

Для начала нужно поместить иконку на трей. Это делается с помощью
функции Shell_NotifyIcon (см. Help->Windows SDK). Например:

procedure TForm1.FormCreate(Sender: TObject);
var
nif:TNotifyIconData;
begin
FillChar(nif,Sizeof(TNotifyIconData),0);
nif.cbSize:=sizeof(TNotifyIconData);
nif.Wnd:=Handle;
nif.uID:=0;
nif.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
nif.uCallbackMessage:=WM_USER;
nif.hIcon:=Application.Icon.Handle;
nif.szTip:='V A D I M u a';
Shell_NotifyIcon(NIM_ADD,@nif);
end;


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

procedure TForm1.WndProc(var Msg:TMessage);
var p:TPoint;
begin
if Msg.Msg=WM_USER then begin
if Msg.LParam=WM_RBUTTONDOWN then begin
SetForegroundWindow(handle);
GetCursorPos(p);
PopupMenu1.Popup(p.X,p.Y);
PostMessage(Handle,WM_NULL,0,0);
end;
end;
inherited;
end;

Вообщето LParam это собщение полученое от мыши на иконке.

чтобы спрятать главню форму в project1.dpr нужно дописать
Application.ShowMainForm:=false;
--
Best regards,
Vadim

Отвечает Edward

1 - й вариант (самый простой) Используй компонент RxTrayIcon из библиотеки RxLib http://www.rxlib.com.
2 -й вариант используйте Win32Api функцию Shell_NotifyIcon
Вот ее Си-прототип:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
);
Параметр dwMessage может принимать одно из трех значений: NIM_ADD, NIM_DELETE, NIM_MODIFY. Для добавления иконки он должен быть установлен в NIM_ADD.
Параметр pnid имеет тип PNOTIFYDATA, который описан как:

typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;

Поля структуры NOTIFYICONDATA имеют следующий смысл:

cbSize - размер структуры, должен быть sizeof(NOTIFYICONDATA).
hWnd - дескриптор окна, которое будет получать события мыши над иконкой.
uID - уникальный идентификатор иконки. Идентификатор должен быть уникален в пределах окна - обработчика, передаваемого в hWnd.
uFlags - битовое поле, определяющее какое из следующих полей несет действительную информацию. Может быть одним из следующих значений: NIF_ICON, NIF_MESSAGE, NIF_TIP или их OR-комбинацией.
uCallbackMessage - сообщение, передаваемое окну - обработчику при событиях мыши. Желательно получать номер сообщения вызовом RegisterWindowMessage(), но допускаются и значения WM_USER+N, где N > 0.
hIcon - дескриптор иконки, помещаемой на Tray.
szTip - текст для ToolTip'а, если szTip[0] = 0x00, то ToolTip'а не будет.

Таким образом, для добавления иконки на Tray необходимо заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию Shell_NotifyIcon() с параметром NIM_ADD и указателем на заполненный экземпляр структуры.
При добавлении иконки необходимо заполнить поля cbSize, hWnd, uID, uFlags, uCallbackMessage, hIcon. Поле szTip можно оставить пустым, если вам не нужен ToolTip. Поле uFlags должно содержать как минимум NIF_MESSAGE | NIF_ICON.
После добавления иконки на Tray можно менять саму иконку, ToolTip и сообщение, посылаемое окну. Для этого необходимо заполнить экземпляр структуры NOTIFYICONDATA и вызвать функцию Shell_NotifyIcon() с параметром NIM_MODIFY и указателем на заполненный экземпляр структуры.
При изменении иконки необходимо заполнить поля cbSize, hWnd, uID, uFlags и поля, отвечающие за параметры иконки, которые вы хотите менять. При этом uFlags должен содержать комбинацию флагов, описывающую поля, которые необходимо менять.

Для удаления иконки вы должны знать ее ID и дескриптор окна-обработчика сообщений.
Для удаления иконки с Tray надо вызвать функцию Shell_NotifyIcon() с параметром NIM_DELETE и указателем на экземпляр структуры NOTIFYICONDATA, у которого должны быть заполнены следующие поля: cbSize, hWnd, uID.
При добавлении иконки на Tray вы указывали окно - обработчик сообщения и сообщение (CallbackMessage). Теперь окно, указанное вами будет при любых событиях мыши, происходящих над иконкой получать сообщение, указанное при добавлении иконки. При этом параметры lParam и wParam будут задействованы следующим образом:
(UINT)wParam - содержит ID иконки, над которой произошло событие
(UINT)lParam - содержит стандартное событие мыши, такое как WM_MOUSEMOVE или WM_LBUTTONDOWN.
При этом, информация о клавишах смены регистра, так же как и местоположения события, передаваемые при стандартных "настоящих" сообщениях мыши, теряются. Hо положение курсора можно узнать функцией GetCursorPos(), а состояние клавиш смены регистра - функцией GetKeyState()

Многие программы показывают Pop-Up меню при щелчке на их иконке, помещенной на Tray, как этого добиться? Вы должны обрабатывать сообщение, указанное вами при добавлении иконки на Tray. При значении (UINT)lParam, равном WM_RBUTTONDOWN (это обычно дял Pop-Up меню по правой кнопке), или любому другому необходимому вам, вы должны вызовом функции GetCursorPos() получить позицию курсора в момент события (вряд ли пользователь успеет убрать мышь за время обработки сообщения, особенно если он ожидает меню), получить вескриптор Pop-Up меню одним из многих способов (LoadMenu(), GetSubMenu(), CreateMenu(), и т.д.) и выполнить следующий код:

SetForegroundWindow(hWnd);
TrackPopupMenuEx(hMenu, TPM_HORIZONTAL|TPM_LEFTALIGN, x, y, hWnd, NULL);
DestroyMenu(hMenu);
PostMessage(hWnd,WM_USER,0,0);

где hWnd - дескриптор окна, которое будет обрабатывать команду меню, hMenu - дескриптор меню, x и y - позиция курсора. Для подробностей смотрите Win32 SDK Help по функции TrackPopupMenuEx

Edward.

Отвечает Vorobjov Ivan

Самый простой способ: на панели Samples есть элемент TrayIcon.
Через ImageList задаёшь список картинок для трея.
Для скрытия выполняешь команду:
TrayIcon.Minimize;
Для востановления:
TrayIcon.Restore;
--
Бороться и искать, найти и перепрятать

Отвечает SeLarin

Про упрятывание значка в tray: используется функция ShellNotifyTrayIcon (описана в модуле ShellAPI), а затем в
программе отлавливается событие, которое назначается этому значку (оно пользовательское, т.е. WM_USER+XXX). За
подробностями обращаться к справке по Win32 API.

Отвечает Alexandr Karasev aka DemS@R

Form.Visible := False; - Скрывает форму.

Shell_NotifyIcon - функция позволяющая поместить иконку в трей.


Вопрос # 23 от Сергей.@rambler.ru

Подскажите чайнику как можно написать маденький сканер для сети.
НО желательно чтобы он мало весил и ел мало памяти.
За ранее блогодарен.
Ответ прошу прислать на Email: Whitespider@rambler.ru

Отвечает p_kolya

Привет!
Как понял нужен сканер портов?
Лучше использовать WinSock2!
Так вот, ты можешь скачать его(сканер в смысле) на http://therealmaster.narod.ru в
разделе программы, а исходники могу выслать я.


НОВЫЕ ВОПРОСЫ

4

Вопрос #10 от Delivery
Привет Пеопл!!! Хочу сказать что в Делфи 7 Компоненты Fastnet нету, это компонента из прошлых версий Делфи. В Делфи 7 Появились новые компоненты для работы с сетевыми протоколами и интернет: "Indy Clients, Indy Mics, Indy Server,...." и всё остальное связанное с Indy. Кстати а у меня встречный вопрос:"Как Отображать те компоненты которые в данных компонентах они есть а на вкладке их нету. К примеру TIdFTPListItems TFileListView(Если залезть в Component->Configure palette...->Далее выбрать вкладку System то TFileListView есть а на вкладке его нету и поэтому у меня не получаеться использовать их???). А как использовать TIdFTPListItems и где он находиться я не имею представления да и хелп Хромает???" Моё Мыло: Mikle_kpi@ukr.net Моя Аська: 158888038
ОТВЕТИТЬ


Вопрос #24 от Мельникова Алёна

Всем привет!

У меня такой вопрос: как сделать в Delphi, чтобы работал мышинный скроллинг? Т.е. у меня длинный-длинный СкроллБох, но мышинный скроллинг не прокручивается и приходится мышкой тащить по старинке скроллбар, что очень неудобно :(
Помогите, пожалуйста!

С уважением, ко всем профи Аленка :)

ОТВЕТИТЬ


Вопрос #25 от wpost

Hi. Возможно ли в Delphi динамическое описание типа? Например:
Есть программа, которая вызывает процедуру file(name,size) Где name -
имя файла, а Size - размер в байтах.

Procedure file(var name:String,size:longint);
Type fill = array[1..Size] of byte;
^^^^^^^^^^
Var f: file of fill;
N: Fill;
begin
Assignfile(f,name); Reset(F); Read(f,N); CloseFile(F);

....
end;

Как это можно сделать? Если можно. Идея заключена в том, что любой
заранее неизвестный файл надо прочитать в память в виде массива за
ОДИН проход. Т.е. Разом весь, а не по байтам.
Заранее благодарен.
Aleksey.

ОТВЕТИТЬ


Ведущий рассылки Angel     Дизайн "LikSoftGroup - Design"  8-ой выпуск

/FONT>esign"  8-ой выпуск



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное