Note 1 für den Support von Schaudin / RC-WinTrans

Seit Jahren benutzen wir RC-WinTrans von Schaudin.com für unsere die Multilinguale Unterstützung unserer Software.

Durch eine Änderung in VC-2019 16.3.3 wurden nun RC Dateien nicht mehr ANSI Codepage 1252 gespeichert sondern grundsätzlich als UTF-8 Dateien. D.h. alle RC Dateien, die nicht in UTF-8 oder UTF-16 vorliegen, werden zwangsweise in UTF-8 konvertiert.

Jetzt hatten wir ein Problem. Unsere Tools von Schaudin (RC-WinTrans) können kein UTF-8 in der von uns genutzten Version. Zuerst habe ich bei Microsoft einen Case zu öffnen, weil so ein erzwungenes Encoding ist für mich ein No-Go.

Eine Anfrage in Stackoverflow brachte keine Erkenntnis außer, das das Problem ist bereits bekannt unter mehreren Incidents
Link1, Link2, Link3

Also habe ich mich an den Support von Schaudin gewandt. Neuere Tools können zwar kein UFT-8 aber UTF-16 verarbeiten. Also müssen wir eben ein Update kaufen.
Nach einigen Emails hin und her bot mir Schaudin an, die nächste Version nach meiner (die auch UTF-16 unterstützt) kostenlos zu erhalten.

Ich bin etwas sprachlos! So etwas (kostenlos) auf die nächste Version, ist doch nicht so ganz üblich in unserer Welt.

Ich sage Danke und gebe der Firma Schaudin die Note 1 in Kulanz und Support.

Sicherheitsupdates von Microsoft führen zu Problemen mit dem ODBC Export nach Excel

Eigentlich habe ich nichts gegen Sicherheitsupdates. Genaugenommen bin ich ein Verfechter, dass Sicherheitsupdates sofort und umgehend installiert werden sollen.

Eigentlich ging das die letzten Jahre bei unserer Software ziemlich gut. Aber heute hat es uns voll erwischt. Dazu auf allen Plattformen von Windows 7, Windows 8.1 bis Windows 10.

Es kommt jetzt beim Anlegen einer Excel Datei über ODBC zu einer Fehlermeldung in der Form:

Reservierter Fehler (-5016); es gibt keine Meldung für diesen Fehler.
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Allgemeine Warnung Registrierungsschlüssel ‚Temporary (volatile) Jet DSN for process 0x2c44 Thread 0x37f4 DBC 0x5b84d54 Excel‘ kann nicht geöffnet werden.
Ungültiges Attribut für die Verbin

Aktuell kann ich die Ursache nur in den folgenden Windows Updates sehen:

Windows 7 KB4041681
Windows 8.1 KB40416393
Windows 10 KB4040724
KB4041676

Einen entsprechenden Anfrage an andere Entwickler habe ich über Stackoverflow gestellt.

Als exMVP oder rMVP hat man jedoch nicht mehr die schönen Kanäle von früher… <seufz/> 🙁

Ich frage mich, wie solche Fehler durch eine Qualitätskontrolle schlüpfen können…?

Fehler in ATLTHUNK.DLL führt auf Windows 10 (64bit) unter bestimmten Umständen zu zufälligen Crashes von Anwendungen

Wer es schnell mag, kann gleich den Beitrag und technische Details auf Stack Overflow lesen:
http://stackoverflow.com/questions/41741448/random-crashes-on-windows-10-64bit-with-atl-subclassing

Hier möchte ich etwas ausführlicher, die Story dazu erzählen, eine Story aus dem ganz „normalen“ Leben eines Programmierers 😉

Letztes Jahr stellen wir in der Firma produktiv von VC-2013 auf VC-2015 um. Wir haben eine relativ große Anwendung, die im Kern, MFC und ATL verwendet. Unsere Anwendung zeigt Informationen in vielen Tabs und Dialogen an. Mehr als 256 Fenster sind da keine Ausnahme und eher die Regel als eine Seltenheit.

Unsere Anwendung erzeugt bei Crashes automatisch volle Dumps auch bei Kunden. Für unsere Qualitätssicherung ein Muss und ein Segen.
Bereits in der Alpha und Beta Phase hatten wir auf manchen Rechnern ein eigentümliches Phänomen. Unser Programm startete und erzeugte Fenster und auf einmal kam es zu einem Absturz bei oft ganz einfachen Windows API Funktionen, die ein Fenster verwendeten und die alle ausnahmslos letzten Endes dazu führten, dass eine Nachricht an ein Fenster gesendet wird. Der Stack war nichtssagend und schien zerstört. Die Dumps für die einzelnen User waren aber fast immer glich.
Das Problem trat in Release und Debug Builds auf.

