LocaleNameToLCID for Windows Mobile
Ich musste heute aus einer Konfigurationsdatei eine Sprachinformation heraus parsen, welche die Sprache der Benutzeroberfläche angibt. Normalerweise benötigt man für sowas ja eine LCID, die Sprache war allerdings als Locale Name (Culture Name) angegeben, also sprich z.B. “de” für Deutsch.
Jetzt gibt es in Windows zwar die Funktion LocaleNameToLCID, diese ist aber erst auf dem Desktop Windows ab Windows Vista verfügbar (bzw. über eine backport-Library auch unter XP), jedoch nicht auf Windows Mobile. Folglich musste ich mir selbst eine simple derartige Funktion schreiben.
Der Code dafür befindet sich hier
Dump Tortoise SVN Passwords
Nach der Migration eines SVN-Repositorys habe ich festgestellt, dass ich leider eines der Passwörter eines Repositorys nicht mehr wusste. Ich hatte es allerdings in meinem lokalen TortoiseSVN gespeichert.
Glücklicherweise gibt es eine Möglichkeit, das Passwort wieder auszulesen.
Folgender Artikel erklärt, wie es geht:
http://stackoverflow.com/questions/3883129/extract-tortoisesvn-saved-password/4794471#4794471
Hier wird auch auf das Programm ” TortoiseSVN Password Decrypter” verwiesen, dies ist jedoch ein Programm, welches auf dem unsäglichne .NET Framework basiert und ist damit für mein System ungeeignet, welches ich von .NET Bloat freihalten möchte.
Ich habe daher beschlossen, die entsprechende Funktionalität selber nachzuprogrammieren. Dies gestaltet sich eigentlich sehr einfach, herausgekommen ist ein schönes, kleines C-Programm. Hier der Source:
http://code.dump.at/doku.php/dump/tscnpwdec.c
Falls jemand die kompilierte Verison will, einfach Kommentar hinterlassen, dann stelle ich sie ein.
Windows Mobile debugger memory exhaustion
Heute hatte ich ein interessantes Problem mit meiner Windows Mobile Applikation. ICh habe es durch fehlerhafte Programmierung geschafft, den Windows Mobile Debugger des Visual Studio 2005 zu crashen.
Das Problem war, dass ich eine Funktion in einer fremden Library mehrfach aufgerufen habe und diese Funktion hat jedesmal einen Thread gestartet. Dadurch habe ich eine riesige Menge Threads generiert. Pro Thread muss der Debugger natürlich Speicher reservieren, was dazu führt, dass ihm der Speicher irgendwann mal ausgeht, wenn da hunderte Threads starten und sich wieder beenden, vorher aber schon wieder neue Threads gestartet werden…
Interessanterweise führte das Ganze aber nicht zu einem OOM, sondern der Debugger stürzte irgendwann mal ab. Hierfür dürfte ein fehlender Check im Debugger-Code von C:\Programme\Microsoft Visual Studio 8\SmartDevices\Debugger\bin\eDE.dll schuld sein (und das trotz installiertem SP1). Der Crash tritt an folgender Stelle auf:
6EDC070E 83C0 08 ADD EAX,8 6EDC0711 3BC7 CMP EAX,EDI 6EDC0713 74 1C JE SHORT eDE.6EDC0731 6EDC0715 8B30 MOV ESI,DWORD PTR DS:[EAX]
EAX = 8, EDI = 0
Wir schließen daraus, dass EAX hier nicht auf 0 geprüft wird sondern nur der Wert auf Offset 8 der Struktur, was schulssendlich zu einem Crash führt. Ich hab das Ganze gefixt, indem ich das ADD EAX, 8 hinter den Check verschoben habe, sodass nun der Zeiger auf 0 gprüft wird (dafür aber der Wert auf Offset 8 nicht mehr). Dies bewirkte immerhin, dass der Debugger nicht mehr crasht, scheinbar ist also doch die Wahrscheinlichkeit höher, dass der Strukturzeiger fehlt:
6EDC070E 3BC7 CMP EAX,EDI 6EDC0710 74 1F JE SHORT eDE.6EDC0731 6EDC0712 83C0 08 ADD EAX,8
Falls also jemand einen Crash in eDE.dll beim Debuggen hat, kann er meinen Patch theoretisch ausprobieren, vielleicht hilft es ja was.
Speed up DecompressImageIndirect
Die Funktion DecompressImageIndirect der imgdecmp.dll kann unter Windows Mobile dazu verwendet werden, um z.B. JPG Bilder als Bitmap zu dekomprimieren.
Über die Funktionsweise dieser undokumentierten Funktion gab z.B. folgender Artikel auf unsupportedsoftware.com Auskunft:
http://www.unsupportedsoftware.com/products/dev/imgdecmp.htm
Leider ist die Seite zumindest derzeit offline (eventuell hat der Eigentümer die Domain nicht verlängert). Ich habe daher ein Backup der ImgDecMP.zip online gestellt, welche auch eine Anleitung zur Verwendung der Funktion beinhaltet.
Was mir aufgefallen ist, und was eventuell ganz interessant sein dürfte, ist, dass die Bibliothek bei jedem Dekomprimierungsvorgang 2 Bibliotheken nachlädt, sofern diese nicht geladen sind, und nach getanener Arbeit wieder entlädt. Dies ist zwar hinsichtlich Speicherverbrauch sehr löblich, birgt jedoch das Problem, dass die Dekomprimierung der Bilder eher langsam läuft. Benötigt man die Funktion also mehr als einmal, so kann es sich lohnen, besagte Bibliotheken beim Programmstart manuell zu laden und so im Speicher zu behalten. In der Initialisierungsphase der Applikation also folgendes laden:
LoadLibrary(_T("Imaging.dll"));
LoadLibrary(_T("zlib.dll"));
InitCommonControls() und seine Tücken
Unlängst hatte ich das Problem, dass ich ein Windows-Programm entwickelt habe, welches einige Common Controls verwendet. In alter (16bit) Gewohnheit habe ich die Common Controls mit dem Funktionsaufrauf InitCommonControls() initialisiert.
Mein Programm lief einwandfrei unter Windows XP, aber unter Windows 2000 bekam ich beim Laden eines Dialogs, welcher das SysDateTimePick32 Control nutzte, die Fehlermeldung: “Fensterklasse nicht gefunden”.
In der oben verlinkten Dokumentation zu InitCommonControls() steht bereits die Warnung, dass bei den Controls der Version 5 nur die ICC_WIN95_CLASSES initialisiert werden. In meiner alten MSDN-Version von 1998 war diese Warnung jedoch nicht enthalten.
Folgende Seite bietet eine schöne Aufschlüsselung, was in welcher Windows Version geladen wird:
Also: Wenn möglich, auf 32bit Windows immer InitCommonControlsEx() verwenden und nicht vergessen, die entsprechenden Flags richtig zu setzen.
pure-ftpd logfile Timestamp
Mir ist aufgefallen, dass Pure-ftpd <1.0.22 in seinen Logfiles auf einem unserer Produktivserver die Zeitstempel immer in UTC angegeben hat, statt in der lokalen Zeitzone.
Der Grund dafür dürfte sein, dass der Server über xinetd gestartet wurde und innerhalb des Environments keine Zeitzoneneinstellung zu lesen ist, da dieser chrooted ausgeführt wird und daher /etc/localtime nicht gelesen werden kann.
Hierzu habe ich eine Artikel in der Novell Knowledge Base unter der Nummer 7002717 gefunden.
Die Lösung besteht nun darin, das TZ-Environment beim Start über xinetd zu setzen. Hierzu muss man für meine Zeitzone dann folgende Zeile in der xinetd.d Konfigurationsdatei für ure-ftpd hinzufügen:
env = TZ=CET
Vielleicht hilft der Tip ja jemandem, der seinen pure-ftpd auch nciht so einfach updaten kann.
Embedded Visual C++ 4 Crash bei “Loading Class Information”
HEute habe ich den Pocket PC 2003 SDK installiert, daraufhin hat sich mein Embedded Visual C++ 4 beim LAden jedes Porjketes mit einem Crash verabschiedet, während unten in der Statusbar “Loading Class Information” stand. Dies war auch beim Erstellen neuer Projekte der Fall.
Im Internet fand ich ein paar Leute, die ähnliche Probleme hatten, aber deren Lösung war allesamt eine komplette Neuinstallation aller Windows CE Tools nach vorherigem Registry Cleanup usw., also viel zu aufwändig.
Natürlich musste ich das Ganze wieder zum Laufen bringen, also habe ich mir das Problem mit OllyDbg angesehen und habe so festgestellt, dass er scheinbar beim Parsen der verfügbaren Plattformen einen NULL-Zeiger referenziert.
Folglich habe ich mir in der Registry den Pfad HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Tools\Platform Manager angesehen und bin drauf gekommen, dass es dort den Schlüssel {6D5C6210-E14B-11D2-B72A-0000F8026CEE} gab, dessen Standard-Wert und Unterschlüssel alle leer waren.
Ich habe diesen Schlüssel daher entfernt, weil als Standardwert normalerweise der Name der Plattform stehen sollte (wenn nichts drinsteht ist es logischerweise NULL, was von eVC aber nicht geprüft wird). Und siehe da: eVC 4 funktioniert wieder!
Visual Studio Hänger beim Debuggen lässt GUI “einfrieren”
Ich habe ab und zu das merkwürdige Problem, dass beim Debuggen mit Visual Studio bei einem Breakpoint oder Crash in manchen Threads das ganze GUI-System quasi einfriert.
Alle Aktionen funktionieren nur noch sehr, sehr langsam und man kann Minuten lang warten, bis sich etwas tut.
Jemand dürfte dasselbe Problem gehabt haben und hat sich die Mühe gemacht, es zu debuggen:
virtualdub.org Blog
Schuld am einfrieren scheinen die erweiterten Textdienste mit einer globalen Mutex zu sein. Es wird daher emfpohlen, diese zu deaktivieren, da sie ja ohnehin keinen sonderlichen Nutzen bringen und eben auch zu diesem Hänger führen können:
Systemsteuerung/Regions- und Sprachoptionen/Sprachen/Details…./Erweitert/[x] Alle erweiterten Textdienste deaktivieren
Dann sollte endlich Ruhe sein.
Installation eines HighDefinition Audiotreibers unter windows XP SP3
Bekanntlich gibt es ja mit bestimmten High-Definition Audio Treibern Probleme unter Windows XP, wenn SP3 bereits in der InstallationsCD integriert ist. Grund dafür ist ein fehlender Patch, welcher bei SP2 dabei war, aber scheinbar in SP3 fehlt.
Nun kann man diesen aber bei schon ebstehenden SP3 nicht mehr so einfach nachinstallieren.
Hierfür gibt es eine einfache Lösung, die folgender Forumthread zeigt:
http://forums.majorgeeks.com/showpost.php?p=1231476&postcount=2
Prinzipiell ändert man einfach
HKLM\SYSTEM\CurrentControlSet\Control\Windows\CSDVersion value auf 200, installiert dann kb888111xpsp2.exe, und ändert den Wert anschließend wieder auf 300 zurück.
Symbian S60 Zertifikat erstellen
Die meiner Meinung nach einfachste Seite, auf welcher man ein Symbian S60 Zertifikat für sein Mobiltelefon erstellen kann, findet sich hier:
http://www.nokiaport.de/s60devcertgen.htm
Möchte man ein Zertifikat für den Emulator erstellen, als IMEI einfach 000000000000000 eingeben.
System programmer