Archive for the ‘Devices’ Category

HTC, Android i Windows Mobile 7

czerwiec 20, 2008

HTC ogłosiła wprowadzenie nowych systemów operacyjnych do swoich urządzeń. Chodzi mianowicie o Windows Mobile 7 i bazujący na linuxie Google Android. O ile produkt Google’a jest gotowy i dostępny do pobrania, Windows Mobile 7 jest cały czas w fazie przygotowania.

Microsoft zapowiada, że nowy system wyeliminuje bolączki poprzedników szczególnie te związane z interfejsem użytkownika. Osobiście jestem trochę sceptyczny, pamiętam szumne zapowiedzi Windows Mobile 6. I co z nich wyszło - ano Windows Mobile 5 z kilkoma nowymi funkcjami i nieco zmienionym interfejsem. Kluczowe problemy jednak pozostały. Na obronę MS możemy powiedzieć, że wraz z wydaniem systemu WM6 narzędzia developerskie zostały znacząco ulepszone, jednak to, chyba nie interesuje użytkowników końcowych.

Ostatnio miałem okazję, wziąć w moje łapki nowość HTC Touch Diamond, pierwsze odczucia - super. Idealne urządzenie PDA o rozmiarach małego telefonu - albo właściwszym było by powiedzieć telefon z funkcjami PDA. Duży ekran, przyzwoity aparacik i mógłbym się na niego skusić, nawet pomimo tego, że wolę urządzenia z pełną klawiaturą (tutaj Sony Ericsson Xperia X1 wygląda interesująco). Jadnak IMHO urządzenie cierpi na tą samą bolączkę co jego pierwowzór HTC Touch - fajne UI sporo wodotrysków (nie mówię, że tego nie oczekuję) ale urządzenie pracuje jakoś tak … wolno. Co jak co, ale książka telefoniczna powinna działać szybko, funkcjonalność przede wszystkim.

Teraz jestem ciekaw czy główną przyczyna problemów z szybkością leży po stronie urządzenia czy systemu? Będziemy mogli sobie to porównać gdy np. HTC wprowadzi swojego Diamond’a z systemem Google Android. Cokolwiek by nie było, pojawienie się nowych systemów, to krok w dobrą stronę. Na pewno spowoduje sporo trudności z synchronizacją danych, kompatybilnością aplikacji myślę jednak, że wzmoże on konkurencję i przypomni gigantowi z Redmond, że niemożna zasypiać gruszek w popiele.

Update 23/06/2008:

Właśnie sobie czytam o poprawkach w TouchFLO 3D dla HTC Diamond’a. Widać nie tylko ja zwróciłem uwagę na jego powolne działanie.

Emulator & WM 6.1

kwiecień 6, 2008

Microsoft udostępnił obraz systemu Windows Mobile 6.1 dla emulatorów. Jak na razie dostępna jest tylko wersja anglojęzyczna. Pliki do pobrania znajdują się tutaj.

iPhone Tutorial for .NET Developers

marzec 29, 2008

Rabi Satter opisuje jak stworzyć najprostszą możliwą aplikację (czytaj ‘Hello World’) dla iPhone’a. Korzysta ze środowiska, Xcode które jest dostarczane razem z iPhone SDK. Wszystko podane z perspektywy programisty .NET’owego. Po przeczytaniu, zdałem sobie sprawę, że pracując z platformą .NET i Visual Studio, bardzo łatwo zapomnieć, że tam gdzieś istnieje całkiem inny świat ;)

Tak od jakiegoś czasu chodzą mi po głowie myśli o zakupie iPhone’a. Fajny design, mnogość możliwości, łatwość obsługi i oczywiście moda ;) . To trzeba, chłopakom, przyznać potrafią wylansować produkt.
Oczywiście nie ma róży bez kolców, wysoka cena i niezdrowa chęć producenta do kontroli/ograniczania tego, co chcemy zrobić z urządzeniem. Bez łamania umowy i hakowania urządzenia nie da się dużo zdziałać, przykładem może być konieczność korzystania z iTunes do zmiany melodyjki telefonu (koszt $2). Na dodatek nie będę mógł pisać własnych aplikacji, no chyba, że Apple wyda SDK na PC’ta albo ja zainwestuje w Mac’a ;)

MyMobiler v 1.2

marzec 28, 2008