Der Horror für jeden Programmierer. Nicht nachzuvollziehende Crashes auf manchen Rechnern. Heapfehler? Wilder Zeiger? Buffer-Overrun? Nichts was man gebrauchen kann… aber kein Analysetool was wir verwendeten schlug Alarm…

Nach Sammlung von mehreren Dumps waren die Crashes immer wieder an ähnlichen Stellen und fast immer alle sofort nach Programmstart. Betroffen in der Regel alles Windows 10 64bit Maschinen auf dem aktuellen Softwarestand, meistens hatten diese Maschinen 8GB und zum Teil weitaus mehr Speichern und es waren ausnahmslos schnelle Intel i7 verschiedener Generationen. Und in virtuellen Maschinen konnte ich das bisher nicht nachvollziehen.

Interessant, war, dass ich diese Crashes auch auf meiner Entwicklungsmaschine hatte. Manchmal…
Nach einigen Tests konnte ich sagen. Entweder tritt der Fehler auf und solange der Rechner gestartet ist kann man es manchmal nachvollziehen, oder der Fehler tritt eben nicht auf und man hat Ruhe vor ihm. Dann hatte ich mir 3 Tage hintereinander – ohne Rechnerneustart – mit Debug-Session auf Debug-Session eine Spur erarbeitet. Es war immer das 257 Fenster, dass gesubclassed wurde (mit ATL Thunking) oder erzeugt wurde (ATL Fenster), dass zum Crash führte.
Insofern war es bei jedem User auch immer ein ähnlicher Dump, weil der Fensteraufbau ja bei jedem User individuell war.

Am Ende des dritten Tages hatte ich einen Testcode, der den Fehler in der aktuellen Windows Session meines Rechners und meinen Programm zu 100% nachvollziehbar machte. Ich verschob den Testcode immer weiter in einem Programm nach vorne, bis ich bei InitInstance ankam.
Ups. Es liegt nicht an meiner Software.
Dann isolierte ich den Testcode in eine eigenes Programm und konnte den Bug in einem minimalen Sample nachstellen.

Zeit für einen Support-Case bei Microsoft und eine Anfrage auf stackoverflow.com (das war am 19.01.2017).

Mit dem Case hatte ich natürlich auch einen Workaround. Ich musste nur einfach die atlthunk.dll nicht benutzen und auch das ging mit einer einfachen Änderung in der atlstdthunk.h. (Auskommentieren des defines USE_ATL_THUNK2).

Die Kommunikation mit Microsoft gestaltete sich nicht einfach. Aber ich hatte zumindest einen konstruktiven MS Mitarbeiter aus Indien erwischt. Dumps konnte ich Microsoft liefern, auch den Crash direkt in einer Session zeigen. Code hatten sie auch, aber der Bug war bisher nicht bei Ihnen nachvollziehbar. Das trieb mich fast in die Verzweiflung. Natürlich musste alles andere ausgeschlossen werden.. Virenscanner, andere Software… etc…
Dennoch kein Repro auf eine Microsoft Maschine. Allerdings weiß ich nicht wie „intensiv“ da gesucht wurde.

Dann endlich ein Lichtblick auf stackoverflow.com. Eugene konnte den Bug nachvollziehen. Endlich.
Und nachdem ich wusste, dass es mit der bevorzugten Ladeadresse zu tun hatte, konnte ich auch meinen Code erweitern und mit 100% Wahrscheinlichkeit den Crash erzeugen.
Wenn also an der bisher bevorzugten Ladeadresse der atlthunk.dll kein Speicher zur Verfügung liegt und sofort wieder eine Relocation notwendig wird, dann kracht es. Lustig, da wir ja durch ASLR sowieso keine festen Ladeadressen haben, aber es gibt innerhalb einer Windows Session dennoch eine „bevorzugte Ladeadresse“.

Jetzt bin ich gespannt auf Microsoft…
Denn defakto kann jede Software die mit dem VC-2015 und VC-2017 Compiler und der ATL kompiliert wurde von diesem Problem betroffen sein.

