Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Функция GetWindowThreadProcessId





DWORD GetWindowThreadProcessId

(

HWND hWnd, // дескриптор окна

LPDWORD lpdwProcessId // адрес переменной для идентификатора процесса

);

Параметры:

hWnd– идентифицирует окно.

lpdwProcessId– указывает на 32-разрядное значение, которое принимает идентификатор процесса. Если этот параметр – не NULL,

GetWindowThreadProcessIdкопирует идентификатор процесса в 32-разрядное значение; иначе, она этого не делает. Возвращаемое значение – идентификатор потока, который создает окно.

Для того, чтобы завершить процесс, его необходимо открыть с использованием функции:

Функция OpenProcess

HANDLE OpenProcess

(

DWORD dwDesiredAccess, // флажок доступа

BOOL bInheritHandle, // параметр дескриптора наследования

DWORD dwProcessId // идентификатор процесса

);

Параметры:

dwDesiredAccess– устанавливает уровень доступа к объекту процесса. Этот параметр может состоять из одного нескольких прав доступа к процессу. Windows NT /200/XP: Это право доступа проверяется у любого дескриптора безопасности для процесса.

bInheritHandle– если этот параметр является TRUE, дескриптор наследуем. Если этот параметр является FALSE, дескриптор не может наследоваться.

dwProcessId– идентификатор процесса, который открыт.

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения – открытый дескриптор заданного процесса. Если функция завершается с ошибкой, величина возвращаемого значения NULL. Чтобы получить дополнительные данные об ошибке, вызовите GetLastError.

Полезной функцией, необходимой для получения сведений о выполнении процессов, является:

Функция GetProcessTimes

BOOL GetProcessTimes

(

HANDLE hProcess, // дескриптор процесса

LPFILETIME lpCreationTime, // время создания процесса

LPFILETIME lpExitTime, // время выхода из работы процесса

LPFILETIME lpKernelTime, // время, работы процесса в режиме ядра

LPFILETIME lpUserTime // время, работы процесса в режиме пользователя

);

Параметры:

hProcess– дескриптор процесса, информация о распределении интервалов времени которого разыскивается. Этот дескриптор должен быть создан с правами доступа PROCESS_QUERY_INFORMATION. Для получения дополнительной информации, см. статью Защита процесса и права доступа.

lpCreationTime– указатель на структуру FILETIME, которая принимает время создания процесса. Так как время возвращается по количеству интервалов по 100нс., отсчитанных с полуночи 1 января 1601 года, то для получения нормального времени необходимо воспользоваться функцией FileTimeToSystemTime.

lpExitTime– указатель на структуру FILETIME, которая принимает время выхода из работы процесса. Если процесс не вышел из работы, содержание этой структуры не определенное.

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



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

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения – не ноль. Если функция завершается с ошибкой, величина возвращаемого значения – ноль. Чтобы получать расширенные данные об ошибках, вызовите GetLastError.

Задание:

1. Модифицировать программу:

– запустить процесс калькулятора из приложения;

– запустить из приложения процесс команды ping с параметрами

запрашиваемого IP-адреса соседнего компьютера;

– получить информацию о времени выполнения дочерних процессах

калькулятора и ping;

– удалить оба дочерних процесса;

– запустив через меню «Пуск» программы калькулятора и графического

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

Контрольные вопросы:

1. Из чего состоят процесс и поток в среде Windows?

2. Создание и завершение процесса.

3. Каковы параметры функции CreateProcess?

4. Назначение и состав структуры PROCESS_INFORMATION.

5. Назначение и состав структуры STARTUP_INFO.

6. Назначение и состав структуры LPSECURITY_ATTRIBUTES.

Для самостоятельного изучения:

1. Функции ExitProcess, GetCurrentProcess, GetPriorityClass, GetProcessVersion,

GetProcessWorkingSetSize, SetPriorityClass, SetProcessWorkingSetSize.

Обмен информацией между процессами

Параллельно работающие процессы часто должны обмениваться данными. На данном этапе необходимо осуществить взаимодействие между двумя процесами через файл и пут.м использования API сообщения WM_COPYDATA.

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

Функция CreateFile

HANDLE CreateFile

(

LPCTSTR lpFileName, // имя файла

DWORD dwDesiredAccess, // режим доступа

DWORD dwShareMode, // совместный доступ

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD (дескр. защиты)

DWORD dwCreationDisposition, // как действовать

DWORD dwFlagsAndAttributes, // атрибуты файла

HANDLE hTemplateFile // дескр.шаблона файла

);

