» » » А. Григорьев - О чём не пишут в книгах по Delphi


Авторские права

А. Григорьев - О чём не пишут в книгах по Delphi

Здесь можно купить и скачать "А. Григорьев - О чём не пишут в книгах по Delphi" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство БХВ-Петербург, год 2008. Так же Вы можете читать ознакомительный отрывок из книги на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
А. Григорьев - О чём не пишут в книгах по Delphi
Рейтинг:
Название:
О чём не пишут в книгах по Delphi
Издательство:
неизвестно
Год:
2008
ISBN:
978-5-9775-019003
Вы автор?
Книга распространяется на условиях партнёрской программы.
Все авторские права соблюдены. Напишите нам, если Вы не согласны.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "О чём не пишут в книгах по Delphi"

Описание и краткое содержание "О чём не пишут в книгах по Delphi" читать бесплатно онлайн.



Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.

Для программистов






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

Что касается самих результатов, то они, конечно, сильно зависят от конфигурации компьютера. По первым двум тестам время выполнения для DDB-растра может быть как в два-три раза меньше, чем для DIB, так и несколько превышать его. В третьем тесте DIB-растр, разумеется, существенно опережает по скорости DDB, хотя отношение и здесь зависит от компьютера. Также наблюдается некоторая зависимость от версии Delphi, под которой откомпилирован проект. Например, первый тест и для DIB, и для DDB выполняется несколько быстрее под Delphi 2007, чем под Delphi 5, а вот третий тест под Delphi 2007 выполняется несколько медленнее.

1.3. Обобщающие примеры

Рассмотрев основы работы с функциями API. мы переходим к обобщающим примерам — программам, использующим разные средства API для создания простого законченного примера.

1.3.1. Обобщающий пример 1 — Информация о процессах

Первым обобщающим примером станет программа для получения информации о процессах системы и об окнах, которые они открывают. На компакт-диске, прилагаемом к книге, эта программа называется ProcInfo. Окно программы ProcInfo показано на рис 1.13.

Рис. 1.13. Окно программы ProcInfo

1.3.1.1. Получение списка процессов

Исторически сложилось так, что существует два способа получить список процессов: с помощью функций Tool Help и посредством функций PSAPI. Эти две группы функций использовались в разных линиях Windows: функции Tool Help появились в Windows 95, функции PSAPI — в Windows NT 4. Windows 2000 XP также поддерживают функции Tool Help, в то время как Windows 98/ME не поддерживают PSAPI. Поэтому мы выберем функции Tool Help, что даст нашему примеру возможность работать во всех версиях Windows, кроме NT 4 (впрочем, в Windows 95 пример тоже не будет работать, но по другой причине: из-за функций GetWindowInfo и RealGetWindowClass, отсутствующих в этой версии). Функции Tool Help объявлены в модуле TlHelp32. 

Для получения списка процессов необходимо сделать "снимок" состояния системы с помощью функции CreateToolhelp32Snapshot. Эта функция создает специальный объект, который может хранить информацию о процессах, модулях, нитях и кучах, созданных в системе. Этот объект называется снимком потому, что информация, хранящаяся в нем, актуальна на момент вызова функции CreateToolhelp32Snapshot; дальнейшие изменения списка процессов, модулей и т.п. не приводят к изменению снимка. Доступ к снимку, как и к большинству объектов системы, осуществляется через его дескриптор. В данном случае функция CreateToolhelp32Snapshot вызывается с параметром TH32CS_SNAPPROCESS для получения списка процессов.

Навигация по списку процессов, сохраненных в снимке, осуществляется с помощью функций Process32First и Process32Next. Они позволяют получить ряд параметров процесса, главный среди которых — идентификатор процесса (Process Identifier, PID). Это уникальный идентификатор процесса, с помощью которого можно отличать один процесс от другого. 

Примечание

Не следует путать идентификатор процесса и дескриптор объекта процесса, который используется, например, в функции SetPriorityClass. Объект процесса — это специальный объект, связанный с процессом, но не тождественный ему. В частности, объект процесса может продолжать существовать уже после того, как сам процесс завершит работу (это позволяет, например, корректно синхронизироваться с уже завершенным процессом при помощи функции WaitForSingleObject). Через объект процесса можно управлять многими свойствами процесса. Поучить дескриптор объекта процесса по идентификатору процесса можно с помощью функции OpenProcess.

Код для получения списка процессов показан в листинге 1.42.

Листинг 1.42. Получение списка процессов с помощью Tool Help

procedure TProcessesInfoForm.FillProcessList;