PS: Man entschuldige mir Ungenauigkeiten oder auch falsche Begrifflichkeiten…
Bis heute habe ich den Fehler immer noch nicht ganz verstanden und ganz sooo tief lebe ich im Kernel von Windows doch nicht. 😀

PPS: Ich werden den Artikel auf stackoverflow.com aktuell halten.

Nachtrag 01.03.2017:

  • Microsoft hat bestätigt, dass es sich um um einen Bug handelt.
  • Der Bug soll in der nächsten Windows 10 Version (RS2) gefixed sein.
  • Nachteil: Ich werde wohl mit der Änderung der ATL leben müssen, denn auch andere Windows Versionen sind von diesem Fehler betroffen.

Universal CRT auf Windows 7, Vista und Windows 8.0/8.1 wird über Windows Update ausgerollt

Eine „Spaßbremse“ Software mit Visual Studio 2015 auszuliefern war bisher in jedem Fall das Universal CRT.

Im Speedproject.de Blog ist davon auch einiges zu lesen gewesen:
Noch kein Umstieg auf VS-2015
Anwendungslokaler Einsatz der Universal CRT
Visual Studio 2015 und die Universal CRT

Dieses Paket musste man zusätzlich mit installieren auf allen Systemen die Windows 7, Vista oder Windows 8.x verwendet haben. Die Probleme und das Nachfragen von Entwicklern hat nun Wirkung gezeigt.
Microsoft veröffentlicht den KB2999226 über Windows Update. Damit entfällt das Ausrollen mit dem eigenen Setup.

angeboten bzw. installiert wurde.

Danke für den Hinweis an Michael Külshammer. (siehe auch dotnetpro)

Nachtrag:
Bei mir erscheint jetzt auf meinen Windows 7 Rechner das entsprechende Update als optionales Update
KB2999226

C/C++ Coding Best Practices Repository

Best Practices ist das nach dem wir oft suchen wenn neue Standards neue Methoden eröffnen und ganz besonders, wenn man sich mit einer Programmiersprache weiterentwickeln will.

Wir lesen Bücher von Scott Meyers, Bjarne Stroustrup, Nicolai Josuttis und nicht wenige von uns tummeln sich in Blogs studieren und nutzen fremden Code und Libraries. Alles das erweitert unseren „Programmierhorizont“.

Einige C++ Programmierer werden CppDepends kennen. Ein Tool von CodeGears, dass ich auch schon vorgestellt habe.
Die Firma hat eine neue Seite mit dem Titel C/C++ Coding Best Practices Repository . Die Idee ist „gute“ C++ Praktiken zu benennen, zu klassifizieren und zu bewerten. Und das macht in diesem Fall nicht ein Autor, sondern die Community. Wobei eben die Community die Regeln, die eingebracht werden bewerten und aus diesem Scoring könnten sich vielleicht ein paar wertvolle Bausteine heraus kristallisieren.

Solche Projekte können natürlich nur funktionieren, wenn genügend Leute mitmachen. Und da die Idee nicht schlecht ist mache ich hier mal etwas Werbung dafür.

 

Ein kleiner Doppelschlag: RTM für VisualStudio 2015 und VisualStudio Update 5

Heute haben zwei neue VisualStudio Versionen das Licht des RTM erblickt 😉

VisualStudio 2015 ist verfügbar und zeitgleich wurde auch VisualStudio 2013 Update 5 veröffentlicht.

Achtung: Wer als Sprache Deutsch angegeben hat, der bekommt aktuell (Stand 21.07.2015) noch die RC-Seite auf der deutschen Microsoft Seite angezeigt. Die englische Seite zeigt den RTM Artikel.

PS: Einzig vermisse ich noch die MBCS Bibliotheken für den RTM. Als RC waren sie verfügbar und der aktuelle Link auf den Microsoft Seiten funktioniert nicht. Auch wenn ich die nur für ein einziges Legacy Programm noch nutze.

Die MFC ist seit der Veröffentlichung der Community Edition von VS-2013 auch kostenlos verfügbar

Seit dem Erscheinen der ersten VC++ Express Version haben sich viele Entwickler gefragt, warum weder ATL noch MFC hier verfügbar waren.
Das hat sich nun seit der Existenz der VS-2013 Community Edition geändert.

Sowohl die Visual Studio 2013 Community Edition als auch die bereits veröffentlichte Visual Studio 2015 RC Community Edition enthält sowohl die ATL als auch die MFC. D.h. auch, dass es damit einfacher wird für nicht kommerzielle Entwickler die entsprechenden Libraries zu verwenden.