Jakiś czas temu pisałem o programie MyMobiler. Darmowym narzędziu, dzięki któremu możemy kontrolować urządzenie PDA, podłączone do komputera. Właśnie zainstalowałem, jego najnowszą wersję. Autor oprócz usunięcia problemu z wprowadzaniem danych i odświeżeniu wyglądu aplikacji, dodał także szereg nowych, interesujących możliwości:

  1. Mechanizm ’skórek’ dla naszej aplikacji - co by okienko wyglądało podobnie do rzeczywistego urządzenia.
    image
  2. Mobile Exploler - zewnętrzny interfejs do operowania na plikach zgromadzonych na urządzeniu. Według mnie o niebo wygodniejszy w obsłudze od opcji Explore z ActiveSync’a. Co prawda samemu jestem uzależnionym od Total Commandera i wolę korzystać z plug-in’u, o którym pisałem tutaj. Jednak zawsze to ciekawa alternatywa.
    clip_image002
  3. Mapowanie przycisków specjalnych urządzenia do klawiszy funkcyjnych.
  4. Nagrywanie naszych poczynań i zapis do pliku w formacie AVI.
  5. Możliwość połączenia się z urządzeniem bez konieczności korzystania z ActiveSync’a.
  6. Drag & Drop plików z komputera na PDA - przynajmniej tak twierdzi autor, mi nie udało się w ten sposób skopiować żadnego pliku.

Całość pracuje stabilnie, jedynym minusem, jakiego mogę się doszukać, są zauważalne spore opóźnienia między wydaniem polecenia a jego wykonaniem. Jednak nie wykluczam, że winę za to może ponosić urządzenie a nie program.

Strona domowa projektu znajduje się tutaj.

Cisco IP Phone

luty 7, 2008

Ostatnio pracuję nad nowym projektem, również związanym z urządzeniami zewnętrznymi, jednak już nie przenośnymi. Moim zadaniem jest umożliwić interakcję zwykłego, stacjonarnego telefonu z całym back-end’owym zapleczem. No dobrze, przyznaje ten ‘zwyczajny’ telefon, nie jest znowuż taki zwyczajny, to Cisco IP Phone 7960.

Obawiałem się, że projekt będzie niejakim wyzwaniem, gdzie będę musiał rozgryzać magiczne kody komunikacyjne etc. jak to swego czasu robiłem pisząc ’sterownik’ dla drukarki fiskalnej POSNET‘u. Jednak ku mojej radości (nienawidzę nudnej, żmudnej dłubaniny) okazało się to całkiem proste. Tak dla ścisłości to był mój pierwszy bezpośredni kontakt z urządzeniami firmowanymi przez Cisco i nie bardzo wiedziałem czego się spodziewać. Muszę przyznać, że jestem miło zaskoczony tym jak chłopaki sobie to wszystko wymyślili.
Otóż, wszystko działa w architekturze klient-serwer, gdzie telefon po podłączeniu do cyfrowej centralki (np. zwykłego serwera z zainstalowanym oprogramowaniem centralki PABX) spełnia, jak się łatwo domyślić rolę klienta. Jest to możliwe, gdyż modele Cisco IP Phone z rodziny 7900, mają wbudowany interpreter plików XML, dzięki któremu możemy poinstruować telefon czego od niego oczekujemy. Czyli całą ‘trudnością’ jest stworzenie aplikacji ASP.NET komunikującej się z, w moim przypadku, bazą danych i generującą odpowiednie pliki XML. Struktura plików XML jest łatwa i przejrzysta, przykładowo aby wyświetlić menu na wbudowanym w telefon wyświetlaczu, musimy wysłać do niego następującą strukturę:

<CiscoIPPhoneMenu>
    <Title>Title of Menu</Title>
    <Prompt>Prompt text.</Prompt>
    <MenuItem>
          <Name>Name of Menu Item.</Name>
          <URL>http://url.of.site.com/services/command.aspx</URL>
    </MenuItem>
    <MenuItem>
          <Name>Name of Menu Item.</Name>
          <URL>http://url.of.site.com/services/command.aspx</URL>
    </MenuItem>
</CiscoIPPhoneMenu>

Więcej na temat struktury obiektów XML można znaleźć tutaj. Parametr URL prowadzi do kolejnego pliku XML, parametry możemy przekazywać za pomocą POST i GET. Plik XML który chcemy aby był punktem wejściowym dla naszej aplikacji definiujemy w centralce skąd odpowiedni URL jest przekazywanych do określonych telefonów.

