Несмотря на свою дешевизну и простоту, инфракрасное соединение имеет несколько существенных недостатков. К ним относятся маленький радиус действия и возможность связи в пределах прямой видимости. Этих недостатков лишено 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
}
/// <summary>
/// Получает текущий статус bluetooth
/// </summary>
/// <param name="dwMode">флаги</param>
/// <returns></returns>
[DllImport("BthUtil.dll")]
public static extern int BthGetMode(out RadioMode dwMode);
/// <summary>
/// Устанавливает новый режим bluetooth
/// </summary>
/// <param name="dwMode">флаги для установки режима</param>
/// <returns></returns>
[DllImport("BthUtil.dll")]
public static extern int BthSetMode(RadioMode dwMode);
В этом примере после запуска приложения текущий режим 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,