#UWP, #UWPDEV, enterprise, Windows 10 Mobile, Windows Mobile

Windows 10 Mobile Enterprise Upgrade

The other day I was in the need to test something on Windows 10 Mobile Enterprise. If you are an MSDN Subscriber, there is a License file available to download.

The next step was to find out what to do with this file. Searching the web, I found this Italian Blogpost and with the help of a translation tool I was able to follow the steps.

You basically just need to package that file with a specific provisioning package which can be created with the Windows Imaging and Configuration Designer tool. This tool is part of the Windows Assessment and Deployment Kit (ADK) which can be downloaded for free.

When you launch the Windows Imaging and Configuration Designer (ICD) select “New provisioning package” and give it a name. Select “Common to all Windows mobile editions” and skip the import option in the next step.

Now under “Runtime setting” expand “EditionUpgrade”, select “UpgradeEditionWithLicense” and Browse for the MSDN License file.

WIC

That’s all, the package can now be exported. Select “Export” and “Provisioning package”. You can keep the default values for the Description and Security settings. Finally hit “Build” and the package will be created in the output folder.

Now you just need to copy the PPKG file to your USB connected phone which will prompt you directly to add the provisioning package to its settings. Welcome to Windows 10 Mobile Enterprise.

– Patrick

localization, windows phone, wp7dev, wpdev

In the Spirit of Open Source…

I have been asked multiple times to Open Source my Localization Tool and I always wanted to do so. But somehow I did not find the time for Code Cleanup, setting up Github and so on. Even now I´m not Open sourcing it directly and I don´t even know if that would be helpful to anybody. But I´m showing you parts of the Code and explain how it works.

2015-12-23

What this Tool does in the first step is to take some Strings and translate them to a bunch of languages. I never updated the Tool to the latest Windows Phone Versions so some supported languages are not in the Tool.

I use the Microsoft Translator Online Service with its SOAP API for the translation process. All you need is to register your Application to get an authorized AppID to access the Online Service. The API itself is very simple, especially in the use case of our little Tool.

I just call something like:

string strTranslated = translator.Translate(“APPID“, textBoxEnglish1.Text, “en“, “de“);
textBoxGerman1.Text = strTranslated;
strTranslated = translator.Translate(“APPID“, textBoxEnglish2.Text, “en“, “de“);
textBoxGerman2.Text = strTranslated;

Imagine that repeated for all other available languages. The Online Translator Services supports a lot of the languages but not all. So i just copied the English Text to those Text fields directly.

That´s all I had to do for the basic translation and this was already the complete first step in the tool. The next step was up to the user who now could freely edit the strings and fine tune the translation. The next and final Step was to Save those strings to the corresponding resource DLLs. That was the more complex part but it used very old and long existing technics and APIs. To be honest I just grabbed some sample Code from MSDN and adjusted it to my needs.

The download of the Tool contained already an AppResLib.dll.  What I now had to do was to copy that DLL to a new file with a language ID and MUI extension.

That looked like:

//Neutral
System.IO.File.Copy(Application.StartupPath + “\\DLLs\\AppResLib.dll“, fbd.SelectedPath + “\\AppResLib.dll“, true);
//EN-US
System.IO.File.Copy(Application.StartupPath + “\\DLLs\\AppResLib.dll“, fbd.SelectedPath + “\\AppResLib.dll.0409.mui“, true);
//EN-UK
System.IO.File.Copy(Application.StartupPath + “\\DLLs\\AppResLib.dll“, fbd.SelectedPath + “\\AppResLib.dll.0809.mui“, true);

After that happened for all languages I only had to replace both String resources within those DLLs with the translated strings from the UI fields. I therefore created a native C++ DLL that exported two functions:

UpdateAppTitle & UpdateAppTitleString

I just include one of those functions for example here and explain it. The second function is more or less the same. Only the padding where to put the string is different.

That´s how the function looks:

WP7DLLUPDATERDLL_API int UpdateAppTitle(LPCWSTR strDLL,LPCWSTR strString)
{
HANDLE hUpdateRes = NULL;
BOOL result = FALSE;
LPVOID    pRes;
DWORD dwBlockSize = 16*sizeof(WCHAR);
DWORD dwReturn = 0;

hUpdateRes = BeginUpdateResource(strDLL, FALSE);
if(hUpdateRes != NULL)
{
dwBlockSize += wcslen(strString)*sizeof(WCHAR);
pRes = malloc(dwBlockSize);
WCHAR*    pParse = (WCHAR *)pRes;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
int nLen = 0;
*pParse++ = nLen = wcslen(strString);
for(int i = 0;i<nLen;i++)
*pParse++ = strString[i];
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;
*pParse++ = 0;

if(UpdateResource(hUpdateRes,RT_STRING,MAKEINTRESOURCE(7), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),pRes,dwBlockSize))
{
if(EndUpdateResource(hUpdateRes, FALSE))
dwReturn = 0;
else
dwReturn = GetLastError();
}
else
dwReturn = GetLastError();
}
else
dwReturn = GetLastError();
return dwReturn;
}