Pisanie tego typu usług można sobie przetestować bez dostępu do całego zaplecza telefonów/serwerów etc. wystarczą nam tylko dwa programy. Pierwszym jest Call Manager Simulator, jest to aplikacja dołączona do książki Developing Cisco IP Phone Service jest ona typu freeware’owa i jako taka jest całkowicie nie supportowana przez Cisco. Emuluje ona serwer TFTP i pozwala określić jaka strona jest punktem startowym naszej usługi. Drugim programem jest jakikolwiek SoftPhone, ja skorzystałem z Cisco IP Communicator oczywiście możemy skorzystać z normalnego urządzenia jeśli takowe mamy pod ręką. Co musimy zrobić, po pierwsze uruchomić symulator:

i określić jego adres IP, w tym wypadku należy podać adres IP naszego komputera.

Następnie musimy zainstalować emulator telefonu, np.:

i w jego ustawieniach wskazać na serwer TFTP emulowany przez nasz Call Manager Simulator.

Teraz po zrestartowaniu naszego telefonu, jeśli wszystko będzie w porządku, w Call Managerze powinniśmy zobaczyć dostępne nowe urządzenie. Teraz musimy umieścić przykładową aplikację na naszym serwerze IIS, jej kod jest dziecinnie prosty i wygląda mniej więcej tak:

Response.Write(“<CiscoIPPhoneMenu>”);
Response.Write(“<Title>Please select Service:</Title>”);
Response.Write(“<Prompt></Prompt>”);
Response.Write(“<MenuItem>”);
Response.Write(“<Name>Hello World Service</Name>”);
Response.Write(“<URL>http://” + this.IPAdress +
               “/IPPhoneServices/AskName.aspx</URL>”);
Response.Write(“</MenuItem>”);
Response.Write(“</CiscoIPPhoneMenu>”);

Wiem przypomina to bardziej stare spaghetti ASP niż ASP.NET, ale cóż poradzić. Na koniec musimy jeszcze poinformować nasz telefon gdzie szukać naszej aplikacji, w tym celu wracamy do Call Managera zaznaczamy urządzenie i wybieramy Configure -> Selected Device. Tutaj w pozycji Services URL podajemy adres do naszej strony i gotowe. Na koniec po ponownym uruchomieniu telefonu i naciśnięciu przycisku Services powinniśmy zobaczyć efekt naszej pracy.

OAC - Orientation Aware Control

styczeń 30, 2008

Stworzenie przejrzystego i funkcjonalnego interfejsu dla aplikacji mobilnej nie jest prostym zadaniem. Szczególnie obecnie gdy dynamika rynku urządzeń mobilnych cały czas się zwiększa i co rusz spotykamy się z nowymi rodzajami wyświetlaczy. Projektując interfejs aplikacji mobilnej musimy mieć na uwadze trzy parametry wyświetlania: rozdzielczość, rozmiar ekranu, i tryb wyświetlania. Rozdzielczość określana jest w DPI (ang. dot per inch) im większa tym więcej możemy zmieścić na ekranie. Typowymi rozdzielczościami są QVGA (Quater - VGA) która wynosi 96 DPI i VGA wynosząca 192 DPI. Rozmiar ekranu, podawany jest w pikselach i typowo wynosi 240×320 (szerokość/wysokość). Tryb wyświetlania określa czy nasze okno wyświetlane jest pionowo (vertical/portrait) bądź poziomo (horizontal/landscape).

Rozdzielczością, automatycznie zajmuje się Visual Studio, po za tymi sporadycznymi przypadkami gdy ręcznie tworzymy kontrolki. Musimy wtedy rozmiary komponentu przemnożyć przez, że tak to nazwę, współczynnik skalujący - dostosowujący wymiary do aktualnej rozdzielczości. Skalę możemy określić na przykład tak:


static class Program
{

[MTAThread]
static void Main()
{
  frmScaling f = new frmScaling();

  // rozdzielczość dla której projektowaliśmy aplikację
  const float designResolution = 96.0f;
  System.Drawing.Graphics g = f.CreateGraphics();
  float runningResolution = g.DpiX;

  ScaleFactor = runningResolution / designResoluion;
  g.Dispose();

  Application.Run(f);
}

  // Przemnóż wszystkie ‘ręcznie’ tworzone kontrolki przez
  // Program.ScaleFactor,
  // Przez większość czasu będą one przyjmowały jedną z
  // trzech wartości:
  // 1 - gdy zaprojektowaliśmy aplikację dla rozdzielczości
  //     na której pracujemy
  // 2 - gdy zaprojektowaliśmy aplikację dla 96dpi ale
  //     pracujemy na 192 dpi
  // 1.365 - gdy zaprojektowaliśmy aplikację dla 96dpi ale
  //     pracujemy na 131dpi (QVGA Smartphone)
  internal static float ScaleFactor;
}

