Das Update für Microsoft Visual Studio 2010 Service Pack 1 (KB2635973) macht Visual-Studio instabil

Ich habe eindeutig und nachvollziehbar die Erfahrung gemacht, dass dieser Fix Update für Microsoft Visual Studio 2010 Service Pack 1 (KB2635973) Visual-Studio 2010 instabil macht. (siehe auch http://support.microsoft.com/?kbid=2635973)

Ich habe seit längerer Zeit immer wieder Abstürze in Visual-Studio. Nachvollziehbar ist in den Dumps zu sehen, dass dies immer dann passiert wenn der Garbage-Collector anläuft. Es ist auch immer die selbe Stelle in den selben Modulen.

Oft verschwindet eine offene Visual-Studio Instanz, die im Hintergrund offen war, während ich z.B. in Outlook eine Email schreibe einfach vom Bildschirm und startet erneut. Ich sehe dann ein „blinken“ in der Startleiste. Die Solution ist natürlich geschlossen. Dateien wurde nicht gesichert (können aber meistens recovert werden).
Oder ich arbeite in einem großen Projekt und Tippe meistens eine Klammer, einen Punkt oder einen Strich-Größerzeichen und Intellisense springt an und crashed meine Anwendung.

Ich habe mir sogar die Mühe gemacht 4 Arbeitstage ohne Addins zu arbeiten um zu prüfen ob ein Addin der Verursacher war. Ich kam mir ohne VA-X und Powertools wie Fingeramputiert vor. Dennoch kam es immer wieder zu Crashes, der genau gleichen Art. Meistens immer in großen Projekten.

Ich habe natürlich einen Case dazu, auf dem sich aber eigentlich nichts tut, obwohl Microsoft haufenweise Dumps von mir bekommen hat:
http://connect.microsoft.com/VisualStudio/feedback/details/635653/crash-while-navigating-in-vs-2010-and-crashes-when-vs-is-inactive-in-the-background

Allerdings bekam ich jetzt einen Tipp von einem Microsoft Mitarbeiter in diesem Case, den oben genannten  Fix zu deinstallieren.
Die Crashes sind nicht weg, aber sind eindeutig weniger geworden ❗
Wenn man sich die Daten ansieht merkt man auch schnell, dass ich diesen Case auch veröffentlicht, bevor der besagte Fix KB2635973 herauskam.

Tipp: Wer also mit einer Englischen VS-Version arbeitet sollte diesen Hotfix meiner Meinung nach deinstallieren ❗

GetComboBoxInfo liefert kein hwndItem, wenn die Applikation kein Common-Control 6.0 Manifest benutzt

Es ist einfach ärgerlich, dass die Änderungen, die an der API mit den Common-Control 6.0 so mies dokumentiert sind.

Wir haben eine neu programmierte Standardklasse in ein selten benutzes (uraltes) Tool übernommen.
Auf einmal funktionierten Teile der UI nicht mehr richtig, die in unseren Produkten bisher fehlerfrei gearbeitet haben. Speziell hatten wir Probleme mit der Anzeige von Comboboxen.

Die Ursache war schnell gefunden:
GetComboBoxInfo liefert für hwndItem immer NULL, wenn die Applikation kein Common-Control 6.0 benutzt.
Es wäre alles viel schneller entdeckt worden, wären passende ASSERTs eingebaut worden an den Stellen, an denen man auch etwas bestimmtest erwartet. Eben hier, dass hWndItem nicht NULL ist. Aber vermutlich dachte der Programmierer: Wenn ich schon eine Information bekomme, dann ist diese Information bestimmt auch richtig und vollständig.
Pustekuchen … 🙁 … aber wer will ihm das übel nehmen.

Das steht in der Doku zu COMBOBOXINFO natürlich nirgends drin (bzw. jetzt natürlich schon, weil ich eine entsprechende Community Addition gemacht habe).
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775798(v=vs.85).aspx

Die Beta 1 für VS-11 ist da!

Wie angekündigt wurde die VS-11 Beta 1 heute veröffentlicht.
Jetzt kann man auch die neue VS komplett testen und nicht nur den neuen Compiler mit den speziellen Erweiterungen für die Windows RT für Metrostyle Applikationen zu erzeugen, der ja schon in einem Developer Preview veröffentlicht wurde.

http://www.microsoft.com/visualstudio/11/de-de/downloads

Diese Beta Version hat bereits eine Go-Live Lizenz und darf produktiv genutzt werden.
Neu in den ganzen Paketen ist eine kostenlose TFS-Express Editition für bis zu 5 Entwickler.
Neu ist auch, dass es jetzt schon in der Beta 1 Sprachpakete zum herunterladen gibt. Wer also in Deutsch testen will, kann das jetzt schon tun.

Ich denke die Würfel sind gefallen: Mit VS-11 wird keine Entwicklung für Windows XP möglich sein

Ich habe bereits in einem anderen Artikel dazu geschrieben:
vNext (VS-2011): Im aktuellen Preview kann man keine Programme mehr für XP entwickeln

Offiziell gibt es dazu immer noch nichts zu sagen, nur möchte ich dennoch einiges dazu schreiben:

  • Es gibt eine rege Diskussion von MVPs mit Microsoft zu diesem Thema.
  • Das Thema wird aber auch von MVPs kontrovers diskutiert. Nicht wenige sind dafür XP Entwicklung außen vor zu lassen.
  • Aktuell muss ich davon ausgehen, dass es nicht möglich sein wird mit VS-11 XP Software zu entwickeln.

Ich schließe dies einfach auch aus dem strickten Schweigen von Microsoft. Es gibt keine Diskussion zu dem Thema und jedes Mitglied, der Produktgruppe, die man auf einem C++ Day erwischt, windet sich sagt eine dieser Antworten:

  • Das weiß ich nicht
  • Das habe ich nicht zu entscheiden

Oder man sagt nichts:

  • markanterweise sagt kommt nicht mal ein Satz wie „This is good Feedback“ (* siehe unten), was im allgemeinen darauf hin deutet, dass man einen Wunden Punkt getroffen hat.
  • und beachte, dass zu dem Eintrag auf Connect kein Microsoft Mitarbeiter in irgend einer Form Stellung genommen hat, die auf ein „Überdenken“ dieser Entscheidung auch nur hindeuten könnte.

Ich ziehe also Schlussfolgerungen alleine aus meinen Gesprächen mit Microsoft Mitarbeitern, die aber ja nichts sagen… 😉
Würde hier etwas noch offen und möglich sein, wäre zumindest ein „Gerücht“ vorhanden und meine Blog-Leser können sich darauf verlassen, dass ich dann hier nichts schreiben würde, weil ich ja unter einem Non-Disclosrure-Agreement stehe und nichts (inoffizielles) sagen darf.

Ich ziehe nun aus dem „offiziellen Schweigen“ (oder ist es doch ein inoffizielles Schweigen) von Microsoft meine eigenen Rückschlüsse und das bedeutet:

Mit 99,9% Wahrscheinlichkeit wird VS-11 Windows XP nicht als Zielplattform unterstützen ❗

PS: Dies ist meine rein persönliche Meinung.
PPS: Ich will keine Argumente hier noch mal aufführen die diese Entscheidung für falsch halten. Dazu kann man genug auf Connect lesen.
Ich befürchte allerdings, dass diese Entscheidung Microsoft XP nicht mehr zu unterstützen, einer schnellen und weiten Verbreitung von VS-2012 sherim Wege stehen wird.
PPPS: Man beachte das Windows XP noch einen Support durch Microsoft bis 2014 hat!
PPPPS: Ich denke zu 100% wird das feststehen wenn die erste Beta am 29.02.2012 heraus kommt.

* zu This is good feedback!
Das ist unter alt gedienten MVPs mehr oder weniger ein Running Gag. I.A. benutzt ein Microsoft Mitarbeiter diesen Begriff auf ein Thema mit berechtigter Kritik, an dem es in den nächsten Releases der Produkte keine Änderung geben wird. D.h. also übersetzt: „Wir haben eure Kritik gehört, werden aber nichts daran ändern…“ 😉

Kleines Resumé aus dem C++ Day am 07.02.2012 in Bad Homburg v.d.H.

Hier ein paar Gedanken zum C++Day in Bad Homburg. v.d.H.. Die Zeilen hier geben meine ganz persönliche Meinung wieder. Kommentare (auch mit abweichender Meinung) sind hier gerne gesehen.

Es hat sich gelohnt:

  • alleine schon weil (ungeplant und überraschenderweise) 2 MS-Mitarbeiter aus dem Produktteam anwesend waren.
  • Und man dadurch detailiert und direkt einige Fragen loswerden konnte.

Zu den Vorträgen:

  • Interessent, aber eigentlich nicht wirklich viel neues was zu sehen war.
    Große Teile habe ich in den Previews TR1  für VS-2008 (Featurepack) und VS-2010 schon in 2008+2009 gesehen 😉
  • Wieder etwas zu viel Gewicht auf Parallelisierung. OK. Es ist ein Thema. Aber ehrlich gesagt wüsste ich nur einen kleinen Teilbereich meiner aktuellen Projekte wo ein Einsatz dieser Tools Sinn macht.
  • Schön zu sehen, dass sich endlich auch etwas mehr im ALM Bereich für C++ tut.

Zwischen den Zeilen herausgehört (und manchmal ganz offen ausgesprochen):

  • Man kann wirklich hören, dass Microsoft der Sprache C++ neuen Raum gibt.
  • Ressourcen sparen zu entwickeln ist eben immer noch leichter mit einer Hochsprache wie C++. Das wusste ich eigentlich schon immer, aber manch einer hat das irgendwie im .Net-Trubel übersehen 😉
  • Die neuen Features in C++11 machen es leichter „fehlerfreie“ Programme zu schreiben. Es lohnt unbedingt sich mit den neuen Features auseinanderzusetzen und diese auch zu nutzen.
  • Ja es geht weiter. An den neuen Compiler Features für C++11 wird fieberhaft gearbeitet. Evtl. werden manche Features noch nicht im nächsten Release (VS-2012?) drin sein, aber in einem Featurepack (kennen wir ja schon) wird nachgeliefert.

Augeschnappt habe ich Stimmungen und Stimmen:

  • Es erstaunt mich immer wieder wie oft „alte Dinge“ (TR1), die zum Teil schon VS-2008 SP1 veröffentlicht wurden, immer noch nicht unter den Entwicklern angekommen sind. Es ist erschreckend wie hoch das Beharrungsvermögen auf alten Compilern und Libraries ist.
  •  Es erstaunt mich auch, dass viele Entwickler scheinbar an den neuen Features von C++11 vorbeigehen oder sich nicht wirklich so eingehend damit befassen, dass es auch aktiv genutzt wird.
  • Und es erstaunt mich auch, dass bei den Chefs und Projektverantwortlichen nicht angekommen ist, dass mit C++11 und den neueren Microsoft Compilern, Tools vorhanden sind die wirklich die Produktivitt steigern, wenn man diese auch einsetzt.
  • Für mich deshalb unfassbar wie viele noch VC6 benutzen (oft genug müssen). 😉
  • Es gibt immer noch zu viele Ängste vor dem Umstieg auf neue VS Versionen.
    Meine Erfahrung ist, dass seit VS-2005 ein wechsel auf neue VS-Versionen (2008/2010) spührbar neues gebracht hat, aber kaum Probleme bei der Umstellung mit sich brachte. „Projekte übernommen und es läuft“ war meine Erfahrung.

Was würde ich mir für die Zukunft auf C++ (Days/Konferenzen) wünschen:

  • Schön wäre es, wenn man einmal Sprecher finden würde, die wirklich aktive Projekte betreuen, die in C++ realisiert werden. Leider haben die meisten Sessions von deutschen Sprechern oft etwas künstliches, weil sie oft selbst nicht mehr C++ Projekte betreuen sondern doch eher mit .NET „eigentlich“ ihr Geld verdienen.
  • Nicht selten sind die Vorträge geclonte Vorträge von Sessions die irgendwo anders gehalten wurden.
  • Gut wenn man C++ Gurus als Sprecher findet, aber auch hier wird es oft blutleer weil abgehoben.
    Ich hätte manchmal gerne etwas dazwischen 😉

Grundsätzlich danke an Christian Binder (Microsoft), der sich immer wieder für C++ Veranstaltungen in Deutschland bemüht, obwohl ALM eher sein Thema ist.
Es ist schade, dass Microsoft in Deutschland niemanden Verantwortlichen hat, der wirklich auch mit C++ arbeitet und dem entsprechend auch das Produkt wirklich am Herzen liegt.

PS: Die Folien werden voraussichtlich auf dem Blog von Christian Binder veröffentlicht werden.

PPS: Ich merke selbst für mich, dass ich mir zu wenig Zeit nehme mit neuen Werkzeugen (z.B. Windows 8 Developer Preview) zu spielen um deren Produktivitätsvorteile (und manchmal auch Nachteile) besser zu erkennen. Alleine deshalb kann ich jedem nur empfehlen solche C++Days zu nutzen um wenigstens dadurch über den eigenen Tellerrand hinaus zu gucken. Eigentlich mache ich das viel zu selten.

Manchmal der letzte Retter in der Not: VA-X und die interne Historie

So geht es manchmal:

  • Da arbeitet man 4, 8, 12 oder 16 Stunden an einem Modul.
  • Alles sieht gut aus, nicht mehr lange und wir können einchecken.
  • Du änderst noch dies und das, steckst noch mal 2 Stunden Arbeit rein weil noch was optimiert werden soll und auf einmal merkst Du dass Du Dich verrannt hast. Die letzten 2 Stunden Arbeit hattest Du irgendwie das Gehirn nicht eingeschaltet, x-Änderungen gemacht, die nun alle Sch…sind.
  • Undo ist nicht mehr, weil Du schon andere Projekte offen hattest bzw. einmal VS abgeraucht ist.
  • Du hast Bockmist gebaut und jetzt willst Du auf den Stand von vor 4 Stunden zurück, oder den von gestern Abend.
  • Ein Shelveset hast Du im TFS nicht angelegt. Das machst Du nur wenn Du ins Wochenende gehst, oder Deinen Kollegen was weiterreichen musst.

Was nun? 😮

Als VA-X Benutzer (VisualAssist X http://www.wholetomato.com) hat man tatsächlich noch ein Backup!
Und zwar nicht nur eines, sondern ein paar.
In meinem History Ordner von VA-X
C:\Users\USER\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Whole Tomato Software\Visual Assist X\VERSION\Data\vs10\history\
werde ich fündig…

Ufff… :mrgreen:

Ich habe dieses Backup mittlerweile schon so oft verwendet, dass ich dazu übergangen bin diesen Ordner umzulegen an eine Stelle an die ich schneller dran komme. Das geht über den Registry Schlüssel HKCU\Software\Whole Tomato\UserDataDir.

Wer mehr dazu wissen will findet hier weitere Infos:
http://www.wholetomato.com/forum/topic.asp?TOPIC_ID=6865

Nachtrag (30.01.2012):
Damit diese Funktion auch verfügbar ist muss im VA-X die Auto Recovery Option eingeschaltet sein.
VA-X -> Options -> Performance -> Enable Auto Recovery

4 Termine für Microsoft C++ Infoday 2012

Wer letztes Jahr im Oktober keine Zeit hatte zum C++ Info Day nach München zu kommen, kann dies nun nachholen.

In etwa ähnliche Themen werden an vier verschiedenen Terminen und Standorten von Microsoft kostenlos angeboten:

Die Themen:

  • C++ 11: Modernes C++ im 21. Jahrhundert
  • Parallel-Power in Visual Studio 11: Konzepte und Tools
  • Application Lifecycle Management für C++: Die nächste Generation

Die Termine:

Ich werde 07.02. in Bad Homburg vor Ort sein um ein wenig Networking zu betreiben.
Da es aktuell eigentlich keine C/C++ Community im Netz gibt sehe ich hier die einzige wirklich gute Möglichkeit mit anderen C/C++ Entwicklern ins Gespräch zu kommen.

Die Tücke mit temporären Objekten und Konvertierungs-Operatoren

Wieder mal ein Beispiel für einen versteckten Bug.
Nachfolgender Code sieht ganz unscheinbar aus, aber er birgt eine Falle mit sich, die in der Implementierung der Klasse verborgen ist:

void CImageButton::OnSysColorChange()
{
   // Farbe hat geändert
   CButton::OnSysColorChange();
   // Bitmap neu laden
   LoadBitmap(m_strResource.IsEmpty() ? m_lpszResource : m_strResource);
}

LoadBitmap ist eine Funktion, die die Bitmap neu lädt und entsprechend der eingestellten Systemfarben einige Farben aktualisiet. Also das bekannte Verhalten von Toolbars. LoadBitmap nimmt einen LPCTSTR und damit kann die CImageButton Klasse entweder mit einem Ressource String arbeiten (der evtl. mit MAKEINTRESOURCE eine ID ist und kein echter Zeiger), oder eben einem Namen zu einer Bitmap Ressource.

Damit bei einem Wechsel der Systemfarben, die Bitmap neu laden werden kann, merkt es sich die Resource.  In der Funktion findet hier eine Konvertierung des alten CString Wertes in einen LPCTSTR statt, mit dem eingebauten Konvertierungs-Operator.

Das Problem in der Implentierung dieser Klasse war aber, dass LoadBitmap sich den neuen Ressourcennamen merken soll aber zuvor eine interne Clear Funktion aufruft, die die bestehende Bitmap und andere Klassendaten freigibt, bevor m_strResource oder m_lpszResource, neu gesetzt werden:

void CImageButton::Clear()
{
  ...
  // Clear old infos
  m_lpszResource = NULL;
  m_strResource.Empty();
  ...
}

bool CImageButton::LoadBitmap(LPCTSTR pszResource)
{
   Clear();
...
   if (ISINTRESOURCE(pszResource))
...
   else
   {
       m_strResource = pszResource;
...
   }
...
}

Das führt aber nun zu folgendem Problem: Clear löscht m_strResource und damit wird der übergebene Zeiger an LoadBitmap ungültig, mit der Folge, dass die ürsprüngliche Bitmap nicht mehr gefunden wird, wenn in der Zwischenzeit der Heap auf dem dieser String lag neu verwendet wurde. In der Release Version trat dieser Fehler selten auf. In der Debug Version war der Fehler sofort nachvollziehbar, denn hier wird der Heap bei der Freigabe auf einen einhaltlichen Wert zurückgesetzt.

Die Lösung ist einfach: Es ist nötig den alten Inhalt zu kopieren um einen gültigen Zeiger zu behalten.

void CImageButton::OnSysColorChange()
{
  // System colors changed
  CButton::OnSysColorChange();
  // We need to protect the resource name, because LoadItem calls
  // Clear and this might empty m_sResource. And this causes
  // the string object on the stack to get deleted and the pointer
  // points into nowhere land. So we use a copy of the string here.
  CString strRessource(m_strResource);
  LoadBitmap(strRessource.IsEmpty() ? m_lpszResource : strRessource);
}

Münchner C++ Day zu Visual Studio 2011 am 19.10.2011 mit Sprechern von Microsoft und Intel (kostenlos)

Der C++ Day wird kostenlos von Microsoft am 19.10.2011 veranstaltet.
Das Ganze ist eine Nachmittagsveranstaltung mit 4 Sessions von 13:00 bis 18:00 Uhr.

Veranstaltungsort ist das MACE Restaurant in München.

Die Themen werden sein:

  • Keynote: Visual Studio 11 and Windows – Powering the Next Wave of Innovation
  • Effective C++ Programming with Visual Studio 11 Ultimate
  • Unleash Parallel Performance with C++ in Visual Studio 11
  • Graphics & Game development tools in Visual Studio 11

 

Sprecher sind:

  • Bev Bachmayer – Senior Software Engineer Software and Solutions Group, Intel GmbH
  • Jean-Pierre Duplessis – Architect, Microsoft Visual Studio, Microsoft Corporation
  • Boris Jabes – Senior Program Manager, Visual C++ Team, Microsoft Corporation

 

Achtung: Es gibt nur eine begrenzte Anzahl von 50 Plätzen.

Hier der Link zur Veranstaltung und zum Anmelden:
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032493900&Culture=de-DE

PS: Ich abe mich soeben angemeldet 😉

OemToCharBuffW macht nicht das gleiche wie OemToCharBuffA und anschließender Umwandlung nach Unicode

Ein Stück Code in unserer Software behandelt Datenimport aus fremden Dateien. Nicht wenige alter DOS Programme erzeugen ja Daten im „OEM“-Zeichensatz (DBase etc.).
Wir haben in der Vergangenheit immer streng die T-Notation verwendet und eigentlich sollte dies einen vor vielen Überraschungen bewahren. Aber Pustekuchen.

Folgender Code sollte Daten aus einem OEM-Stream in einen CString umwandeln und eigentlich bin ich davon ausgegangen, dass das Ergebnis für Tabulatoren (‚\t‘) und Zeilenschaltungen („\r\n“) ergebnisneutral ist. D.h. in anderen Worten ich erwartete in dem String genauso viele Tabulatoren und Zeilenschaltungen vor wie nach der Konvertierung.
Die Umwandlung erfolgte mit solch einem Stück Code:

CString strText;
::OemToCharBuff(szText,CStrBuf(srText,len),len);

Sieht eigentlich harmlos aus. Allerdings musste ich feststellen, dass hier OemToCharBuffA und OemToCharBuffW ganz und gar nicht korrespondierende Ergebnisse liefern.
In der Unicode Version, also in der Version die OemToCharBuffW verwendet, wurden Tabulatoren zu 0x25cb L’○‘ wchar_t  und Zeilenschaltungen zu 0x266a L’♪‘ wchar_t und 0x25d9 L’◙‘ wchar_t!

Führt man jedoch zuerst eine Kovertierung in den „ANSI/Windows/8bit“-Zeichensatz durch und konvertiert anschließenend diesen ANSI-String nach Unicode, dann ist alles gut und so wie man es erwartet.

Wer Lust hat das nachzubauen kann das mit dem folgenden Code. Wichtig sind eigentlich nicht die OEM-Umlaute sondern nur die Tab- und Zeilenschaltungen:

const char szText[] = "Dies ist ein OEM TestString\r\n"
       "mit Zeilenschaltungen\tund Tabs\r\n"
       "und Umlauten:\r\n"
       "Ž=AE, ™=OE, š=šE\r\n"
       "„=ae, ”=oe, =ue, á=ss";
const size_t len = sizeof(szText);

CStringW strOut1;
::OemToCharBuffW(szText,CStrBufW(strOut1,len),len);
CStringA strOut2;
::OemToCharBuffA(szText,CStrBufA(strOut2,len),len);
CStringW strOut3(strOut2);

_ASSERT(strOut1.Compare(strOut3)==0); // Das sollte eigentlich gleich sein

PS: Getestet habe ich das auf einem Windows 7 64bit und 32bit OS.

Siehe folgende Links zu den Begriffen OEM/ANSI:
http://blogs.msdn.com/b/oldnewthing/archive/2005/10/27/485595.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2005/03/08/389527.aspx