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

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

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

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

суббота, 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- добавляем путь до папок