var

 SnapProc: THandle;

 ProcEntry: TProcessEntry32;

 Item: TListItem;

begin

 ClearAll;

 // Создаем снимок, в котором сохраняем все процессы, а

 // затем в цикле получаем информацию о каждом из этих

 // процессов, перенося ее в ListProcesses

 SnapProc := CreateToolhelp32Snapshot(TH32CS_SNAPROCESSES, 0);

 if SnapProc <> INVALID_HANDLE_VALUE then

 try

  ProcEntry.dwSize := SizeOf(TProcessEntry32);

  if Process32First(SnapProc, ProcEntry) then repeat

   Item := ListProcesses.Items.Add;

   Item.Caption := ProcEntry.szExeFile;

   Item.SubItems.Add(IntToStr(ProcEntry.tb32ProcessID);

   Item.SubItems.Add(IntToStr(ProcEntry.th32ParentProcessID));

   Item.SubItems.Add(IntToStr(ProcEntry.cntThreads));

   // Сохраняем PID в поле Data соответствующего

   // элемента списка. Вообще, поле Data имеет тип

   // Pointer, а PID - это целое число, но т.к. оба этих

   // типа 32-битные, их можно приводить друг к другу

   Item.Data := Pointer(ProcEntry.th32ProcessID);

  until not Process32Next(SnapProc, ProcEntry);

 finally

  CloseHandle(SnapProc);

 end

 else

 begin

  ListProcesses.Visible := False;

  LabelProcessError.Caption :=

   'Невозможно получить список процессов:'#13#10'Ошибка №' +

   IntToStr(GetLastError);

 end;

end;

Для получения списка модулей данного процесса также используется снимок. Функция CreateToolhelp32Snapshot вызывается с параметром TH32CS_SNAPMODULE, в качестве второго параметра ей передается PID процесса, модули которого требуется получить. Навигация по снимку модулей осуществляется с помощью функций Module32First и Module32Next. В остальном код получения списка модулей совпадает с кодом, приведенным в листинге 1.42.

1.3.1.2. Получение списка и свойств окон

Список окон, созданных процессом, формируется с помощью функции EnumWindows, которая позволяет получить список всех окон верхнего уровня (т.е. расположенных непосредственно на рабочем столе). Для каждого из этих окон с помощью функции GetWindowThreadProcessID определяется идентификатор процесса. Окна, не принадлежащие выбранному процессу, отсеиваются.

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

Листинг 1.43. Получение всех окон, относящихся к данному процессу

function EnumWindowsProc(Wnd: HWnd; ParentNode: TTreeNode): BOOL; stdcall;

var

 Text: string, TextLen: Integer;

 ClassName: array [0..ClassNameLen - 1] of Char;

 Node: TTreeNode; NodeName: string;

begin

 Result := True;

 // функция EnumChildWindows возвращает список

 // не только прямых потомков окна, но и потомков его

 // потомков, поэтому необходимо отсеять все те окна,

 // которые не являются прямыми потомками данного

 if Assigned(ParentNode) and (THandle(ParentNode.Data) <> GetAncestor(Wnd, GA_PARENT)) then Exit;

 TextLen := GetWindowTextLength(Wnd);

 SetLength(Text, TextLen);

 if TextLen > 0 then GetWindowText(Wnd, PChar(Text), TextLen + 1);

 if TextLen > 100 then Text := Copy(Text, 1, 100) + '...';

 GetClassName(Wnd, ClassName, ClassNameLen);

 ClassName[ClassNameLen - 1] := #0;

 if Text = '' then NodeName := 'Без названия (' + ClassName + ')';

 else NodeName := Text + ' (' + ClassName + ')';

 NodeName := '$' + IntToHex(Wnd, 8) + ' ' + NodeName;

 Node := ProcessesInfoForm.TreeWindows.Items.AddChild(ParentNode, NodeName);

 Node.Data := Pointer(Wnd);

 EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Node));

end;


function EnumTopWindowsProc(Wnd: HWnd; PIDNeeded: Cardinal): BOOL; stdcall;

var

 Text: string;

 TextLen: Integer;

 ClassName: array[0..ClassNameLen - 1] of Chars;

 Node: TTreeNode;

 NodeName: string;


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "О чём не пишут в книгах по Delphi"

Книги похожие на "О чём не пишут в книгах по Delphi" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора А. Григорьев

А. Григорьев - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

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

Отзывы о "А. Григорьев - О чём не пишут в книгах по Delphi"

Отзывы читателей о книге "О чём не пишут в книгах по Delphi", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.