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.

 

Der Eisenbahnerstreik trifft auch mich…

Ich habe mich entscheiden aufgrund des Eisenbahnerstreiks nicht nach Erding auf die ADC++ zu fahren. 🙁

Auto kam nicht in Frage und eine so ungewisse Rückfahrt am Mittwoch Abend wollte ich mir nicht antun.

Nachtrag:
Ich kann mir nicht verkneifen noch meine Meinung abzugeben. Streikrecht finde ich gut, aber wenn es hauptsächlich nur noch darum geht wer unter den Gewerkschaften das Sagen hat und sich zwei Gewerkschaften mit unterschiedlichen Zeilen in einem Betrieb streiten hört der Spaß auf.
Und wie ich die letzten Berichte verstanden habe, kriegt die GDL einfach nicht den Hals voll und will immer alles alleine bestimmen. Und dass die Bahn eben nur einen Tarif möchte mit zwei Gewerkschaften ist nur zu verständlich.
Ich mag falsch liegen, bin aber sauer, da bei jedem 2 von 3 Streiks bisher eines unserer Familienmitglieder massiv durch die Streiks betroffen wurde und ich den Sinn bei der GDL nicht mehr verstehen kann… Mir kommt es vor wie bei einem kleinen Kind im Sandkasten: „Der Bagger ist aber mir alleine…“

Das ewige Leid mit ausländischen Bestellungen und Rechnungen…

Es war mal wieder soweit und ich musste bei Adobe (eigentlich keine kleine Firma) ein Update bestellen.
Dank Firmenkreditkarte war das kein Problem. Und so fing das Leid an:

20.03.2015 –
Ich bestelle ein Update eines typischen Adobe-Tools. Ich gehe den Bestellvorgang durch und schwupps ist der Kauf getätigt.
Alles super. Aber ach… 🙁 ein paar Stunden später kommt die Rechnung und die stimmt nicht. Ich denke ich kaufe bei Adobe-Deutschland, aber dem war nicht so. Ich bekomme das Produkt aus Irland und scheinbar war in meinem Adobe Konto keine Umsatzsteuer ID enthalten. 😳 Mea culpa, mea maxima culpa…
Ich geistere durch mein Konto bei Adobe, kann aber die verfluchte Stelle nicht finden wo die Umsatzsteuer ID einzutragen ist.
Ein Anruf bei der Hotline ergab, dass ich am Besten die Bestellung storniere. Bei der Gelegenheit hat der gute Mann an der Hotline auch die gültige Umsatzsteuer Id eingetragen.

23.03.2015-
Ich habe nun Aufgrund der Empfehlung der Hotline die Bestellung storniert. Natürlich ist die Kreditkarte schon belastet. Nochmal bei der Hotline angerufen und wirklich geklärt, dass eine Umsatzsteuer ID eingetragen ist.
Jetzt wurde eine neue Bestellung aufgegeben. Betrag stimmt schon mal in der Anzeige, aber das hatten wir schon.
Ein paar Stunden später die Überraschung. 😯 Die Rechnung weist die Mehrwertsteuer schon wieder aus, unsere Umsatzsteuer ID steht nicht auf der Rechnung. Wie kann das sein? Und noch besser: Eigentlich ist die Umsatzsteuer in Irland 21%. Die Rechnung zeigt aber 19% Mehrwertsteuer… jetzt ist es aber ganz wild.
Anruf bei der Hotline. Der kann sich das nicht erklären. Die Bestellung ist richtig. Die Umsatzsteuer ID ist eingetragen! Und noch besser: die Kreditkarte wurde nur mit dem Betrag ohne Mehrwertsteuer belastet. Gibt es so was?
Die Fakten in kürze: Rechnung falsch mit deutscher Mehrwertsteuer, Rechnung kommt aus Irland und trotz angegebener Umsatzsteuer ID steht da eine MwSt. Aber bezahlt habe ich die nicht… Ich werde vertröstet. Der Vorgang liegt nun bei der Fachabteilung.

27.03.2015 –
Die Stornierung der ersten Bestellung wurde akzeptiert. Wenigstens schon mal was 😉

29.03.2015 –
Wow. Nach 9 Tagen habe ich wenigstens das Geld für die erste Bestellung zurück.

05.04.2015 –
Meine Buchhaltung wird sauer und möchte eine Rechnung haben. Ich gebe den Vorgang soweit ich ihn habe inkl. falscher Rechnungen weiter.