Więcej na ten temat można znaleźć w książce Microsoft Mobile Development Handbook na strony 63 - 66.

Niestety wymiarami ekranów i trybem pracy musimy zająć się sami. Jest kilka sposobów aby ułatwić sobie, życie. Jednym z nich jest projektowanie interfejsu z myślą o kwadratowym ekranie. Mato swoje zalety - interfejs zawsze będzie taki sam niezależnie czy aplikacja pracuje w trybie pionowym czy poziomym. Wadą tego rozwiązania jest to, że na ekranach prostokątnych, marnujemy całkiem sporą ilość wolnej przestrzeni. Myślę, że można wziąć to rozwiązanie pod uwagę dla prostych aplikacji bez wyszukanego interfejsu użytkownika.

Innym rozwiązaniem jest stworzenie osobnych kontrolek - reprezentujących zawartość danego okna - i dynamicznej ich zamianie w zależności od wymaganego położenia. Rozwiązanie to wymaga jednak większego nakładu pracy gdyż nie dość, że musimy zaprojektować dwa różne ekrany i obsłużyć zdarzenie zmiany położenia ekranu. Prosty przykład tego rozwiązania można znaleźć w jednym z wcześniejszych moich postów. Przykład ten prezentuje dodatkowo jak wykorzystać wzorzec MVP (Model-View-Presenter) aby nie duplikować kodu wewnątrz kontrolek.

Kolejnym rozwiązaniem, obecnie chyba najłatwiejszym, jest skorzystanie w Orientation Aware Control w skrócie OAC. OAC jest kontrolką kontenerem i odpowiada funkcjonalności standardowej UserControl. Jednak posiada szereg nowych właściwości dzięki którym, możemy, na tylko jednej (!) kontrolce zaprojektować layout’y dla różnych trybów pracy ekranu. Czyli w sumie cała ciężka praca jest zrobiona za nas - jedyne co nam pozostaje to rozplanować prawidłowe położenie kontrolek.

Komponent OAC możemy pobrać z dwóch źródeł. Pierwszym jest pakiet Microsoft Patterns & Practises - Mobile Client Software Factory (MCSF). Niestety został on wydany prawie dwa lata temu (lipiec 2006) i od tego czasu nie był uaktualniany. Drugim źródłem jest strona www.orientationaware.net - tutaj możemy znaleźć najnowszą wersję tejże kontrolki, niestety jest już to kontrolka komercyjna. Fakt na stronie jest udostępniona wersja Community Edition ale jest ona dość poważnie ograniczona tzn. obsługuje tylko jedną rozdzielczość (QVGA).

Z moich doświadczeń wynika, że wersja kontrolki dostarczona MCSF w zupełności wystarcza i nie powoduje większych problemów. Jednakże trzeba mieć na uwadze, że w przypadku jakichkolwiek kłopotów, możemy mieć problem z otrzymaniem pomocy (ostatnie tematy z forum są datowane na rok 2006), i albo kupimy komercyjną wersję kontrolki, albo sami będziemy musieli zgłębić jej kod źródłowy.

Jak to wszystko działa? Otóż, przede wszystkim musimy dodać referencje do assembly:
Microsoft.Practices.Mobile.UI.OrientationAware.dll
i
Microsoft.WindowsMobile.Status.dll
lub tylko
Clarius.UI.OrientationAware.dll
w przypadku wersji komercyjnej. Kolejnym krokiem będzie utworzenie nowej UserControl i zmianie klasy z której ona dziedziczy na OrientationAwareControl.

 

Teraz możemy otworzyć naszą kontrolkę w designerze, właściwościami na które powinniśmy zwrócić uwagę to Orientation i Resolution. Jak nazwy wskazują Orientation określa jak nasze okno jest położone (vertical/horizontal) a Resolution pozwala nam wybrać rozdzielczość dla jakiej projektujemy nasz interfejs. Kontrolka dostarczona nam przez MS Pattern & Practises pozwala nam na wybór pomiędzy: 240×320 (QVGA), 480×640 (VGA), 240×240 (kwadratowa QVGA), 480×480 (kwadratowa VGA) co w większości przypadków jest wystarczające. Kontrolka dostarczona nam przez Clarius Consulting (www.orientationaware.net) - rozszerza ten zakres i pozwala na definiowanie własnych rozmiarów. Następnie na powierzchni naszej kontrolki umieszczamy resztę elementów, np.:

