kvv's home

Форма входа

Категории раздела

Лекции [14]
Разное [4]
Статьи на тему WM, не попавшие в лекции по разным причинам.

Поиск

Каталог статей

Главная » Статьи » Программирование под Windows Mobile » Лекции

Часть 3. Основные API
Введение в WM API

API Windows Mobile можно условно разелить на следующие части:
  • WinAPI
  • Memory Manager API – поддержка работы с памятью
  • Power Manager API – поддержка функций энергопотребления
  • File System API
    • EDB API - управление базами данных
    • File IO API - управление файлами и каталогами
    • File Mapping API - управление файлами, проецируемыми в память
    • Storage Manager API - управление хранилищами
  • Networking API
    • Bluetooth - управление устройствами BT
    • CellCore - управление функциями GSM модуля
    • SMS API
    • SIM API
    • Wireless API
    • WinSock API - поддержка сокетов
    • WinInet API - поддержка протокола TC/IP, http, ftp функции
    • Infrared API - поддержка обмена по IrDA
  • Game API (GAPI) - поддержка работы игровых приложений
  • Shell API - поддержка контролов и взаимодействие с GUI
  • ActiveSync API - поддержка соединения с удаленным компьютером
    • Remote API (RAPI) - управление системой через удаленных компьютер
Полную справку по функциям API можно получить из MSDN, ниже мы рассмотрим некоторые функции данных API.

Memory Manager.

Общие положения.
  • Доступная память делится на две части: Storage Memory и Program Memory
  • Память выделяется страницами (для ARM архитектуры по 4Кб )
  • Приложения могут адресовать 4Гб адресного пространства
  • Физическая память, доступная для процесса - 32 Мб
  • Физическая память доступная для одного потока – 1Мб

Получить количество свободной памяти можно с помощью функции:
void GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer );
где lpBuffer – структура описания состояния памяти:

typedef struct _MEMORYSTATUS
{
DWORD dwLength;
DWORD dwMemoryLoad; - процент использования памяти
DWORD dwTotalPhys; - общее кол-во памяти
DWORD dwAvailPhys; - кол-во свободной памяти
DWORD dwTotalPageFile; - кол-во памяти в файле подкачки
DWORD dwAvailPageFile; - кол-во свободной памяти в файле подкачки
DWORD dwTotalVirtual; - размер памяти процесса
DWORD dwAvailVirtual; -свободная память процесса
} MEMORYSTATUS, *LPMEMORYSTATUS;

Память, как и все остальные ресурсы. Имеет обыкновение заканчиваться.
Сущетвует 3 категории нехватки памяти:
LowMemory – свободно 256Кб памяти. Система при этом рассылает приложениям сообщение WM_HIBERNATE. Приложение в ответ на сообщение должно освободить память, выделенную функцией VirtaulAlloc, освободить неиспользуемые ресурсы GDI.
VeryLowMemory – свободно 160Кб памяти. Система рассылает приложениям сообщение WM_CLOSE. В ответ на это сообщение, приложения должны завершить работу и полность освободить память и ресурсы GDI.
CriticalMemory – свободно меньше 32Кб. В этом состоянии запуск программ невозможен. Система показывает стандартный диалог нехватки памяти и перезагружается.

Иногда программе для работы нужно больше памяти, чем свободно. В этом случае можно воспользоваться функцией:
BOOL SHCloseApps( DWORD dwMemNeed );
где, dwMemNeed - объем памяти, который необходимо освободить.
При этом система посылает остальным приложениям сообщение WM_CLOSE до тех пор, пока не будет доступно необходимое количество памяти (если это возможно вообще). Если это не возможно по каким-то причинам, то функция вернет false, и придется использовать столько памяти, сколько доступно, или пойти на ухищрения типа memory-mapped files.

Память делится между памятью программ (Program Memory) и памятью файлов (Storage Memory). В настройках системы можно посмотреть и установить распределение использования память вручную:


Но есть способ сделать это программно/ Для этого существуют недокументированные функции из core.dll:
GetSystemMemoryDivision(LPDWORD,LPDWORD,LPDWORD);
SetSystemMemoryDivision(DWORD);

Получение текущего распределения памяти:
BOOL GetSystemMemoryDivision(
LPDWORD pmemStorage,
LPDWORD pmemRAM,
LPDWORD pmemTotal);
где
pmemStorage – размер памяти, отданной под хранилище
pmemRAM - размер памяти отданной под программы
pmemTotalобщий размер памяти

Установка распределения памяти:
DWORD SetSystemMemoryDivision(DWORD memStorage);
где
memStorage - размер памяти, выделяемый под хранилище, в страницах памяти

Возвращаемое значение:
0 – значение установлено успешно
1- значение будет установлено после перезагрузки
2,3 – ошибка (м.б. функция не поддерживатеся)

Пример использования данных функций:
typedef
BOOL (stdcall *GetSystemMemoryDivisionProc)(LPDWORD,LPDWORD,LPDWORD)
typedef
DWORD (stdcall *SetSystemMemoryDivisionProc)(DWORD);

