|
Функция GetWindowThreadProcessIdDWORD 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. Другие способы сообщения между независимыми процессами. Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом... Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|