Gdy jesteśmy zadowoleni z wyglądu kontrolki pora utworzyć interfejs dla trybu landscape. W tym celu możemy zmienić właściwość Orientation z okna Properties bądź skorzystać z menu kontekstowego kontrolki i wybrać ‘Rotate‘. Teraz nie pozostaje nam nic innego jak dostosować wielkość kontrolki i odpowiednio rozmieścić elementy na niej.

Nie jesteśmy bynajmniej ograniczeni tylko do zmiany położenia elementów naszej kontrolki - możemy również zmieniać pozostałe właściwości jak np. ich rozmiary, właściwość Text czy Image. Ograniczeniem z jakim się spotykamy jest niemożliwość dodawania nowych elementów na widokach innych niż domyślny. Jeśli chcemy aby jakaś kontrolka była widoczna tylko w trybie landscape - musimy najpierw przejść do widoku domyślnego domyślnego, tzn. nie tylko położenia horizontal ale także domyślnej rozdzielczości, możemy tego dokonać poprzez wybranie opcji z menu kontekstowego kontrolki ‘Switch to Default Layout‘. Teraz dodajemy nową kontrolkę i ustawiamy jej właściwość Visible na false i zmieniamy ją w kodzie w momencie wykrycia zmiany orientacji ekranu. Właściwości Orientation Aware Control, dla wszystkich trybów wyświetlania, oprócz domyślnego są przechowywane jako zasoby. Dlatego też, jeśli przyjrzymy się pozycji Resources naszej kontrolki zobaczymy coś takiego:

Pojedynczy plik określa właściwości jednego trybu wyświetlania i aby zmniejszyć rozmiar zasobów przechowuje tylko wartości które uległy zmianie z widoku domyślnego.

Problem jaki wiąże się z przechowywaniem właściwości w zewnętrznych zasobach jest to, że są one odczytywane przy każdej zmianie widoku i nie zachowują aktualnego stanu poszczególnych kontrolek. Weźmy na przykład aplikację korzystającą z OAC w którym znajduje się kontrolka TextBox, użytkownik wpisuje do niego dane i zmienia orientację ekranu - w tym momencie właściwości kontrolki OAC są odczytywane z zasobów i zawartość naszej kontrolki zostaje zastąpiona domyślną wartością. Dlatego też musimy sami zadbać o przechowywanie zawartości elementów naszej OAC.

Na koniec kilka szczegółów o których powinniśmy wiedzieć:

  • Forma na której zamierzamy umieścić naszą kontrolkę pochodzącą od OAC powinna mieć ustawioną właściwość AutoScaleMode na None, gdyż skalowanie odbywa się trakcie projektowania i prawidłowe rozmiary są zapisane w zasobach.
  • Gdy projektujemy interfejs dla trybu VGA, wszystkie kontrolki są dwa razy większe niż zazwyczaj. Nie jest to błąd - Visual Studio 2005 (i zapewne VS 2008 też, ale nie testowałem tego) odwzorowuje kontrolki w ich rzeczywistych rozmiarach a ponieważ VGA jest dwa razy lepsza od QVGA na ekranach naszych monitorów otrzymujemy nieco większe niż przywykliśmy. Niestety taka jest specyfika Visual Studio i nie jesteśmy wstanie nic z tym zrobić.

Dodatkowych informacji można szukać na stronach Clarius Consulting bądź w udostępnionym przez Microsoft webcast’cie ‘Designing Zero-Code Adaptive UIs Using the Orientation Aware Control’. Źródła przykładowej aplikacji jest dostępne na tutaj.

Nowe ‘mobilne’ screencast’y

styczeń 24, 2008

Emulator i pre-konfigurowany obraz systemu

listopad 26, 2007

Jedną z niedogodności pracy z różnymi aplikacjami mobilnymi, jest konieczność zmiany konfiguracji emulatora dla każdej z nich. Nie jest to może reguła, ale z mojego doświadczenia wynika, że zachodzi ona dość często. Przykładowo zajmuję się aplikacją, w której różni klienci mają zupełnie inne ustawienia urządzeń – teraz, w przypadku problemów muszę uruchomić emulator, zmienić ustawienia, zrestartować emulator, utworzyć bazę danych odpowiednią do poczynionych zmian i na koniec dokonać transferu danych. Dopiero wtedy jestem wstanie rozpocząć diagnozowanie problemu. Oczywiście cała procedura zajmuje dobrych kilka minut. Fajnie by było np. zapisać sobie obraz tak skonfigurowanego emulatora w jakimś osobnym miejscu do późniejszego wykorzystania. Co ciekawsze jest to możliwe.