void ReadMemoryDivision()
{
HINSTANCE hCoreDll = LoadLibrary(_T("coredll.dll"));
GetSystemMemoryDivisionProc procGet = (GetSystemMemoryDivisionProc)GetProcAddress(
hCoreDll, _T("GetSystemMemoryDivision"));
DWORD dwStoragePages;
DWORD dwRamPages;
DWORD dwPageSize;
BOOL bResult = procGet(&dwStoragePages, &dwRamPages, &dwPageSize);
FreeLibrary(hCoreDll);
}

void SetMemoryDivision()
{
int nStoragePages = 30 * 256 ; // 30 Mb
HINSTANCE hCoreDll = LoadLibrary(_T("coredll.dll"));
SetSystemMemoryDivisionProc procSet =
(SetSystemMemoryDivisionProc) GetProcAddress(
hCoreDll, _T("SetSystemMemoryDivision"));
DWORD dwResult = procSet(nStoragePages);
FreeLibrary(hCoreDll);
}

Как было ск5азано выше, выделение памяти в системе происходит кусками, кратными размеру страницы. Это следует учитывать в приложениях, активно использующих динамическую память.
Размер страницы памяти можно определить с помощью функции GetSystemInfo():
void GetSyetemInfo(LPSYSTEM_INFO lpSystemInfo);
структура LPSYSTEM_INFO описывает характеристики процессора, из которых и можно получит интересующее нас значение:


typedef struct _SYSTEM_INFO { 
 union {
 DWORD dwOemId; 
 struct {
 WORD wProcessorArchitecture; // тип архитектуры процессора
 WORD wReserved;
 };
};
 DWORD dwPageSize; // размер страницы памяти
 LPVOID lpMinimumApplicationAddress; // адрес начала области памяти для приложений
 LPVOID lpMaximumApplicationAddress; // адрес конца области памяти для приложений
 DWORD dwActiveProcessorMask; 
 DWORD dwNumberOfProcessors; // количество процессоров в системе
 DWORD dwProcessorType; // тип процессора
 DWORD dwAllocationGranularity;
 WORD wProcessorLevel;
 WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;
Эта же функция, совместно с функцией GetVersionInfoEx может использоваться для л/р “Просмотр информации о системе”


Power Manager.

Функция получения состояния основной и дополнительной батарей:

DWORD GetSystemPowerStatusEx2( PSYSTEM_POWER_STATUS_EX2 pSystemPowerStatusEx2,
DWORD dwLen,
BOOL fUpdate );

Самый важный параметр функции – структура SYSTEM_POWER_STATUS_EX2:

typedef struct _SYSTEM_POWER_STATUS_EX2
{
BYTE ACLineStatus; - состояние внешнего питания
BYTE BatteryFlag; - состояние основной батареи
BYTE BatteryLifePercent; - процент зарядки основной батареи
DWORD BatteryLifeTime; - время, на которое хватит заряда
DWORD BatteryFullLifeTime; - время, на которое хватит полной батареи
BYTE BackupBatteryFlag; - состояние резервной батареи
BYTE BackupBatteryLifePercent; - процент заряда резервной батареи
DWORD BackupBatteryLifeTime; - время остатка заряда резервной батареи
DWORD BackupBatteryFullLifeTime; - полное время резервной батареи
Физические характеристики батареи:
DWORD BatteryVoltage; - емкость батреи (mV)
DWORD BatteryCurrent; - ток батареи (mA)
DWORD BatteryAverageCurrent; - средний ток
DWORD BatteryAverageInterval; - интервал изменения тока
DWORD BatterymAHourConsumed; - емкость батареи в mAH
DWORD BatteryTemperature; - температура батареи
DWORD BackupBatteryVoltage; - емкость резервной батареи
BYTE BatteryChemistry; - тип батареи (LION, NiCD, NIMN… )
} SYSTEM_POWER_STATUS_EX2

Получение таймаутов выключения девайса

таймаут выключения при использовании батареи
SystemParametersInfo(SPI_GETBATTERYIDLETIMEOUT,0,&batIdle,0);
таймаут выключения при использовании внешнего питания
SystemParametersInfo(SPI_GETEXTERNALIDLETIMEOUT,0,&acIdle,0);

Выключение устройства:
keybd_event(VK_OFF,0,KEYEVENTF_SILENT,0);
sleep(60);
keybd_event(VK_OFF,0,KEYEVENTF_SILENT | KEYEVENTF_KEYUP,0);

Перезагрузка устройства:
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)

extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);

BOOL ResetPocketPC()
{
return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}

Работа с базами данных.
Windows Mobile содержит средства для работы с базами данных. Они сосредоточены в специальном CEDB API.
Ниже представлен список функций этого API.

CeAddDatabaseProps

Добавление свойства в существующую БД.

CeBeginTransaction

Функция начала транзакции

CeCreateDatabaseEx2

Функция создания новой БД

CeCreateSession

Функция начала новой сессии

CeDeleteDatabase

Функция удаления БД

CeDeleteRecord

Функция удаления записи

CeEndTransaction

Функция завершения транзакции

CeEnumDBVolumes

Функция перечисления созданных БД по GUID.