18.04.2015 –
JAAAA! Eine Reaktion. Ich bekomme eine Email. Betreff meine Bestellung. Anhang: Eine PDF mit mir bereits bekannten FALSCHEN Rechnung. Auch hier 19% Steuer (statt irländischer 21%), die aber wegen Angabe der Umsatzsteuer ID nicht da stehen dürfte… 😡
Kein Text, keine Signatur nichts! Eigentlich eine Frechheit.
Kommt jetzt auch noch eine Kartennachberechnung… oder was? 🙁

23.04.2015 –
Die Buchhaltung setzt sich mit Adobe wieder in Verbindung. Der Man von der Hotline ist wieder nett und sieht den ganzen Vorgang. Er kann aber nichts machen.
Kurze Zeit später erhalte ich wieder eine Bestätigung, dass mein Vorgang an die entsprechende Fachabteilung weitergereicht wurde. Hatten wir das nicht schon vor 1 Monat.

Mittlerweile Frage ich mich, an wen man sich eigentlich wenden kann, wenn eine Firma eine definitiv falsche Rechnung ausstellt. Laut Auskunft meiner Buchhaltung müsste man ja diesen Betrag verbuchen, denn die Rechnung weißt diesen ja aus. Aber abgebucht wurde ein anderer Betrag. Also haben wir nun Schwarzgeld in der Kasse? 🙂 OK ich bin kein Buchhalter und das ist gut so…

Mein Urteil über Adobe? Am Besten fragt mich keiner…

23.05.2015 – DAS ENDE!
Nach nochmaliger Nachfrage bekam ich eine Email mit einer korrekten Rechnung. Kein Text keine Anrede, keine Entschuldigung.Gar nichts.
Egal. Ich habe meine Rechnung.

Stark verzögertes Öffnen von Projekten in Visual Studio 2013

In der letzten Zeit hatte ich immer mal wieder so einen komischen Effekt, dass ich VS-2013 gestartet habe und beim Öffnen einer Solution auf einmal nur noch die Eieruhr (Blue Circle of Death) zu sehen war. In der Anzeige stand meisten das irgend ein Projekt N vom M zu laden wäre. 🙁
Als mir das das erste mal passierte habe ich oft den Visual Studio Prozess brachial beendet, neu gestartet und dann ging es oft. Aber nicht immer. Wenn ich lang genug gewartet hatte wurde letzten Endes die Projekte immer geladen.

Weil mich das irgendwann nervte habe ich mal versucht Visual Studio selbst zu debuggen. Die Threads die aktiv waren, hatten immer was mit dem Team Foundation Server zu tun. Bald merkte ich, dass lokale Projekte nie betroffen waren sondern immer nur Solutions, die auch auf unserem zentralen TFS Server lagen.

Der nächste Schritt 💡 war dann beim nächsten Hänger mal die Firewall und den Netzwerkschutz abzuschalten. Wir verwenden hier seit Jahren Symantec Endpoint Protection (aktuell 12.1 RU5). Bingo !!! 🙂 Kaum, dass ich die Firewall abgeschaltet hatte lief, das Laden des Projektes sofort durch.

Entsprechend haben wir in den Firewall Einstellungen für Visual Studio jetzt eine Ausnahme Regel definiert und seit dem keine Probleme mehr. :mrgreen:

 

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

 

Wenn man nicht genau aufpasst mit Overlapped I/O und CancelIo vergisst

Overlapped I/O ist eine Standardtechnik, die ja jeder kennt, der mit Datenquellen arbeitet, die „irgendwann“ mal Informationen liefert, man aber in der Zeit evtl. noch anderes zu tun hat 😉

In meinem Fall, den ich hier schildere, benutzte unser Programm einen Service, mit dem es über Named Pipes kommuniziert. Das entsprechende Modul, ist schon ziemlich alt und hat seit ca. 3 Jahren keine Änderung erfahren. Aber jetzt auf einmal häuften sich Meldungen, dass unser Programm beim Beenden einen UAE auslöst.

Entsprechende Minidumps wurden angefordert und deren Analyse zeigte eigentlich nicht viel wirklich erhellendes.  Es sah alles danach aus, als ob ein Speicherblock freigegeben wird, der bereits freigegeben wurde.
Leider konnte das Szenario in unserem Testfeld nicht einfach nachgestellt werden. Und auch mehrfache Analyse des Sourcecodes brachte erst einmal nichts. Man ist manchmal einfach betriebsblind 🙁

Auffällig war aber, dass diese Meldungen erst vereinzelt auftraten nachdem unsere Software auf VS-2013 Update 3 umgestellt war und diese an Kunden ausgerollt wurde. Und weiterhin konnten wir feststellen, dass alle diejenigen, die diesen Fehler gemeldet haben, relativ leistungsfähige Rechner hatten.