W ustawieniach Visual Studio w zakładce Devices - wybieramy obraz systemu, z którego chcemy skorzystać i klikamy ‘Save As…’.

Visual Studio Device Settings

Windows Mobile System Image Save As

Podajemy nazwę, pod jaką, nasz nowy system, będzie wyświetlany na liście Device Emulator Managera. Teraz tak spreparowany obraz systemu uruchamiamy instalujemy/konfigurujemy co trzeba i na koniec zapisujemy jego aktualny stan za pomocą ‘Save State and Exit’.

Device Emulator Manager

Nie GPhone a Android

listopad 16, 2007

Od jakiegoś czasu słychać było pogłoski o, GPhone, który jakoby miał być telefonem stworzonym przez Google’a. Google ani nie zaprzeczał ani potwierdzał plotek, co tylko budowało atmosferę tajemniczości wokół projektu i zachęcało do dalszych domniemywań. Koniec z końców nowy produkt ujrzał światło dzienne - nazywa się Android. Nie jest to jednak telefon, nie jest to nawet fizyczne urządzenie.
Android to nazwa nowej platformy mobilnej - składającej się z systemu operacyjnego dla urządzeń mobilnych i zestawu narzędzi programistycznych. System operacyjny oparty jest o jądro Linux’a, natomiast językiem programowania jest Java. Szczegółowe informacje można oczywiści znaleźć na stronie projektu. Młody jeszcze projekt wydaje się być dobrze przemyślany a SDK zorientowane na łatwość tworzenia aplikacji. Google umieściło w internecie poniższy filmik, obrazujący prostotę tworzenia aplikacji:

Na pewno nie zachwyci on developerów platformy .NET Compact Framework, gdyż nie oferuje chociażby graficznego interfejsu użytkownika, jednakże, w niedalekiej przyszłości, należy się spodziewać sporej liczby nowych narzędzi.
Podsumowując - Google rozpoczyna ekspansję, na obszary, w których aktualnie Microsoft jest dominującym graczem i teraz pytanie jak wielki kawałek rynku uda mi się pozyskać dla siebie? Należy pamiętać, że Windows Mobile i .NET Compact Framework, to nie wszystko, z czym przyjdzie się chłopakom z Google zmierzyć - kilka lat obecności MS na rynku urządzeń mobilnych zaowocowało doświadczeniem, umowami czy programami partnerskimi z producentami urządzeń jak i również imponującą liczbą aplikacji biznesowych.


Device Data Provisioning

październik 4, 2007

W poprzednim poście pisałem o mechanizmie data provisioning i byłem święcie przekonany, że jest on dostępny tylko w sytuacji gdy pracujemy z emulatorem i Visual Studio. Myliłem się. Otóż mechanizm ten jest powszechnie dostępny na urządzeniach z Windows Mobile. Najprostszym sposobem jego wykorzystania jest utworzenie pliku *.cpf (CAB Provisioning Format) który można ‘zainstalować’ na urządzeniu w taki sam sposób jak pliki *.cab.
Aby utworzyć plik *.cpf potrzebujemy narzędzia makecab.exe, można je znaleźć np. w Windows Mobile 6 SDK (w katalogu \Tools\CabWiz\). Kolejnym wymaganym elementem jest plik xml zawierający zmiany jakie chcemy wprowadzić w konfiguracji naszego urządzenia. Dla uproszczenia zastosujmy ten sam plik jaki zastosowałem w poprzednim poście, musimy jedynie zmienić jego nazwę na: _setup.xml. Mając co potrzebujemy z linii komend wpisujemy:

makecab.exe _setup.xml NaszeUstawienia.cpf

Możliwe jest również aplikowanie provisioning xml files’ z poziomu kodu zarządzanego, wystarczy, że dodamy referencje do Microsoft.WindowsMobile.Configuration i skorzystamy z klasy ConfigurationManager. Przykładowo:

System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.LoadXml(/* tutaj ładujemy zawartość naszego pliku xml */);
ConfigurationManager.ProcessConfiguration(xml, true);

Więcej na ten temat można poczytać tutaj.