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

Visual Studio 2010 komplett entfernen bzw. die Unmöglichkeit es richtig zu tun

Immer wieder mal lese ich von Problemen bei der Installation oder mit Installationen von VS-2010. Ich hatte den Fall noch nie, aber es gibt scheinbar immer wieder Installationen in denen der Wurm drin ist.

VS-2010 installiert eine Unmenge an Komponenten und Programmteilen. Die meisten können einfach deinstalliert/gelöscht werden. Aber es bleiben immer noch ein Haufen DLLs/ActiveX Controls und Registry Einträge und Verweise auf Verzeichnisse. Und leider gibt es für die Visual Studio 2010 keinen richtigen Uninstaller, der auch alle Artefakte löscht und deshalb kann ich gleich zu Anfang sagen, dass man außer der Deinstallation wirklich wenig tun kann.
Eine Reparaturinstallation sollte man aber bei einer bestehenden Installation in jedem Fall einmal, bevor man zu härteren Maßnahmen greift. Die wirkt oft schon Wunder.

Im Netz gibt es das folgende Utility: Visual Studio 2010 Uninstall Utility:
http://archive.msdn.microsoft.com/vs2010uninstall
Das Tool hat drei Operationsweisen die man in dem obigen Link erklärt findet.
Das Tool funktioniert eigentlich ohne Probleme aber benutzt auch nur auf dem MSI Uninstall Prozess auf, und dabei berücksichtigt es nicht einmal Servicepacks. Sollte man also das SP1 von Visual Studio 2010 installiert haben, dann muss man dieses vorher selber entfernen.

Das dieses Tool macht aber auch nur die Arbeit halb. Das erkennt man mit einem schnellen Blick in Registry. Der Ast HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0 wird durch die Deinstallation nicht entfernt und man muß in diesem Fall manuell Hand anlegen.

Wenn man also persistente Probleme mit der VS-2010 Installation hat, die man nicht über die Setup-Logs oder mit Tipps aus den Foren lösen kann, dann bleibt nach meiner Meinung nur der harte Weg den Rechner neu aufzusetzen. Bisher bin ich davon verschont geblieben und meine Installation haben immer von Rechnerwechsel zu Rechnerwechsel gehalten.

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);
}

VS-Tipps & Tricks: Debugger Pseudo Variablen

Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information:

  • $TID
    Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss.
  • $HANDLES
    Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit im Debugger leicht überwachen.
  • $ERR
    GetLastError
    leicht gemacht. Schlägt ein WinApi Befehl fehl, dann ist es schön das man sofort beim Debuggen im Watch-Window sehen kann was die Ursache war. Oft genug ist ja im Code selbst kein Aufruf von GetLastError vorhanden oder nötig.

Siehe auch MSDN:
http://msdn.microsoft.com/en-us/library/ms164891.aspx

BTW: WinDbg hat noch einige mehr nette Pseudovariablen:
http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx
Schmerzhaft vermisse ich immer wieder $PEB, $TEB, $TPID, $RA im Visual Studio, komisch, dass es die nur im WinDbg gibt.

Für was ist der Makro %(PreprocessorDefinitions) gut ?

In den C++ Compilereinstellungen finden sich ein vorgegebener Makro %(PreprocessorDefinitions) in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich.

Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der General-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über den Makro %(PreprocessorDefinitions) in die allgemeinen Compiler-Einstellungen übernommen (die entsprechenden Defines sind _UNICODE; UNICODE; _MBCS ).
Erzeugt man eine DLL wird zusätzlich _WINDLL gesetzt.
Setzt man ATL Optionen in der General Seite wird auch über die %(PreprocessorDefinitions) _ATLDLL bzw. _ATL_STATIC_REGISTRY gesetzt oder zurückgesetzt.
Gleiches gilt, wenn die MFC als shared DLL verwendet wird. In diesem Fall wird der Define _AFXDLL zusätzlich gesetzt.

Löscht man also %(PreprocessorDefinitions) dann werden alle diese Einstellungen nicht mehr  korrekt übernommen.

Anmerkung:
Bei dem Linker Makro %(AdditionalDependencies) habe ich eine ähnliche Verwendung vermutet, konnte aber keine direkte Beziehung zur Seite General herstellen.

Obwohl es auch hier Einflüsse auf die Linkereinstellungen gibt bei Änderungen in den General-Einstellungen. Werden allerdings die MFC als zusätzliche Bibliothek ausgewählt werden die Standard-LIBs aus dem SDK komplett entfernt. Hier gibt die MFC Bibliothek selbst vor in welchen zusätzlichen Libs, des SDK gesucht werden soll über #pragma comment(lib,..).

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

Es ist mal wieder Oktober geworden und wie auch in den letzten Jahren erhielt ich folgende Email:

Sehr geehrte(r) Martin Richter,
herzlichen Glückwunsch! Wir freuen uns, Ihnen den Microsoft® MVP Award 2011 verleihen zu können! Diese Auszeichnung wird an herausragende, führende Mitglieder der technischen Communities verliehen, die ihre wertvollen praktischen Erfahrungen mit anderen Menschen teilen. Wir schätzen Ihren außerordentlich bedeutenden Beitrag in den technischen Communities zum Thema Visual C++ im vergangenen Jahr hoch ein.

Damit habe ich nun 13 MVP Awards für meine Aktivitäten in den C++ Communities erhalten ❗

OLE DB für den SQL Server wird es nur noch bis zur Version mit dem Codenamen „Denali“

Es ist erstaunlich von wie viel Technologie, sich Microsoft aktuell verabschiedet, oder Wege einschlägt, die manchen (zumindest mich) wirklich überraschen. Oder vielleicht überrascht es auch nicht, weil man gerade mit der Unberechenbarkeit der Branche rechnen muss!

OLE DB war vor Jahren die Technologie und jedem Entwickler wurde geraten von ODBC auf OLE DB umzusteigen, oder zumindest bei neuen Projekten OLE DB den Vorzug zu geben. Die höhere Performance und die größere Flexibilität haben bei weitem, die etwas komplexere Technik aufgewogen. Und Dank der guten ATL Client-Klassen war OLE DB auch zu handhaben.

Nun ist Schluß damit! Der nächste SQL-Server mit dem Codenamen Denali wird die letzte Version sein, die OLE DB unterstützen wird, so ist hier zu lesen:
http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

Liest man die Kommentare aufmerksam, dann scheint es daran zu liegen, dass Microsoft Probleme hat, OLE DB in der Cloud vernünftig zum laufen zu bekommen. Microsoft macht es sich scheinbar einfach und schießt eine ganze Technologie ab, die mal als „die Technik“ eingeführt wurde.
D.h. eine langsamere Technik wird nun der Standard werden.
Für mich wieder mal eine Entscheidung, die sich mir in keiner Weise erklärt.

Ich verfolge die Diskussion um den MS-SQL Server nicht permanent und so ist mir dieser Artikel erst jetzt untergekommen.

Mehr Infos auch in diesem Thread, der eine kleine FAQ enthält:
http://social.technet.microsoft.com/Forums/en/sqldataaccess/thread/e696d0ac-f8e2-4b19-8a08-7a357d3d780f

Heftig finde ich die Antwort auf Frage 6, die einem auch kaum Hoffnung macht mit einem älteren Client evtl. noch auf den neuen Server zugreifen zu können:

Question6: If I have an OLE DB application that I write for Denali, will it be supported on a post Denali version of SQL Server that is released during the life of Denali?

Answer: No, in fact we may explicitly block the OLE DB applications on post-Denali versions of SQL Server. It is recommended that you plan your migration soon to ODBC, if you want to start using newer versions of SQL Server as soon as they release.

PS: Wie erkläre ich wohl meinen Kunden, die auf einmal 10%-30% langsamere Datenzugriffe haben werden, gerade wenn es größere Datenmengen geht ?  Werden die mir glauben, wenn ich sage: Microsoft will es so?  🙁

vNext (VS-2011): Im aktuellen Preview kann man keine Programme mehr für XP entwickeln

Es kursiert ja bereits das Windows Developer Preview, also eine virtuelle Maschine mit der man in die nächste Windows 8 und Visual Studio Version hinein schnuppern kann.

Mein Mit-MVP Mike Ryan hat nun bei Tests festgestellt, dass die mit der neuen Visual Studio Version erzeugten Programme, die die MFC 11 und CRT 11 benutzen nicht mehr unter Windows XP laufen ❗ 😮 Aus eigenen Tests kann ich das noch nicht bestätigen.

Das ist mit großer Sicherheit ein Killerkriterium… zumindest ist es das in unserer Firma.
Mich wundert das, vor allem weil der Support für Windows XP auch noch bis 2014 läuft und wenn man Statistiken glauben darf, dann ist die Häufigkeit der Verwendung von Windows XP erst seit Juli diesen Jahres unter die 50% Marke gefallen.

Auf Connect wurde ein entsprechende Bug-Report eröffnet, es gibt hier die Möglichkeit mit den eigenen Stimmen für etwas Widerstand zu sorgen:
https://connect.microsoft.com/VisualStudio/feedback/details/690617
Also bitte gebt Eure Stimme ab!

Da die nächste VS Version vermutlich noch bis Herbst nächsten Jahres auf sich warten lässt kann man nur hoffen, dass sich das ändern wird.

Nachtrag 26.09.2011: Weitere Details zu den fehlenden Funktionen siehe Kommentare
Nachtrag 29.09.2011: Es scheint kein Zufall oder eine vorläufige Beschränkung zu sein. Der Bug wurde mit By Design geschlosen ❗ Ich kann dennoch nur raten auf deisem case weiter mit Stimmen abzugeben.

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 😉