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.

Mit dem Nvidia GeForce 285.62 Treiber hat man kein Bild in der Windows Media Center Edition

Ich habe meinen neuen Rechner mit einer TerraTec Cinergy T PCIe Dual Karte ausgestattet und dachte schon mit deren Treiber oder der Karte stimmt was nicht, weil ich in der Media Center Edition kein Bild bekommen habe. Der Ton funktionierte tadellos.

Die Ursache lag aber in dem neuen Nvidia GeForce Treiber 285.62 (Windows 7, 64bit). Mit diesem dem hat auch bei der Wiedergabe einer Aufzeichnung kein Bild.  Nun bin ich auf den Treiber Stand 280.26 zurück gegangen und alles ist wieder gut.

Da ich nicht Zocke spielen, die neuen Features dieser Treiberversion für mich sowieso keine große Rolle.

Ich glaube irgendein Staat verkauft jetzt Kopfhörer um die Staatschulden zu begleichen ;)

Wenn Obama drei Stück davon verkaufen könnte, hat er keine Schulden mehr mit den USA!

… ohne Worte:

 Und das Beste sind die 4,95 Versandkosten ❗

Gefunden auf:
http://www.amazon.de/Creative-630-Ear-Ohrhörer-Kabellänge-schwarz/dp/B0009G6FQI/ref=sr_1_18?ie=UTF8&m=AOFI6YD3RXI9O&s=generic&qid=1323255586&sr=1-18&tag=hornoxecom-21

 

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

Preiswertes Netzteil für den eBook Reader Sony PRS-T1

Mit den Netzteilen für die Sony eBook Reader PRS-T1 ist das so eine Sache, es funktionieren nicht alle. Und mal ganz ehrlich: 25,– Euro für das originale Ladegerät von Sony ist mir einfach zu teuer.
4 alternative Netzteile habe ich ausprobiert (Hama, Belkin und 2 Noname Produkte), die alle bei iPads und iPods und angeblich auch für Sony PRS Geräte funktionieren. Bei meinem eBook-Reader allerdings nicht. Die Beratung im Mediamarkt war leider auch unprofessionell und lautete nur: Das geht schon… es ging aber nichts. Laut Artikeln im Netz benötigt der Sony Reader auch auf dem Datenkabel 5V Spannung (aber um das zu prüfen bin ich zu wenig Techniker).

Meine Tochter hat ein Samsung Smartphone und als ich ihr Ladegerät mal verwendet habe hatte ich endlich Erfolg. Und mit ein wenig Recherche im Internet wurde dies auch im Sony eBook-Reader Forum von einem anderen Nutzer bestätigt.

Für 4,50 Euro (inkl. Porto ❗ ) habe ich mir jetzt ein original Samsung  Ladegerät Typ ETA0U10EBE (für Galaxy S Plus und Galaxy S super und andere) besorgt und das funktioniert super. Meine ersten Versuche haben auch gezeigt, dass dieses Gerät den Sony PRS-T1 Reader auch komplett auflädt. (Was angeblich bei einigen alternativen Ladegeräten nicht der Fall ist, aber selbst, wenn nur 90% der Ladung erreicht würde ist das OK und würde den internen Akku auch schonen). Das  ETA0U10EBE ist wunderbar klein, leicht und kompakt, preiswert und überall zu haben.

Happy eBook Reading 😉

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.

Wie man bei einem Sony PRS-T1 die Autorisierung aufheben kann

In manchen Foren wird gerätselt wie man die Autorisierung des Sony PRS-T1 Ebook-Readers aufheben kann.
Die Adobe-Digital-Editions (Ver. 1.7.2) können nicht benutzt werden. Diese zeigen den PRS-T1 gar nicht an wie z.B. einen OYO.

Man muss die entsprechende Sony-Reader Software Reader for PC installieren um die Autorisierung durchzuführen. Die Installationssoftware befindet sich ja auf dem Reader.
Die Autorisierung habe ich über den Menüpunkt Bearbeiten -> Einstellungen bewerkstelligt.

In der Onlinehilfe von Reader for PC steht nun folgendes für das Aufheben der Autorisierung:

  1. Schalten Sie das Reader-Gerät ein und schließen Sie es dann mit dem mitgelieferten USB-Kabel an Ihren Computer an.
    Reader für PC wird startet, und das Reader-Symbol wird in der Quellenleiste angezeigt.
    Wenn „Automatischer Start“ deaktiviert ist, starten Sie Reader für PC manuell.
  2. Drücken Sie Umschalttaste+Strg auf der Tastatur.
  3. Klicken Sie links auf „Autorisierung aufheben“.
  4. Klicken Sie auf  neben „Autorisierung des angeschlossenen Geräts aufheben“.
    Alle von Ihnen erworbenen Inhalte werden vom Gerät gelöscht

Das ist aber falsch. Man kann in der Reader for PC Software sooft Umschaltaste+Strg drücken wie man will. Es erscheint gar nichts.

Es fehlt ein kleiner Satz, dass man dies über den Menüpunkt Bearbeiten -> Einstellungen machen muss.
Hier also der Weg zur Deautorisierung:

  1. Software Reader for PC starten
  2. Sony PRS-T1 Reader anschließen
  3. Umschalttaste+Strg drücken und gleichzeitig das Menü Bearbeiten -> Einstellungen öffnen
  4. Es erscheint ein Dialog in dem die Autorisierung aufgehoben werden kann:

Ich hoffe damit kommt man klar 😉

Nachtrag (01.01.2010): Die Autorisierung eines PCs lässt sich mit der Hilfe der Adobe Digital Editions aufheben. Man startet dazu die Software und drückt die Tastenkombination Strg+Umschalt+D. Damit wird die Autorisierung für diesen PC aufgehoben. Verschlüsselte eBooks lassen sich dann nicht mehr lesen.

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 ❗