Программирование КПК и смартфонов на .NET Compact Framework — страница 33 из 41

Несмотря на свою дешевизну и простоту, инфракрасное соединение имеет несколько существенных недостатков. К ним относятся маленький радиус действия и возможность связи в пределах прямой видимости. Этих недостатков лишено Bluetooth-соединение.

Но и тут не обошлось без ложки дегтя в бочке меда. Во-первых, существует два различных подхода к реализации Bluetooth-соединений, которые не совместимы друг с другом. Во-вторых, пока не существует поддержки этой технологии в управляемом коде .NET Compact Framework. Примеры с Bluetooth-связью мы будем приводить для устройств под управлением Windows Mobile 5.0, так как они гарантированно используют одну и ту же реализацию Bluetooth-технологии. Так как библиотека .NET Compact Framework не имеет в своем составе классов, работающих с Bluetooth, то придется воспользоваться вызовами функций Windows API, как показано в листинге 12.6.

Листинг 12.6

public enum RadioMode {

 Off = 0,

 Connectable = 1,

 Discoverable = 2

}


/// 

/// Получает текущий статус bluetooth

/// 

/// флаги

/// 

[DllImport("BthUtil.dll")]

public static extern int BthGetMode(out RadioMode dwMode);


/// 

/// Устанавливает новый режим bluetooth

/// 

/// флаги для установки режима

/// 

[DllImport("BthUtil.dll")]

public static extern int BthSetMode(RadioMode dwMode);


private void mnuOn_Click(object sender, EventArgs e) {

 BthSetMode(RadioMode.Connectable);

 lblStatus.Text = RadioMode.Connectable.ToString();

}


private void Form1_Load(object sender, EventArgs e) {

 RadioMode mode;

 int ret = BthGetMode(out mode);

 lblStatus.Text = mode.ToString();

}


private void mnuOff_Click(object sender, EventArgs e) {

 ВthSetMode(RadioMode.Off);

 lblStatus.Text = RadioMode.Off.ToString();

}

В этом примере после запуска приложения текущий режим Bluetooth определяется при помощи функции

BthGetMode
, а с помощью команд меню пользователь может включать или выключать Bluetooth-соединение, используя функцию
BthSetMode
.

Несколько слов о связи

Несомненно, маленькие мобильные устройства, будь то смартфон или КПК, идеально подходят на роль коммуникационных устройств. В этой главе были приведены только самые простые примеры использования связи между устройствами. В последнее время набирают обороты такие виды связи, как Wi-Fi, GPS и GPRS. Кроме того, мобильные устройства имеют в своем составе браузеры для путешествия по Всемирной паутине. Таким образом, серьезному разработчику необходимо освоить весь спектр технологий, связанных с обменом данными между устройствами.

Глава 13Использование неуправляемого кода

Несмотря на то что библиотека .NET Compact Framework имеет множество классов для выполнения самых разных задач, во многих случаях приходится прибегать к вызовам функций Windows API. А в некоторых случаях использование функций Windows API даже предпочтительнее, чем использование аналогичных методов управляемого кода, так как они позволяют оптимизировать и повысить производительность приложения.

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

Вызов функций Windows API

Для вызовов функций Windows API используется механизм P/Invoke. Большинство часто вызываемых функций находится в библиотеке

coredll.dll
.

Разработчики, которые пользовались функциями API в настольной версии Windows, наверняка обратят внимание на то, что эта библиотека

coredll.dll
содержит множество знакомых функций из библиотек
kernel32.dll
,
gdi32.dll
и
user32.dll
. Поэтому во многих случаях довольно легко будет перенести свои наработки из программ для настольного компьютера в приложения для мобильных устройств.

Определение платформы

Если нужно определить, на какой платформе запущено ваше приложение, то здесь вам не обойтись без вызова функции Windows API

SystemParametersInfo
.

Для начала нужно создать новый класс

PlatformDetector
, в котором следует объявить функцию
SystemParametersInfo
и методы определения платформы. А в обработчике события
Load
основной формы надо вызвать метод
GetPlatform
, чтобы узнать платформу сразу же после загрузки приложения, как это показано в листинге 13.1.

Листинг 13.1

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;


namespace PlatformDetector_CS {

 class PlatformDetector {

  [DllImport("coredll.dll")]

  private static extern bool SystemParametersInfo(int uiAction, int uiParam,

   StringBuilder pvParam, int fWinIni);


  private static int SPI_GETPLATFORMTYPE = 257;


  public static Platform GetPlatform() {

   Platform plat = Platform.Unknown;

   switch (System.Environment.OSVersion.Platform) {

   case PlatformID.Win32NT:

    plat = Platform.Win32NT;

    break;

   case PlatformID.WinCE:

    plat = CheckWinCEPlatform();

    break;

   }

   return plat;

  }


  static Platform CheckWinCEPlatform() {

   Platform plat = Platform.WindowsCE;

   StringBuilder strbuild = new StringBuilder(200);

   SystemParametersInfо(SPI_GETPLATFORMTYPE, 200, strbuild, 0);