Функция CreateFileсоздает или открывает каталог, физический диск, том, буфер консоли (CONIN$ или CONOUT$), устройство на магнитной ленте, коммуникационный ресурс, почтовый слот или именованный канал. Функция возвращает дескриптор, который может быть использован для доступа к объекту.

Параметр lpFileName– адрес строки, содержащей имя файла, который вы собираетесь создать или открыть. Параметр dwDesiredAccessопределяет тип доступа, который должен быть предоставлен к открываемому файлу.

С помощью параметра dwShareModeзадаются режимы совместного использования открываемого или создаваемого файла.

Через параметр lpSecurityAttributesнеобходимо передать указатель на дескриптор защиты или значение NULL, если этот дескриптор не используется.

Параметр dwCreationDistributionопределяет действия, выполняемые функцией CreateFile, если приложение пытается создать файл, который уже существует.

Параметр dwFlagsAndAttributesзадает атрибуты и флаги для файла.

И, наконец, последний параметр hTemplateFileпредназначен для доступа к файлу шаблона с расширенными атрибутами создаваемого файла.

В случае успешного завершения функция CreateFile возвращает идентификатор созданного или открытого файла (или каталога).

При ошибке возвращается значение INVALID_HANDLE_VALUE (а не NULL, как можно было бы предположить). Код ошибки можно определить при помощи функции GetLastError.

Закрытие файла осуществляется с использование функции CloseHandle.

Запись и чтение из файла осуществляется с помощью функций ReadFileи WriteFile:

Функция ReadFile

BOOL ReadFile

(

HANDLE hFile, // дескриптор файла

LPVOID lpBuffer, // буфер данных

DWORD nNumberOfBytesToRead, // число байтов для чтения

LPDWORD lpNumberOfBytesRead, // число прочитанных байтов

LPOVERLAPPED lpOverlapped // асинхронный буфер

);

Функция ReadFileчитает данные из файла, начиная с позиции, обозначенной указателем файла. После того, как операция чтения была закончена, указатель файла перемещается на число действительно прочитанных байтов, если дескриптор файла не создан с атрибутом асинхронной операции. Если дескриптор файла создается для асинхронного ввода - вывода, приложение должно переместить позицию указателя файла после операции чтения.

Параметры:

hFile– дескриптор файла, который читается. Дескриптор файла должен быть, создан с правом доступа GENERIC_READ.

lpBuffer– указатель на буфер, который принимает прочитанные данные из файла.

nNumberOfBytesToRead– число байтов, которые читаются из файла.

lpNumberOfBytesRead– указатель на переменную, которая получает число прочитанных байтов. Функция ReadFileустанавливает это значение в нуль перед началом любой работы или проверкой ошибок.

lpOverlapped– указатель на структуру OVERLAPPED. Эта структура требуется тогда, если параметр hFileсоздавался с флажком FILE_FLAG_OVERLAPPED.

Возвращаемые значения

Функция ReadFileвозвращает значение тогда, когда выполнено одно из ниже перечисленных условий:

– операция записи завершается на записывающем конце канала,

– затребованное число байтов прочитано,

– или происходит ошибка.

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

Функция WriteFile

BOOL WriteFile

(

HANDLE hFile, // дескриптор файла

LPCVOID lpBuffer, // буфер данных

DWORD nNumberOfBytesToWrite, // число байтов для записи

LPDWORD lpNumberOfBytesWritten, // число записанных байтов

LPOVERLAPPED lpOverlapped // асинхронный буфер

);

Функция WriteFileпишет данные в файл с места, обозначенного указателем позиции в файле. Эта функция предназначена и для синхронной, и для асинхронной операции.

Параметры:

hFile– дескриптор файла. Дескриптор файла, должен быть создан с правом доступа GENERIC_WRITE.

lpBuffer– указатель на буфер, содержащий данные, которые будут записаны в файл.

nNumberOfBytesToWrite– число байтов, которые будут записаны в файл.

lpNumberOfBytesWritten– указатель на переменную, которая получает число записанных байтов. Функция WriteFileустанавливает это значение в нуль перед выполнением какой-либо работы или выявлением ошибок.

lpOverlapped– указатель на структуру OVERLAPPED. Эта структура требуется тогда, если параметр hFileсоздавался с флажком FILE_FLAG_OVERLAPPED.