Das ist auch endlich ein Durchbruch, der von der MVP-Community seit dem erscheinen der aller ersten Express Version angemahnt und gefordert wurde.

Die aktuellen Downloads finden sich hier:
http://www.visualstudio.com/de-de/downloads/download-visual-studio-vs.aspx
http://www.visualstudio.com/en-us/products/vs-2015-product-editions.aspx

Bei der Installation der VS-2015 Community Edition muss man allerdings darauf achten die MFC mit auszuwählen. In der Standardinstallation wird diese nicht hinzugefügt. In der VS-2013 Version wird die MFC automatisch mit installiert.

Nur zur Info:
Die Community Edition ersetzt in Zukunft die Express Versionen. Zudem werden alle Express Editionen in einem Visual Studio Paket zusammen geschnürt. Der Vorteil ist groß. Addons werden verfügbar, für die breite Maße. Opensource Projekte, die die MFC und ATL verwenden stehen nun jedermann zur Verfügung. Weitere Infos finden sich auch hier.
Die Lizenzbedingungen der Commuinity Edition sollte man unbedingt lesen, wenn man die Version auch kommerziell nutzen möchte.

PS: Diese Pakete existieren bereits seit November 2014 aber mir ist diese Info bisher entgangen. Sorry…

VS-2015 RC ist verfügbar – ein kurzer Einblick aus der C++ Sicht

Seit den letzten Tagen des April ist nun auch der Release Candidate für VS_2015 verfügbar.
http://www.visualstudio.com/en-us/news/vs2015-vs.aspx

Die Liste ist lang. Was sich für C++ Neues ergibt dagegen doch recht übersichtlich. 😉

Hier ein paar Punkte, die ein erster Test und Streifzug ergab:

  • Man sollte in jedem Fall die angepasste Installation verwenden. Ansonsten wird der MFC Sourcecode nicht mit installiert (siehe auch Kommentar von Michael Külshammer)
  • „Fast“ alle Projekte ließen sich fehlerfrei kompilieren. Es gab zwar einen Haufen neuer Warnungen aber, diese haben eher mit dem Stil des Programmierens zu tun. Speziell sind es C4456, C4457, C4458 (Declaration off… hides previous …  declaration). Im Klartext. Ich verwende immer mal wieder eine Variable it oder i gerne, die auch im äußeren Scope vorhanden ist.
    Für diese neuen Warnings gibt es allerdings bisher keine Dokumentation.
  • Und eben die typischen Fallen in denen man eben thirdparty Libs (z.B. OpenSSL) eben neu erzeugen muss.
  • Leider benötige ich für ein spezielles Update Programm noch die MBCS Variante der MFC. Diese ist zwar über das Netz als Link bei MS vorhanden, führt aber zu einer 404 Sackgasse. (Dieses Programm benutzt extrem alten Code, bei denen noch niemand an char/wchar_t bzgl. der Windows API und anderes dachte und Neuschreiben hatte ich bisher vermieden. 🙂 )
  • Nervig war eine „neue“ Compilermeldungen C1041, aber diese ist nirgendwo beschrieben (wie auch andere nicht). Online jedenfalls nicht. Ich bekam den Hinweis, dass eine PDB Datei nicht geschrieben werden kann und ich bitte die Option /FS verwenden soll. Die Ursache ist mir unklar, weil bei späteren Kompilierungsversuchen das Ganze durchlief.
  • Etwas länger musste ich für den folgenden Fehler suchen:
     (odbccp32.lib(dllload.obj) : error LNK2019: unresolved external symbol _vsnwprintf_s referenced in function StringCchPrintfW).
    Hier scheint noch etwas mit dem SDK auch in der Release Version nicht zu passen. Auf connect.microsoft.com fand ich einen entsprechenden Eintrag um diesen Fehler zu umgehen. Scheinbar ist das neue „korrigierte“ SDK, dass in der Lösung versprochen wird im RC noch nicht enthalten.
  • Vieles in der UI hat sich geändert. So werden zum Beispiel die Breakpoint mit einem eigenen Kontexttoolbar angezeigt und benutzt man diesen dann werden die Einstellungen nicht in einem Dialog angepasst, sondern innerhalb des Sourcecode Fensters wird am unteren Rand ein Box für die Eigenschaften geöffnet. Das ist definitiv gewöhnungsbedürftig. Und nur mit der Maus zu bedienen.
  • Im MFC Sourcecode findet sich nur eine neue Header-Datei afxlayout.h. In dieser Headerdatei findet sich die Deklaration für die Klasse CMFCDynamicLayout. Diese Klasse wird direkt in CWnd als Zeiger verwendet und erlaubt die Neupositionierung von Kindfenstern damit für alle Fenstertypen. D.h. nicht nur Dialoge. D.h. man kann in jedem MFC-Fenster EnableDynamicLayout ausführen und entsprechend die Kindfenster neu anordnen lasen wie man es selber definiert.
    Die Implementierung schließt scheinbar die Nutzung des Ressourceneditors ein, denn die Einstellungen können aus dem Ressourcentyp RT_DIALOG_LAYOUT ausgelesen werden. In den Fenstereigenschaften eines Controls findet sich nun der Abschnitt Dynamic Layout in dem man Position und Größe in Prozent zur Gesamtänderung angeben kann.
  • Wer die Header genauer untersucht findet klitze kleine Änderungen Hier und Da wie z.B. die Unterstützung von runden Ecken bei Tooltipps.
  • In der ATL konnte ich bisher keine Erweiterungen und gravierende Änderungen finden.
  • Die meisten Änderungen im ATL und MFC sind Änderungen im Trace Code. Statt „%s“ wird nun konsequent „%Ts“ als Formatierungszeichen verwendet. Angekündigt war eine grundsätzliche Änderung bzgl. „Wide String Format Specifiers“ allerdings wurde diese bereits im April zurückgezogen (siehe hier).
  • Vermisst habe ich einige CRT Source Dateien, die normalerweise im VC\CRT\SRC Order liegen. Der Ordner war in meiner Installation leer und enthielt nur weitere Ordner.
    Mir war es auch nicht möglich beim Testen in den CRT Code zu steppen. Zumindest bei mir wurden keine passenden Source Dateien gefunden.
  • Mit den CRT-DLLs werde ich mich ab morgen mal befassen. Auch hier hat Michael Külshammer gerade eben einen Beitrag in meinem Blog geschrieben.