The function takes the String that has to be replaced and the DLL where it has to be replaced as a parameter and uses the UpdateResource API to do the actual work. Very easy and not complex even if the above code looks strange at first.  But how does it work in detail?

String resources in native DLLs come in Blocks containing 16 Strings. We need to update the string with the ID 100 for the App Title.  As those String (Or resource) IDs begin with 1 we need to Update the fifth string in the seventh Block. That is what those “*pParse++ = 0;” do. Set the string to 0. For the fifth string we first write the length of the string and afterwards the string itself to the Memory containing the Ressource Block. Within the UpdateResource API call we tell the API which Block to update . That´s the “MAKEINTRESOURCE(7)” parameter. After the call to EndUpdateResource the DLL contains the new string and based on the filename it can be used for the App Tile Strings. Interestingly this works just fine with the DLL Resource language set to English (US). It just depends on Filenaming conventions.

– Patrick

Allgemein

Windows Phone Week – Slides

Lieber spät als nie, aber wer die Slides zu meinen Sessions Near Field Communication und Design Time Data noch einmal lesen möchte kann die Slides hier herunterladen.

Eine nette Zusammenfassung der Veranstaltung findet sich hier: http://windowsdeveloper.de/artikel/Windows-Phone-weltweit-168472

Ich hoffe die durchaus positive Berichterstattung basiert nicht allein auf dem gewonnenen Lumia 1020 :-)

– Patrick

PS: Wer die Idee mit dem Flugmodus TAG für die Nacht aufgreifen möchte, hier findet sich die passende App dazu:

http://www.windowsphone.com/s?appid=e9388eac-6a37-4056-96ac-fe07653e398c

App Hub, Dev Center, Marketplace, Windows Phone 7, wp7dev, wpdev

“Update selected” oder “Add new”

Im neuen Dev Center hat sich einiges gegenüber dem bisherigen App Hub Portal geändert. Es werden jetzt eine ganze Menge mehr Optionen geboten und viele Aufgaben lassen sich jetzt  schneller oder erst überhaupt durchführen. Eine etwas verwirrende neue Funktion findet sich im Update Bereich wieder, wenn man seine App aktualisieren möchte. An der Stelle wo man das XAP Paket bereitstellt findet man nun mehrere Menüpunkte:

Wo ist nun also der Unterschied zwischen „Update selected“ und „Add new“? „Update selected“ entspricht dem bisherigen Verfahren zur Aktualisierung eines XAP Files. Also neue Version hochladen, Test abwarten und publizieren. Alles wie gehabt. Die Funktion „Add new“ erlaubt es jetzt aber ein zusätzliches XAP File hochzuladen, welches zwar die gleich App beinhaltet, sich aber von dem anderen XAP File unterscheiden kann (sogar muss). Wozu ist das jedoch gut?

Ganz einfach, man kann nun mit ein und derselben App (Im Dev Center, aber auch für den Anwender) unterschiedliche Betriebssysteme, Hardwaretypen oder Sprachvarianten unterstützen.

So kann man beispielsweise ein XAP File für Windows Phone 7.0 beibehalten, aber gleichzeitig auch ein Update für Windows Phone 7.5 Anwender bereitstellen.

Ein weiteres Beispiel wäre die Verwendung der Frontkamera, bei der es sich um optionale Hardware handelt.

Oder aber die Unterstützung anderer Sprachen die gegebenenfalls eine andere  Schreibrichtung benötigen, und somit ein anderes UI Design erfordern können.

Sobald die Publizierung wieder läuft werde ich die Funktion mal austesten.

– Patrick

Allgemein, Tips & Tricks, wp7dev, wpdev

Fehlende Capabilities: Copy & Paste

Öffnet man ein Projekt indem keine Capabilities in der WMAppManifest vorhanden sind erhält man unter Umständen zur Begrüßung oder bei einem Upgrade auf Windows Phone 7.1 folgende Meldung:

Wer jetzt einen Screenshot davon erstellt und später fleißig abtippt kennt anscheinend eine grundlegende Funktion einer MessageBox nicht. Copy & Paste Unterstützung. Einfach STRG+C drücken und schon kann man den Inhalt der Meldung woanders per STRG+V wieder einfügen.

Hätte ich für jeden Screenshot einer MessageBox (Im Regelfall der ganze Desktop, eingebettet in ein WORD Dokument) den ich per Mail bekommen habe einen €uro erhalten, könnte ich eine ganze Armee von Ghostwritern für diesen Blog beschäftigen :-).

– Patrick