Возвращаемые значения

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

В листинге 16 привед.н пример открытия файла для чтения.

void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,

HBITMAP hBMP, HDC hDC)

{

HANDLE hf; // file handle

BITMAPFILEHEADER hdr; // bitmap file-header

PBITMAPINFOHEADER pbih; // bitmap info-header

LPBYTE lpBits; // memory pointer

DWORD dwTotal; // total count of bytes

DWORD cb; // incremental count of bytes

BYTE *hp; // byte pointer

DWORD dwTmp;

pbih = (PBITMAPINFOHEADER) pbi;

lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

if (!lpBits)

errhandler("GlobalAlloc", hwnd);

// Retrieve the color table (RGBQUAD array) and the bits

// (array of palette indices) from the DIB.

if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,

DIB_RGB_COLORS))

{

errhandler("GetDIBits", hwnd);

}

// Create the .BMP file.

hf = CreateFile(pszFile,

GENERIC_READ | GENERIC_WRITE,

(DWORD) 0,

NULL,

CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

(HANDLE) NULL);

if (hf == INVALID_HANDLE_VALUE)

errhandler("CreateFile", hwnd);

hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"

// Compute the size of the entire file.

hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +

pbih->biSize + pbih->biClrUsed

* sizeof(RGBQUAD) + pbih->biSizeImage);

hdr.bfReserved1 = 0;

hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.

hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +

pbih->biSize + pbih->biClrUsed

* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.

if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),

(LPDWORD) &dwTmp, NULL))

{

errhandler("WriteFile", hwnd);

}

// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.

if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)

+ pbih->biClrUsed * sizeof (RGBQUAD),

(LPDWORD) &dwTmp, ( NULL))

errhandler("WriteFile", hwnd);

// Copy the array of color indices into the .BMP file.

dwTotal = cb = pbih->biSizeImage;

hp = lpBits;

if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))

errhandler("WriteFile", hwnd);

// Close the .BMP file.

if (!CloseHandle(hf))

errhandler("CloseHandle", hwnd);

// Free memory.

GlobalFree((HGLOBAL)lpBits);

}

Листинг 16 – Функция для открытия BMP файла (MSDN)

Сообщение WM_COPYDATA передается тогда, когда одна программа пересылает данные в другую программу. Синтаксис:

wParam = (WPARAM) (HWND) hWnd; // дескриптор передающего окна lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // указатель на структуру с данными

Принимающий данные процесс должен обрабатывать сообщение WM_COPYDATA в главном окне. Данные получаются в виде структуры:

Структура COPYDATASTRUCT

typedef struct tagCOPYDATASTRUCT

{

DWORD dwData;

DWORD cbData;

PVOID lpData;

} COPYDATASTRUCT;

dwData– устанавливает до 32 битов данных, которые будут переданы в принимающую прикладную программу, cbData– устанавливает размер, в байтах, данных, указанных элементом структуры lpData, lpData– указывает на данные, которые будут переданы в принимающую прикладную программу. Этот элемент структуры может быть значением NULL.

Чтобы послать сообщение из процесса в процесс нужно воспользоваться API- функцией SendMessage:

Функция SendMessage

LRESULT SendMessage(

HWND hWnd,

UINT message,

WPARAM wParam = 0,

LPARAM lParam = 0

);

Параметры:

hWnd– дескриптор окна, которому посылается сообщение.

message– определяет сообщение которое будет послано.

wParam– определяет дополнительную зависимую от сообщения информацию.

pParam– определяет дополнительную зависимую от сообщения информацию.

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

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

Задание:

1. Написать программу «Источник данных» со следующими функциями:

– запись строки в файл средствами API, блокируя доступ к записи и чтению

файла другими программами;

– передача текстовой строки с помощью сообщения WM_COPYDATA

другому приложению.

2. Написать программу «При.мник данных» со следующими функциями:

– опрос по таймеру файла, на наличие в н.м сообщений;

– при.м и обработка сообщения WM_COPYDATA от «Источника данных».

Контрольные вопросы:

1. Каковы параметры функции CreateProcess?

2. Каковы режимы чтения и записи файлов?

3. Какой формат сообщения WM_COPYDATA?

4. Как осуществляется при.м и обработка сообщения WM_COPYDATA?

Для самостоятельного изучения:

1. Другие способы сообщения между независимыми процессами.









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.