Delphi 3.Библиотека программиста

медсправка на госслужбу

Delphi 3 Библиотека программиста


От редактора перевода
Книга, которую вы держите в руках, во многом необычна и отличается от других изданий, посвященных Delphi. Прежде всего, она предназначена не для начинающих. Чтобы по достоинству оценить изящество...
Предисловие
Программисты (особенно начинающие) любят задавать вопросы типа: «Скажи, на чем ты пишешь?..» Когда-то этот вопрос выглядел вполне логично. Компиляторы, отладчики, серверы, системы управления базам...
Благодарности
Благодарю Мардж Макрей (Marge McRae), друга и отличного соседа, за первое чтение рукописи и за предложенную идею с персонажем Мардж Рейнольдс (которая, кстати, не имеет ни малейшего отношения к на...
Введение
Давным-давно, во второй половине 80-х, язык программирования Паскаль стал мишенью для постоянных нападок со стороны адептов C и (позднее) C++. Они так часто твердили: «Паскаль - игрушечный язык»,...
Глава 1 32разрядные консольные приложения
Джим МишельВысушенное чучело DOS красуется ныне на стенке Win32 в качестве второстепенного API. Как же теперь бедному хакеру создать текстовый фильтр, запускаемый из командной строки? Добрая фея P...
Консольные приложения
В Windows 95 и Windows NT существуют консольные приложения - программы, которые не пользуются услугами GUI, а работают в окне так называемого «сеанса DOS». Хотя эти приложения не обладают собствен...
Фильтры
Вероятно, из всех средств командной строки на персональных компьютерах чаще всего встречаются программы, принадлежащие к широкой категории «фильтров». Фильтром может быть все, что угодно, - от про...
Консольные приложения на Delphi
Хотя Delphi позволяет создавать консольные приложения, документация хранит подозрительное молчание по поводу того, как именно это делается. Как ни удивительно, среди превосходных примеров, поясняю...
Hello Delphi
Прежде всего создайте новое приложение (File <>New Application). Для начала нужно изменить некоторые параметры проекта и сообщить Delphi о том, что мы создаем именно консольное приложение. В...
Листинг 1 1 Программа Hello Delphi
{ HELLO.DPR - Простейшее консольное приложение Delphi Автор: Джим Мишель Дата последней редакции: 04/05/97 } {$APPTYPE CONSOLE} program Hello; uses Windows; begin WriteLn ("Hello, Delphi&quo...
Сохранение шаблона программы
Создать консольное приложение не так уж сложно, но при этом все же приходится помнить о некоторых нюансах. Поэтому, вместо того чтобы каждый раз строить приложение на пустом месте (и благополучно...
Шаблон консольного приложения добавляется в хранилище
После того как проект будет добавлен в хранилище, попробуйте выполнить команду File <> New в меню Delphi, перейдите на вкладку Projects в диалоговом окне New Items и дважды щелкните на значк...
Консольный ввод/вывод
При запуске консольного приложения с окном консоли автоматически связываются стандартные текстовые файлы Input и Output. В результате процедуры ReadLn и WriteLn работают именно так, как вы ожидает...
Программафильтр на Delphi
Мы научились создавать консольные приложения, теперь пора воспользовать ся полученными знаниями на практике. Оставшаяся часть этой главы посвящена написанию фильтров как разновидности консольных п...
Базовая программафильтр
Как я упоминал в начале этой главы, программы-фильтры обычно получают командную строку с параметрами и именами входных/выходных файлов, обрабатывают входную информацию в соответствии с полученными...
Обработка командной строки
На первый взгляд в обработке командной строки нет ничего сложного. У вас имеется текстовая строка, из нее нужно выделить имена файлов и параметры, после чего соответствующим образом настроить пере...
Листинг 1 2 Программа Params
{ PARAMS.PAS - пример использования функций ParamCount и ParamStr. Автор: Джим Мишель Дата последней редакции: 04/05/97 } {$APPTYPE CONSOLE} program Params; uses Windows; Var i : Integer; begin Wr...
Параметры командной строки
Большинству программ командной строки параметры передаются прямо в строке. Иногда встречаются программы, получающие параметры из переменных окружения или конфигурационных файлов, а также гибриды,...
Универсальный анализатор командных строк
Если меня что и раздражает в программировании, так это необходимость в десятый (или сотый) раз писать код для выполнения одной и той же задачи. С анализом командных строк дело обстоит именно так -...
Листинг 1 3 Модуль CmdLine
{ CMDLINE.PAS - Анализатор командной строки Автор: Джим Мишель Дата последней редакции: 04/05/97 } unit cmdline; interface type OptionType = (otBool, otInt, otString, otFilename); pOptionRec = ^O...
Тестирование модуля CmdLine
Теперь мы проверим, как работают функции анализа командной строки, с помощью тестовой программы. Создайте новое приложение на основе шаблона Console Application. Сохраните новый проект под именем...
Листинг 1 4 Программа FILTER DPR
{ FILTER.DPR — основная программа фильтра Автор: Джим Мишель Дата последней редакции: 04/05/97 } {$APPTYPE CONSOLE} program filter; uses Windows, CmdLine; const nOptions = 4; Options : Array [1.....
Несколько слов о структуре программы
Перед тем как заняться более сложной программой, давайте перенесем рабочий код из файла проекта (DPR) в отдельный модуль. Как показывает опыт, смысловой код желательно убрать из файла проекта и хр...
Листинг 1 5 Новый файл проекта Filter
{$APPTYPE CONSOLE} program filter; uses cmdline in "cmdline.pas", filtmain in "filtmain.pas", fileio in "fileio.pas"; begin DoFilter; end....
Листинг 1 6 FILTMAIN основной
{ FILTMAIN.PAS - основной рабочий модуль программы Filter. Автор: Джим Мишель Дата последней редакции: 04/05/97 } unit filtmain; interface { DoFilter выполняет всю работу } procedure DoFilter; im...
Файловые операции чтения/записи
Разобравшись с анализом командных строк, мы приступаем к следующей крупной подзадаче - файловому вводу/выводу. Разумеется, при простейших посимвольных (или построчных) преобразованиях текстовых фа...
Листинг 1 7 Перевод символов в верхний регистр
procedure DoFilter; const nOptions = 2; Options : Array [1..nOptions] of OptionRec = ( (OptionChar : "i"; Option : otFilename; Filename : ""), (OptionChar : "o"; Opt...
Листинг 1 8 Реализация класса
{ FILEIO.PAS - Файловый ввод/вывод для программ-фильтров Автор: Джим Мишель Дата последней редакции: 04/05/97 } {$I+} { Использовать исключения для обработки ошибок } unit fileio; interface type...
Листинг 1 9 Использование класса
{ FILTMAIN.PAS - основной рабочий модуль программы Filter. Автор: Джим Мишель Дата последней редакции: 04/05/97 } unit filtmain; interface { DoFilter выполняет всю работу } procedure DoFilter; im...
Использование шаблона Filter
Если вам захочется поместить фильтр в хранилище, создайте новый подкаталог в каталоге ObjRepos и сохраните в нем файлы FILTER.DPR, FILTMAIN.PAS, CMDLINE.PAS и FILEIO.PAS. Затем выполните команду P...
Критика
Вам никогда не хотелось вернуться к уже законченному проекту и переделать его заново? Нет, дело даже не в том, что наш шаблон фильтра чем-то плох. Просто сейчас я оглядываюсь назад и думаю о том,...
Глава 2 32разрядные DLL в Delphi — когда зачем и как
Джим МишельVCL-компоненты открывают новые возможности для многократного использования кода, но даже древние механизмы — такие как Windows DLL — при разумном применении способны творить чудеса.Весн...
Что такое DLL и зачем они нужны?
DLL (Dynamic Link Library, библиотека динамической компоновки) — разновидность выполняемых файлов Windows, в которых содержится код или данные, используемые другими программами. По своей концепции...
Как это сделать?
Тема DLL включает в себя два вопроса: создание и использование. Вы ежедневно используете DLL при работе под Windows, возможно, даже не подозревая об этом. Почти вся система Windows реализована в в...
Создание DLL
По своей концепции DLL больше похожи на модули, но их код скорее напоминает программы. В этом нет ничего удивительного, ведь DLL — всего лишь особая разновидность программ, предоставляющих код или...
Листинг 2 1 Простейшая DLL
{ BEEPER.DPR — пример простейшей DLL Автор: Джим Мишель Дата последней редакции: 12/05/97 } library beeper; uses Windows; procedure BeepMe; stdcall; begin MessageBeep (0); end; Exports BeepMe ind...
Вызов функций DLL
После завершения компиляции сохраните проект и выполните команду File д New Application. Сейчас мы напишем простейшую тестовую программу для вызова DLL.Поместите кнопку форму и создайте...
Листинг 2 2 Интерфейсный модуль для BEEPER DLL
{ BEEPDLL.PAS — интерфейсный модуль для BEEPER.DLL } unit BeepDLL; interface procedure BeepMe; external "beeper.dll"; procedure BeepMeTwo; external "beeper.dll" name "Bee...
Присоединение DLL на стадии выполнения
Иногда программа может прекрасно работать без некоторых DLL. Вспомним пример с DLL для преобразования файлов в текстовом редакторе. Пользователи не так уж часто занимаются преобразованием файлов....
Листинг 2 3 Динамический импорт DLL на стадии выполнения
{ BEEPDLL.PAS — интерфейсный модуль для BEEPER.DLL Автор: Джим Мишель Дата последней редакции: 12/05/97 } unit BeepDLL; {$DEFINE DYNAMIC} { закомментируйте эту строку, чтобы реализовать статическ...
Где Windows ищет DLL
Если в вашем приложении используется DLL, установочная программа обычно помещает ее в один каталог с исполняемым файлом программы. В этом случае у Windows не возникнет никаких проблем с поиском DL...
DLL недостатки и предостережения
Большинство программистов после знакомства с новой концепцией начинают вести себя, как маньяк с новой бензопилой — им не терпится опробовать новинку в деле. Порой они проявляют чудеса извращенной...
Создание форм в DLL
Наверное, DLL в программировании на Delphi чаще всего применяются для хранения общих форм. Если вы пишете целый программный комплекс, вероятно, многие формы будут использоваться сразу в нескольких...
Листинг 2 4 Файл PICKCLR DPR
{ PICKCLR.DPR — DLL с формой для выбора цвета Автор: Джим Мишель Дата последней редакции: 12/05/97 } library pickclr; uses SysUtils, Classes, ColorFrm in "colorfrm.pas" {ColorSelectionF...
Листинг 2 5 Модуль COLORFRM PAS
{ COLORFRM.PAS — Выбор цвета с помощью формы, хранящейся в DLL Автор: Джим Мишель Дата последней редакции: 12/05/97 } unit colorfrm; interface uses Windows, Messages, SysUtils, Classes, Graphics,...
Гибкое кодирование
Многие продукты содержат специальные «точки входа» (hooks), через которые к ним можно подключить дополнительные модули, выпущенные независимыми фирмами. Например, в Windows Help определен интерфей...
Создание текстового редактора
Все мы программисты, поэтому я на полном ходу промчусь через процесс создания текстового редактора и сбавлю темп лишь тогда, когда мы подойдем к интерфейсу расширения.Создайте новый проект, помест...
Листинг 2 6 Форма текстового редактора EDITFORM PAS
{ EDITFORM.PAS — Простейший текстовый редактор, демонстрирующий использование DLL Автор: Джим Мишель Дата последней редакции: 12/05/97 } unit editform; interface uses Windows, Messages, SysUtils,...
Листинг 2 7 Файл TEXTEDIT INI
; TEXTEDIT.INI ; Пример интерфейса расширения для файловых преобразований [Text] Extension=.TXT ConvertDLL=textconv.dll [Word for Windows] Extension=.DOC ConvertDLL=wfwconv.dll [WordCruncher] Ext...
Листинг 2 8 Новая функция OpenFile
procedure TForm1.OpenFile (Filename: String); type ConvertFunc = function (Filename: String; Strings: TStrings): boolean; stdcall; var ConvertIni : TIniFile; ConvertList : TStringList; FileExt :...
Листинг 2 9 Файл TEXTCONV DPR
{ TEXTCONV.DPR — DLL текстовых преобразований Автор: Джим Мишель Дата последней редакции: 12/05/97 } library textconv; { Важное замечание об управлении памятью в DLL: модуль ShareMem должен стоят...
Листинг 2 10 Модуль TEXTC PAS
{ TEXTC.PAS — Модуль текстовых преобразований. Загружает текстовые файлы с диска. Автор: Джим Мишель Дата последней редакции: 12/05/97 } unit textc; interface uses Classes; function Convert (File...
Совместное использование памяти вприложениях
К счастью для нас, программистов, Delphi создает DLL, по умолчанию допускающие существование нескольких экземпляров , так что хотя бы одной заботой становится меньше. Тем не менее возможность созд...
Переменная DLLProc
При загрузке DLL прежде всего выполняется код запуска (расположенный между begin и end в конце DLL). Если ваша DLL должна загрузить ресурсы, выделить область памяти или выполнить другие действия в...
Листинг 2 11 Реализация общей памяти в DLL
{ SHAREME.DPR — Пример использования общей памяти для организации межпроцессного взаимодействия Автор: Джим Мишель Дата последней редакции: 12/05/97 } library shareme; uses Windows, SysUtils, Cla...
Продолжаем!
Если тема вас заинтересовала, о DLL можно узнать еще много интересно го. В этой главе я привел достаточно информации, чтобы вы могли заняться самостоятельными исследованиями. Если у вас есть компа...
Глава 3 Перетаскивание как это делается в Windows
Джим МишельС перетаскиванием в Windows дело обстоит сложнее, чем кажется на первый взгляд, — но если бы все было просто, кто стал бы читать книги по программированию?Программы на Delphi поддержива...
Перетаскивание
В системе Windows FMDD реализуется через интерфейс Shell из библиотеки SHELL32.DLL. При этом используются четыре функции API — DragAcceptFiles, DragQueryFile, DragQueryPoint и DragFinish, а также...
Листинг 3 1 Файл DRAG1 DPR
{DRAG1.DPR — Первый эксперимент с перетаскиваниемАвтор: Джим МишельДата последней редакции: 27/04/97} program drag1; uses Forms, dragfrm1 in "dragfrm1.pas" {Form1}; {$R *.RES} begin Appl...
Листинг 3 2 Модуль DRAGFRM1 PAS
{DRAGFRM1.PAS — Первая реализация перетаскиванияАвтор: Джим МишельДата последней редакции: 27/04/97} unit dragfrm1; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,...
Что делать с кодом Windows?
Правильный ответ — инкапсулировать. Именно это делает Delphi, и делает очень успешно. Идея Delphi заключается как раз в том, чтобы оградить вас от мелких неприятных деталей Windows-программировани...
Листинг 3 3 Первая версия модуля
{FMDD1.PAS — Первая версия модуля, инкапсулирующего перетаскиваниефайлов из File ManagerАвтор: Джим МишельДата последней редакции: 27/04/97} unit fmdd1; interface uses Windows, Classes; type TDrag...
Листинг 3 4 Использование нового
procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := AppMessage; FMDD1.AcceptDroppedFiles (Handle); end; procedure TForm1.WMDropFiles (hDrop : THandle; hWindow : HWnd); va...
Обработка сообщений Windows
В большинстве ситуаций возможностей интерфейса Delphi для обработ ки сообщений Windows — обработчика события OnMessage объекта Application — оказывается вполне достаточно. Программы могут определя...
Нестандартные элементы
Если у вас имеется элемент, который должен реагировать на определен ное сообщение, просто напишите нестандартную версию этого элемента. Например, если вам потребуется потомок TForm, обрабатывающий...
Листинг 3 5 Нестандартный компонент TFMDDForm
{FMDDFORM.PAS—форма, обрабатывающая сообщение WM_DROPFILES.Автор: Джим МишельДата последней редакции: 27/04/97} unit fmddform; interface uses Windows, Messages, SysUtils, Classes, Graphics, Contro...
Субклассирование
Проблема нестандартной обработки сообщений Windows не нова — она появилась одновременно с самой системой Windows. Для нее даже придумали специальный термин — субклассирование (subclassing). Строго...
Определение интерфейса
Желательно, чтобы перетаскивание по возможности работало так же, как стандартные события Delphi. Поскольку мы не создаем новый нестандарт ный элемент, нам не удастся определить событие OnFMDD и ор...
Листинг 3 6 Интерфейсная секция нового модуля FMDD
interface uses Windows, Messages, Classes, Controls; type TDragDropInfo = class (TObject) private FNumFiles : UINT; FInClientArea : Boolean; FDropPoint : TPoint; FFileList : TStringList; public co...
Реализация нового интерфейса
Как всегда, самое ужасное спрятано в реализации. За кулисами FMDD происходит немалая работа. Обработка FMDD распадается на три отдельные, но взаимосвязанные подзадачи:Процедура AcceptDropFiles дол...
Снова о субклассировании
Чтобы субклассировать окно, необходимо получить и сохранить указатель на существующую оконную процедуру, а затем занести в структуру данных окна указатель на новую оконную процедуру. Для этого исп...
Листинг 3 7 Новый вариант модуля
{FMDD2.PAS — Полностью инкапсулированный модуль FMDDАвтор: Джим МишельДата последней редакции: 27/04/97} unit fmdd2; interface uses Windows, Messages, Classes, Controls; type TDragDropInfo = class...
Листинг 3 8 Модуль DRAGFRM3 PAS
{DRAGFRM3.PAS — Прием файлов несколькими элементамиАвтор: Джим МишельДата последней редакции: 27/04/97} unit dragfrm3; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Form...
Глава 4 Перетаскивание как это делается в OLE
Джим МишельОказывается, перетаскивание файлов из File Manager — всего лишь частный случай более общего интерфейса перетаскивания OLE. С помощью интерфейса OLE ваше приложение может превратиться в...
Что такое OLE?
Термин OLE — сокращение от «Object Linking and Embedding», то есть «связывание и внедрение объектов». С помощью этой технологии ваши приложения могут обмениваться информацией с другими приложениям...
Наследование OLE и TInterfacedObject
Упомянутые выше интерфейсы, как и все интерфейсы Windows OLE, являются производными от интерфейса IUnknown. Интерфейс IUnknown предоставляет объектам OLE две услуги: подсчет ссылок и идентификацию...
Требования к перетаскиванию OLE
Если ваше приложение действует как приемник (другими словами, оно будет получать информацию от брошенных объектов), вы обязаны реализовать лишь интерфейс IDropTarget. Если ваше приложение является...
Обязанности клиента
Чтобы окно выполняло функции приемника, оно должно:Инициализировать библиотеки OLE вызовом OleInitialize. Создать экземпляр объекта, реализующего интерфейс IDropTarget. Заблокировать созданный экз...
Листинг 4 1 Реализация класса
{FILEDROP.PAS -- реализация простейшего приемника OLE.Автор: Джим МишельДата последней редакции: 28/05/97} unit FileDrop; interface uses Windows, ActiveX, Classes; type { TDragDropInfo слегка изме...
Листинг 4 2 В модуле DRAGFRM1
{DRAGFRM1.PAS -- Прием файлов средствами OLEАвтор: Джим МишельДата последней редакции: 28/05/97} unit dragfrm1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dial...
Как работает программа
В листинге 4.1 реализовано сразу два класса. Первый, TDragDropInfo, наверное, покажется вам знакомым по предыдущей главе. Я немного подправил его, потому что для источника требуются кое-какие допо...
Что дальше?
Итак, я описал еще один способ получения перетаскиваемых файлов. В большинстве случаев он способен полностью заменить код, предложенный в предыдущей главе. Но важнее другое: мы взяли хорошо знаком...
Хочу быть сервером!
С приемником у меня не было особых проблем — стоило понять общую концепцию интерфейса COM, и дальше все прошло относительно безболезнен но. Построение сервера, напротив, сопровождалось сплошными н...
Обязанности сервера
На первый взгляд может показаться, что реализация сервера перетаскивания почти не отличается по сложности от реализации клиентской стороны. Думаю, так и должно быть. К сожалению, разработчики инте...
Требования к интерфейсу IDropSource
Первый из трех интерфейсов, необходимых для работы сервера, — IDrop Source — реализуется проще всего. Реализация IDropSource должна выполнять две задачи:Следить за состоянием клавиатуры или кнопок...
Интерфейс IDataObject хранит данные
Интерфейс IDataObject управляет содержанием перетаскиваемых данных, а также представлением их в формате, понятном для запрашивающего объекта IDropTarget. Он используется при перетаскивании, а такж...
Листинг 4 3 ENUMFMT PAS простейшая
{ENUMFMT.PAS -- реализация интерфейса IEnumFormatEtc.Автор: Джим МишельДата последней редакции: 30/05/97Приведенная реализация IEnumFormatEtc недостаточно надежна.Она предполагает, что список Form...
Реализация сервера
Приемники OLE-перетаскивания, работающие с файлами, рассчитывают получить данные в формате буфера обмена CF_HDROP. Этот формат используется в первом примере этой главы, он же присутствует и в реал...
Листинг 4 4 TDragDropInfo CreateHDrop преобразует информацию
о перетаскиваемых файлахfunction TDragDropInfo.CreateHDrop : HGlobal; var RequiredSize : Integer; i : Integer; hGlobalDropInfo : HGlobal; DropFiles : PDropFiles; c : PChar; begin { Построим структ...
Листинг 4 5 DRAGDROP PAS интерфейсы необходимые
для работы сервера перетаскивания{DRAGDROP.PAS -- реализация OLE-перетаскивания.Автор: Джим МишельДата последней редакции: 30/05/97} unit DragDrop; interface uses Windows, ActiveX, Classes, FileDr...
Листинг 4 6 Начало операции перетаскивания
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var DropSource : TFileDropSource; DropData : THDropDataObject; rslt : HRESULT; dwEffect...
OLE!
Теперь вы в общих чертах знаете о том, как программируется перетаскивание. О различных интерфейсах OLE написаны целые книги, и даже о том же перетаскивании можно еще многое рассказать. Но для боль...
Глава 5 Компонент Winsock в Delphi
Объекты хороши… но компоненты лучше. Чтобы наши программы могли мгновенно обращаться к Internet, мы упакуем весь багаж Winsock в один VCL-компонент.Internet (и распределенные среды вообще) с кажды...
Что такое Winsock?
Winsock — сокращение от «Windows Sockets», это интерфейсная прослойка между Windows-приложением и базовой сетью TCP/IP. Интерфейс сокетов впервые появился в Berkeley Unix как API для работы с сетя...
Изучаем CsSocket
Компонент CsSocket построен на основе невизуального класса TCsSocket, который в свою очередь является потомком TComponent. Невизуальный класс TCsSocket похож на фундамент дома — обычно его никто н...
Листинг 5 1 Определение TCsSocket
(* CsSocket Unit Простейший интерфейсный модуль Winsock Написан для книги High Performance Delphi Programming Джон К.Пенман 1997 *) {$H+} unit CsSocket; interface uses Windows, Messages, SysUtils...
Листинг 5 2 Конструктор TCsSocket Create
constructor TCsSocket.Create(AOwner : TComponent); begin inherited Create(AOwner); FParent := AOwner; FValidSocket := INVALID_SOCKET; FSockType := SockDefault; FAddrType := AddrDefault; FService...
Листинг 5 3 Функция TCsSocket StartUp
function TCsSocket.StartUp : Boolean; var VersionReqd : WordRec; begin with VersionReqD do begin Hi := 1; Lo := 1; end; Result := WSAStartUp(Word(VersionReqD), myWsaData) = 0; if not Result then...
Листинг 5 4 Процедура TCsSocket CleanUp
procedure TCsSocket.CleanUp; begin if FStarted then begin FStarted := False; if WSACleanUp = SOCKET_ERROR then raise ECsSocketError.create('Cannot close Winsock!'); end; end;Наконец, обращение к...
Приложение RESOLVER32
Программа RESOLVER32 использует ряд интересных методов и свойств объекта TCsSocket. RESOLVER32 может преобразовывать символьное имя хоста в его IP-адрес (то есть адрес в Internet), и наоборот. Кро...
События CsSocket
При запуске приложения RESOLVER32 процедура Application.CreateForm из файла RESOLVER32.DPR вызывает конструктор TCsSocket.Create, чтобы задать свойствам CsSocket значения по умолчанию. После того...
Листинг 5 5 Процедура FormCreate главной формы
procedure TfrmMain.FormCreate(Sender: TObject); begin tag := 1; memErrorLog.Clear; memErrorLog.Visible := FALSE; if CsSocket1.Status = Failure then begin pnStatus.Color := clRed; pnStatus.Caption...
Как меня зовут?
Программа RESOLVER32 отображает имя, под которым ваш компьютер числится в сети. Это достигается путем присваивания тексту в поле ввода edMachineName значения свойства CsSocket1.LocalName. Метод TC...
Листинг 5 6 Функция GetLocalName
function TCsSocket.GetLocalName : String; var LocalName : array[0..MaxBufferSize] of Char; begin if gethostname(LocalName, SizeOf(LocalName)) = 0 then Result := StrPas(LocalName) else Result := '...
Какой у тебя адрес?
Преобразование имени хоста является самой распространенной операцией, выполняемой Winsock-приложениями в режиме блокировки. В данном случае «режим блокировки» означает, что приложение ожидает отве...
Листинг 5 7 Метод TCsSocket SetRemoteHostName
procedure TCsSocket.SetRemoteHostName(NameReqd : String); var P : Pointer; IPAddress : LongInt; begin FRemoteName := NameReqd; if Length(NameReqd) = 0 then begin FStatus := Failure; ErrorEvent(FS...
Листинг 5 8 Метод TfrmMain CsSocket1Lookup
procedure TfrmMain.CsSocket1Lookup (Sender: TObject; LookUpOp: TLookUpOp; Value: String; Result : Boolean); begin btnResolve.Enabled := TRUE; btnAbortRes.Enabled := FALSE; Screen.Cursor := crDefa...
Как тебя зовут?
RESOLVER32 также умеет определять имя хоста по его числовому IP-адресу. Для этого следует ввести адрес в текстовом поле edIPName (см. Рисунок 5.5). При нажатии кнопки Resolve программа передает ад...
IPадрес готов к преобразованию
Если inet_addr возвращает результат, отличный от INADDR_NONE (то есть строка представляет собой корректный числовой IP-адрес), SetRemoteHostName вызывает gethostbyaddr. Данный вызов, как и обращен...
Асинхронное получение адреса
Блокирующие функции gethostbyname и gethostbyaddr используются достаточно просто. С асинхронными версиями этих функций, WSAAsyncGetHostByName и WSA AsyncGetHostByAddr, дело обстоит несколько сложн...
Переход от блокирующих функций к псевдоблокирующим
Поскольку FAsync имеет значение NonBlocking, SetRemoteHostName передает его процедуре SetAsyncHostName (см. листинг 5.9)....
Листинг 5 9 Метод TCsSocket SetAsyncHostName
procedure TCsSocket.SetAsyncHostName (ReqdHostName : String); var IPAddress : TInaddr; SAddress: array[0..31] of char; begin FillChar(FAsyncBuff, SizeOf(FAsyncBuff), #0); FAsyncRemoteName := Reqd...
Листинг 5 10 Процедура AsyncOperation
procedure TCsSocket.AsyncOperation(var Mess : TMessage); var MsgErr : Word; begin if Mess.Msg = ASYNC_EVENT then begin MsgErr := WSAGetAsyncError(Mess.lparam); if MsgErr <> 0 then begin FSt...
Кто находится по этому адресу?
Мы поближе познакомимся с асинхронным режимом на примере определения имени хоста по Internet-адресу функцией WSAAsyncGetHostByAddr. Чтобы воспользоваться функцией в приложении RESOLVER32, установи...
Отмена операции WSAAsync
Поскольку асинхронные операции нарушают нормальную логику работы приложения, отменить их оказывается не так просто. Для прерывания асинхронных операций в Winsock API предусмотрена специальная функ...
Листинг 5 11 Метод TCsSocket CancelAsyncOperation
procedure TCsSocket.CancelAsyncOperation (CancelOP : Boolean); begin if WSACancelAsyncRequest(THandle(FTaskHandle)) = SOCKET_ERROR then begin FStatus := Failure; ErrorEvent(FStatus,WSAErrorMsg);...
Листинг 5 12 Метод TFrmMain AbortAsyncHostBtnClick
procedure TfrmMain.btnAbortResClick(Sender : TObject); begin CsSocket1.CancelAsyncOp := TRUE; pnStatus.Color := clYellow; pnStatus.Caption := 'Operation aborted'; btnAbortRes.Enabled := FALSE; bt...
Преобразование портов и сервисов
Преобразование имен сервисов и портов, как и символьных имен с IP-адресами, может выполняться в блокирующем или псевдоблокирующем (асинхронном) режиме. В блокирующем режиме для этого используются...
Поиск сервиса
Процесс преобразования номера порта в соответствующий ему тип сервиса почти не отличается от только что описанного, за исключением того, что на этот раз используется блокирующая функция Winsock ge...
Результат преобразования имени сервиса
Когда мы присваиваем номер порта, хранящийся в edPortName.Text, свойству WSPort, он передается методу TCsSocket.SetPortName в качестве параметра ReqdPortName. Убедившись в том, что строка номера п...
Преобразование протоколов
Получение имени и номера протокола требуется несколько реже других функций преобразования, но для полноты картины CsSocket поддерживает и их. Эти преобразования выполняются функциями API getprotob...
Использование свойства Tag
Наверное, вас давно интересует вопрос — как RESOLVER32 определяет, какое из введенных значений необходимо обработать? Все очень просто: у каждого элемента есть свойство Tag, по нему можно выделить...
Листинг 5 13 Использование свойства
procedure TfrmMain.btnResolveClick(Sender: TObject); begin btnResolve.Enabled := FALSE; Screen.Cursor := crHourGlass; if CsSocket1.Access = NonBlocking then btnAbortRes.Enabled := TRUE; pnStatus....
Стоит ли блокировать?
Если ваше приложение использует локальную систему DNS и целевой хост находится в локальной сети, использование блокирующих функций существенно уменьшает объем накладных расходов. Тем не менее, есл...
Глава 6 CsShopper FTPклиент
Джон ПенманОтправляйтесь в Internet за бесплатным барахлом! В этом вам поможет компонент, выполняющий функции FTP-клиента, и полноцен ное приложение для пересылки файлов, построенное на его основе...
Вас обслуживают?
По умолчанию FTP-сервер всегда ожидает, что клиент инициирует соедине ние через TCP-порт с номером 21. Это соединение (оно называется управляющим соединением, control connection) остается открытым...
Регистрация FTPклиента на FTPсервере
После того как соединение будет успешно установлено, клиент может продолжить посылку команд. Однако при возникновении проблемы (например, посылке команды с неверным синтаксисом) или слишком большо...
Компонент CsShopper
CsShopper происходит от VCL-компонента CsSocket из главы 5. В нем класс TCsSocket используется для выполнения повседневных задач — загрузки Winsock DLL, заполнения структур данных для установки со...
Свойства CsShopper в инспектореобъектов Delphi 3
Свойство Asynchronous определяет режим работы CsShopper — блокирующий или асинхронный . Хотя данное свойство не относится к протоколу FTP, выбор режима может повлиять на скорость пересылки данных,...
Организация вывода
Хотя CsShopper и относится к невизуальным компонентам, время от времени ему приходится взаимодействовать с приложением пользователя и отображать сообщения, которыми сервер обменивается с клиентом....
SHOPPER32 за работой
SHOPPER32 — базовое FTP-приложение, созданное с помощью компонента CsShopper, оно изображено на Рисунок 6.3. Создайте новый проект с именем SHOPPER32, вызовите главную форму frmMain и сохраните в...
Листинг 6 1 Модуль MAIN PAS (*
unit main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, FileCtrl, ComCtrls, CsSocket, CsShopper, MkDirFrm, CsFtpMsg, ToolWin, Regist...
Приложение SHOPPER32
type TfrmMain = class(TForm) CsShopper1: TCsShopper; pcShopper: TPageControl; tsConnect: TTabSheet; tsOptions: TTabSheet; tsAbout: TTabSheet; gbLocal: TGroupBox; gbRemote: TGroupBox; gbActions: T...
Типичный вид профиля на вкладке Profiles
Нажмите кнопку Add, чтобы внести профиль в список, и затем сохраните новые данные в реестре кнопкой Save. Если потребуется удалить профиль из реестра, выделите его имя в списке Profiles и нажмите...
Подключение
Пользуясь введенной информацией, метод CsShopper.Start вызывает GetHost, чтобы открыть соединение с удаленным хостом. Если вызов функции завершится неудачно, WSAErrorMsg отображает возможную причи...
Отображение файлов и каталогов в SHOPPER32
Обработчик события OnList в программе SHOPPER32 обновляет содержимое списка lbRemoteFiles:procedure TfrmMain.CsShopper1List(Sender: TObject; List:TStringList);beginlbRemoteFiles.Items := List;lbRe...
Закрываем соединение
Для завершения работы с FTP-сервером необходимо лишь разорвать соединение командой QUIT. Нажатие кнопки Quit приводит к вызову CsShopper1.Finish и завершению сеанса: procedure TfrmMain.bbtnQuitCli...
Прием и передача файлов
Прием и передача могут осуществляться как по отдельности, так и пакетами, состоящими из нескольких файлов, Сначала мы рассмотрим пересылку отдельных файлов. Она начинается двойным щелчком на имени...
Изменение каталогов для пересылки файлов
Если двойной щелчок был сделан на имени каталога (например, \DELPHI), то вместо пересылки SetUpFileTransfer вызывает ChangeDir, чтобы обработать переход к другому каталогу. ChangeDir в свою очеред...
Передача файлов
С точки зрения внутренней логики процесс передачи файлов похож на их прием. Свойство CsShopper.Put выполняет передачу с помощью метода PutFile. Чтобы упростить передачу файла от клиента к серверу,...
Пересылка нескольких файлов
Второй способ позволяет переслать сразу несколько файлов (пакет). Перед тем как начинать прием, мы выделяем файлы в списке lbRemoteFiles, щелкая на их именах. При этом в обработчике TfrmMain.lbRem...
Выделенные файлы готовы к пакетному приему
Однако для того, чтобы описанная схема работала, нам придется изменить два свойства списка lbRemoteFiles в инспекторе объектов: во-первых, измените значение ExtendedSelect с FALSE на TRUE, а во-вт...
Асинхронная пересылка файлов
Познакомившись с протоколом FTP в блокирующем (синхронном) режиме, кратко рассмотрим работу CsShopper в асинхронном режиме. Поскольку процесс регистрации на FTP-сервере подробно описан выше, наше...
Положи на место!
В асинхронном режиме в отличие от блокирующего можно легко прервать затянувшуюся пересылку файла — достаточно нажать кнопку Abort на вкладке Connect (обратите внимание на то, что в блокирующем реж...
Заключение
FTP-клиент CsShopper — невизуальный компонент. Он не умеет сохранять и загружать имена хостов, имена пользователей, пароли и сведения о ресурсах. Все это остается на совести программистов, которые...
Глава 7 FTPсервер
Джон ПенманКак известно, в FTP участвуют две стороны. Создание нестандартного компонента, выполняющего функции FTP-сервера, позволит вам полностью контролировать операции пересылки файлов между In...
CsKeeper за работой
Приложение KEEPER32 (находится на CD-ROM в каталоге этой главы) показывает, как компонент CsKeeper используется в приложении. Форма приложения содержит три элемента-вкладки (TabSheet). Вся основна...
KEEPER32 в режиме конструирования
Но перед тем, как запускать приложение KEEPER32, необходимо выполнить некоторые подготовительные действия. Конечно, можно определить поведение компонента CsKeeper1, изменяя значения его свойств в...
Конфигурирование KEEPER32 на вкладке Options
На этой вкладке сосредоточено множество полезных функций. Прежде всегос ее помощью можно предотвратить «блуждание» клиентов по файловой системе сервера. Мы можем ограничить доступ FTP-клиентов опр...
Листинг 7 1 Процедура SavePropSettings
var Reg : TRegistry; begin Reg := TRegistry.Create; try Reg.OpenKey(FtpServerKey,TRUE); Reg.WriteString('DRootDisk',dcbRootDisk.Drive); finally Reg.CloseKey; end; try Reg.OpenKey(FtpServerKey,TRU...


Начало