Summa summarum nur minimale Anpassungen in meinen Projekten für den Umstieg von VS-2013 auf VS-2015, darüber hinaus so gut wie keine (erkennbaren) Änderungen in der CRT/ALT und MFC. Was es an neuen Compiler Features gibt findet man in den Blogs ausführlicher beschrieben als ich das kann. Zudem halte ich mich nicht für den großen C++ Sprachen-und-Standard-Guru.

 

Advanced Developers Conference zu native C++ in München Erding vom 05.-06. Mai

Die Konferenz wird unter dem Thema Doing C++ The Right Way stehen. Bernd Marquardt wird als Content Manager mit für den Inhalt verantwortlich sein.

Da die Agenda noch nicht sehr voll ist, bin ich auf die endgültige Themenauswahl doch gespannt. C++11 ist ja fast schon ein alter Hut und Parallelisierung wird auch schon etwas langweilig. 😉 Es stehen zumindest altbekannte Namen auf der Rednerliste.

Veranstalter ist die ppedv AG (hinter der Johannes Preishuber steht). Ich habe die Konferenzen der letzten Jahre, an denen ich teilgenommen habe, immer in guter Erinnerung. Sowohl in der Auswahl der Themen und Redner, als auch in der exzellenten Durchführung, mit immer sehr schon gewählten Konferenzorten und Hotels. Letztes Jahr hätten es ein paar mehr Leute sein können, aber das zeitgleiche Champions-League Spiel in München hat doch vielen einen Strich durch die Rechnung gemacht, weil es keine freien Hotelzimmer mehr gab.

Ich denke die Konferenz lohnt sich sicherlich.
Und ganz gespannt bin ich persönlich auf die Abendveranstaltung am Mittwoch, denn hier wird auf den ADC-Konferenzen den Teilnehmern immer etwas wirklich außergewöhnliches geboten und auch diesmal wird wieder zu etwas „Speziellem“ eingeladen. Letztes Jahr das Essen in der Flugwerft Schleißheim war schon etwas besonderes.

Ich freue mich auch dieses Jahr wieder dabei sein zu können; alte Kontakte beleben zu können, neue Entwickler kennen zu lernen und Neues aus der C++ Welt zu hören.

ADC