CeFindFirstDatabaseEx, CeFindNextDatabaseEx

Функции поиска БД

CeFlushDBVol

Функция сброса внутренних буферов БД

CeGetDatabaseSession

Функция получения открытых сессий для открытой БД.

CeGetDBInformationByHandle

Функция возвращает информацию о открытой БД по ее хендлу.

CeMountDBVol, CeMountDBVolEx

Функции монтируют БД из файла .

CeOpenDatabaseInSession

Функция открытия БД

CeOpenStream

Функция создания потока чтения данных из БД.

CeReadRecordPropsEx

Функция чтения свойств записи .

CeSeekDatabase , CeSeekDatabaseEx

Функция установки указателя на запись .

CeStreamRead

Функция чтения данных из потока БД

CeStreamSaveChanges

Функция записи изменения в БД

CeStreamSeek

Функция позиционирования внутри потока БД

CeStreamSetSize

Функция возвращает размер данных в потоке

CeStreamWrite

Функция записи данных в поток

CeUnmountDBVol

Функция размонтирования БД


Проще всего показать работу с базами данных на примере.
Открытие базы данных осуществляется с помощью пару функций CeCreateDataBase и CeOpen

SORTORDERSPEC sos[n]; // параметры сортировки
sos[0].propid = PROP_LPWSTR;
sos[0].dwFlags = 0;
CEOID CeOID = CeCreateDatabase(szBaseName,dwNewDBType, 0, sos);
HANDLE hNewDB = CeOpenDatabase(&CeOID, szBaseName, 0, 0, hWnd);

Позиционирование на определенную запись осуществляется с помощью функции CeSeekDatabase:
CeSeekDatabase(
hNewDB, // хендл таблицы
CEDB_SEEK_BEGINNING, // условие позиционирования
0, // номер записи в базе данных или указатель на значение
&dwIndex); // индекс записи

Прочитать запись можно с помощью функции CeReadRecordProps:
CeReadRecordProps (
hNewDB, // хендл таблицы
CEDB_ALLOWREALLOC, // флаг управления памятью
&wProps, // количество полей в записи
NULL, // перечень полей
&(LPBYTE)pBuff, // буффер, куда сложены данные
&cbData); // размер буфера

Возвращаемые данные складываются в массив структур:
typedef struct _CEPROPVAL { 
 CEPROPID propid; // тип поля (строка, целое, дата, BLOB и т.д.)
 WORD wLenData; // длина данных
 WORD wFlags; // флаги
 CEVALUNION val; // сами данные
} CEPROPVAL;
Получить значение можно так :
PCEPROPVAL pRecord = (PCEPROPVAL)pBuff;
szValue = pRecord->val.lpwstr;

Пример чтения всех записей таблицы:
while(CeSeekDatabase(hNewDB, CEDB_SEEK_BEGINNING, i, &dwIndex)!=0)
{
CeReadRecordProps (hNewDB, CEDB_ALLOWREALLOC, &wProps, NULL, &(LPBYTE)pBuff, &cbData);
PCEPROPVAL pRecord = (PCEPROPVAL)pBuff;
szValue = pRecord->val.lpwstr;
OutputDebugString(szValue);
}

Для записи поля используется функция CeWriteRecordProps()
Пример записи для таблицы с двумя полями:
// заполним буфер данными
CEPROPVAL NewRecProps[2];
// первое поле
NewRecProps[0].propid = PROP_LPWSTR;
NewRecProps[0].val.lpwstr = szText;
// второе поле
NewRecProps[1].propid = PROP_LPWSTR;
NewRecProps[1].val.lpwstr = szText2;
// запишем
CeWriteRecordProps(
hNewDB, // хендл таблицы
0, // позиция
2, // кол-во полей в записи
NewRecProps); // данные

И наконец, как удалить запись. Для этого можно воспользоваться функцией CeDeleteRecord.
При этом мы должны быть спозиционированы на эту запись:

CEOID oid = CeSeekDatabase (hNewDB, CEDB_SEEK_BEGINNING, RecIndex, &dwIndex);
CeDeleteRecord (hNewDB, oid);


Remote API (RAPI)
RAPI предназначено для управления девайсом с Windows Mobile с помощью удаленного подключения через ActiveSync.
В состав RAPI входят функции для:
  1. Операций с реестром
  2. Операций с базами данных
  3. Операций с файлами и каталогами
  4. Операции по получению системной информации
  5. Удаленный запуск функций из dll

Shell API
Shell API предоставляет различные функции для взаимодействия GUI с системой.

Категория: Лекции | Добавил: kvv (18.09.2007) | Автор: Владимр Кошелев E W
Просмотров: 4146 | Комментарии: 2 | Рейтинг: 4.0/1
Всего комментариев: 2
0
2 Rita   [Материал]
Yo, that's what's up turtfuhlly.

0
1 Alexandr Ulyanov   [Материал]
Физические характеристики батареи:
DWORD BatteryVoltage; - емкость батреи (mV) - Не емкость, а напряжение батареи. Про емкость правильно сказано дальше.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Друзья сайта

  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Облако тэгов