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 ❗

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?  🙁