Schließlich gelang es mir, das Szenario auf einem meiner Entwicklungsrechner nachzustellen.

Das passierte:

  1. Das Programm erhielt den Befehl zum Beenden.
  2. Irgendwann wurde auch dem Thread, der mit dem Service interagiert gesagt, dass er sich beim Dienst ausloggen soll.
  3. Der Dienst gibt auch brav den Befehl „Logoff“ an den Service.
  4. Der Thread der in einer Schleife immer auf einen Response des Dienstes wartet beendet sofort.
  5. Und nun erfolgte der Crash.

Die Ursache war ein fehlender CancelIo. Damit das Beenden möglichst schnell vonstatten geht, wurde darauf verzichtet, auf eine Antwort des Services zu warten, ob der Logoff Befehl verstanden wurde, denn kurz danach wird sowieso die Pipe geschlossen. Keine gute Idee in diesem Fall! Das hatte auch den Grund darin, dass

Was ist also passiert ❓

  • Die OVERLAPPED Struktur für den Lesevorgang lag auf dem Stack innerhalb einer while Schleife, die auf verschiedene Events wartet.
  • Die Funktion in der diese Struktur deklariert war wurde aber bereits verlassen.
  • Wenn dann sehr schnell die Antwort des Dienstes kam, wurde in die alte Adresse der OVERLAPPED Struktur ein Wert verändert.
  • … und damit wurde der Stack an dieser Stelle zerstört.

Es waren in meinem Fall nur 4 Bytes und in manchen Fällen würde eine Rücksprungadresse verändert und es kam zum Crash. In anderen Fällen wurde Speicher verändert, der nicht mehr benutzt wurde. Das ganze passierte eben auch nur auf den Systemen, die sehr schnell auf die Antwort des Dienstes reagierten. Kam die Antwort spät genug, war die Änderung des Speichers nicht mehr gefährlich.

Der Fehler blieb jahrelang unentdeckt, weil scheinbar das Stacklayout, das durch den VS-2010 Compiler erzeugt wurde, gegen diesen Fehler unempfindlich war, weil nur Speicher verändert wurde, der nicht zu einem Fehler führte.

Was lerne ich daraus:
Wenn ich einen ReadFile mit OVERLAPPED verwende, sollte ich immer darauf achten, dass im Bedarfsfall auch dieser Vorgang abgebrochen wird durch ein CancelIo ❗ Ein CancelIo mehr kann nicht schaden, wenn man den Block verlässt, in der eine OVERLAPPED Struktur definiert war.

Mein 16. Award als deutscher MVP für Visual C++

Alle Jahre wieder. 😀 Es ist zwar schon ein paar Tage her, aber FedEx brauchte fast einen Monat (Jaaa!) bis ich meine kleine Award-Kiste aus den USA bekam.

Und wieder dachte ich: „Das wird diesmal wohl nicht langen!“´, aber es kam anders als ich dachte:

MVP Urkunde 2014

Das ist nun mein 16. Award als MVP für C++.

Ich war einer von 1.031 MVPs, die zum 1. Oktober Ihren Award erhalten haben und damit einer von ca. 4.000 in der ganzen Welt:
http://blogs.msdn.com/b/mvpawardprogram/archive/2014/10/01/congratulations-to-all-the-new-and-renewed-mvps.aspx

 

 

 

Was nicht alles mit dem schönen alten CMD.EXE geht: Ein Verzeichnis mit dem Datum im Format YYYY.MM.DD anlegen

Man lernt nie, aus. In dem Fall betrifft es ein wenig die Batch-Programmierung mit CMD.EXE.

Für einen Batch, der einen Teil eine Datensicherung eines Hyper-V Servers machen sollte benötigte ich ein Verzeichnis mit dem Tagesdatum, aber im Format YYYY-MM-DD. %date war mir bekannt und auf unseren Rechner liefert das aber, DD.MM.YYYY.

Ein wenig Suche im Netz brachte mich zu Substring-Funktionen bei der Variablenersetzung, die ich noch gar nicht kannte. Hängt man hinter eine Variable Doppelpunkt und Tilde kann man Startposition und Länge eines Substrings angeben.

Entsprechend ist der Batch also ganz schnell geschrieben 😉 :

SETLOCAL
SET TargetDir=D:\BackupHyperV %date:~6,4%.%date:~3,2%.%date:~0,2%
MD "%TargetDir%"