AfxMessageBox versus CWnd::MessageBox

Jeder MFC Entwickler kennt AfxMessageBox. In der Klasse CWnd finden wir auch die Memberfunktion CWnd::MessageBox.
Mancher Entwickler wird sich nun fragen: Wann nehme ich denn nun was?

Kurze Antwort: Meide CWnd::MessageBox und nutze immer AfxMessageBox

Lange Antwort:
CWnd::MessageBox ist einfach nur ein direkter Wrapper für Windows API Funktion MessageBox.
Der Grund warum man AfxMessageBox verwenden sollte liegt darin was AfxMessageBox einfach noch mehr leistet:

  1. AfxMessageBox benutzt die virtuelle Funktion CWinApp::DoMessageBox. Damit kann man zentral eine andere Behandlung für Fehlermeldungen einbauen.
  2. AfxMessageBox sorgt dafür, dass OLE Controls benachrichtigt werden, dass Ihre nicht modalen Dialoge nun deaktiviert werden müssen. Es wäre ja ziemlich heftig, wenn man solche Dialoge trotz aktiver MessageBox noch benutzen könnte. (siehe CWinApp::DoEnableModeless und Implementierung von CWnd::GetSafeOwner)
  3. CWnd::MessageBox benutzt das aktuelle Fensterhandle aus dem es aufgerufen wird als Parent-Handle für die API Funktion MessageBox. Die wenigsten Entwickler kennen, lesen oder beachten den netten Zusatz in der MessageBox Doku:
    If you create a message box while a dialog box is present, use the handle of the dialog box as the hWnd parameter. The hWnd parameter should not identify a child window, such as a control in a dialog box.
    Es ist also gerade zulässig CWnd::MessageBox aufzurufen, denn oft genug haben wir es mit Child-Windows zu tun.
    Netterweise beachtet AfxMessageBox genau das. Es ermittelt das aktuelle aktive Top-Level Fenster und setzt es intern für den Aufruf von MessageBox.
    Das wird auch ganz besonders wichtig, wenn man evtl. mehrere UI Threads hat. AfxMessageBox verwendet automatisch den richtigen. CWnd::MessageBox verwendet den aktuellen Thread aber evtl. als Fenster das Fenster-Handle aus einem anderen Threads.
  4. CWnd:MessageBox hat keine Implementierung für die F1-Taste und die Hilfeimplementierung der MFC.
  5. Ich muss mich nicht um den Titel der MessageBox kümmern, denn AfxMessageBox benutzt den hinterlegten Applikationsnamen (CWinApp::m_pszAppName) der in der MFC hinterlegt und definiert wurde.
  6. Netterweise setzt AfxMessageBox passende Icons wenn nur die Reaktionsform definiert wird, also kein Icon. (MB_OK und MB_OKCANCEL benutzt MB_ICONEXCLAMATION, MB_YESNO und MB_YESNOCANCEL benutzt MB_ICONQUESTION).

HTH

Sharepoint Timer Service frisst Giga-Bytes an Speicherplatz und kostet Performance

Ich habe einen Server auf dem mein TFS läuft. D.h. es ist eine Ein-Server Installation. SQL-Server, TFS und SharePoint liegen alle auf einem Windows 2003 R2.

In der letzten Zeit hatte ich schon das Gefühl, dass der erste Kontakt zum TFS ziemlich langsam war, bzw. auch das erste Speichern eines Tasks, oder Bugs.

Vor einigen Tagen dann bekam ich eine Meldung, dass kein Backup mehr durchgeführt wurde.
Eine Analyse ergab, dass auf dem TFS mit einem 100GB Raid5 Laufwerk nur noch 200MB frei waren. Eine Suche ergab, dass sich im Verzeichnis C:\Programme\Gemeinsame Dateien\Microsoft Shared\Web Server Extensions\12\LOGS\ weit über 22GB an Daten angesammelt hatten.

Eine weitere Analyse ergab, dass alle 15 Sekunden ca. 4000 Zeilen mit dem folgenden Text erzeugt wurden.

Alle 15 Sekunden ca. 4000 Einträge

11/02/2009 11:59:14.87  OWSTIMER.EXE (0x0F30)                    0x049C Windows SharePoint Services    Timer                          5uuf Monitorable Die vorhergehende Instanz des Timerauftrags ‚Config Refresh‘, ID {0CA4803D-1621-49F4-BEFC-1BA2B441AC28} für den Dienst ‚{8B6CADF9-8ECE-409C-8D32-E336A5564C04}‘ wird noch ausgeführt. Die aktuelle Instanz wird deshalb übersprungen. Sie sollten eine Vergrößerung des Intervalls zwischen den Aufträgen in Erwägung ziehen.

Einiges suchen im Internet ergab, dass ich nicht alleine an diesem Problem leide. Es gibt sogar einen KB Artikel dazu: http://support.microsoft.com/kb/941789/en-us/

Letzten Endes kann man die Warnungen unterdrücken, indem man den Logging Level verändert. Das geht einmal wie beschrieben über die SharePoint 3.0 Central Administration. Aber weitaus einfacher geht es auch über die Befehlszeilentools.

stsadm -o setlogginglevel -category timer -tracelevel unexpected 

Das ganze kostet aber immer noch einiges an Performance, denn dies unterdrückt nur die Protokollierung des Problems. Ein Refresh des Caches ist aber wirklich nicht alle 15 Sekunden notwendig, wie es die Standardeinstellungen vorsehen. Den Prozess alle 5 Minuten laufen zu lassen langt auch.
Das erreichen wir durch:

stsadm -o setproperty -propertyname job-config-refresh -propertyvalue "Every 5 minutes between 0 and 59"

Die entsprechende Doku dazu findet sich hier:
http://technet.microsoft.com/en-us/library/cc424971.aspx
http://technet.microsoft.com/en-us/library/cc261740.aspx

Die Standardwerte kann man wieder setzen durch die Befehle:

stsadm -o setlogginglevel -default -category timer
stsadm -o setproperty -propertyname job-config-refresh -propertyvalue "Every 15 seconds"

Ich hatte zu dem Problem auch den Microsoft Support bemüht, allerdings erfuhr ich hier auch nicht mehr, als ich selbst schon ermittelt hatte. Allerdings wurde mir angedeutet, dass es zu diesem Problem auch einen „noch“ inoffiziellen Fix gibt. Mal sehen ob sich hier mal noch etwas tut.

Mein fix behebt zumindest das Problem mit den extrem vielen Log-Datei Daten- Und auch die Performance des TFS ist wieder etwas besser geworden, nachdem der entsprechende Timer Job nur noch alle 5 Minuten läuft.

Weitere Links zu OWSTIMER und den Timer Jobs des Sharepoint 3.0

Schreck lass nach: Microsoft Office Outlook kann nicht gestartet werden. Das Outlook-Fenster kann nicht geöffnet werden.

Heute morgen – noch im Schlafanzug 😉 – werfe ich meinen Rechner an.

Als erstes Outlook starten um die Emails zu kontrollieren und weil ich noch einige Aufgaben nachsehen wollte.
Und was sehen meine noch müden Augen 😮

Outlook-Fehler

Microsoft Office Outlook kann nicht gestartet werden. Das Outlook-Fenster kann nicht geöffnet werden.

OK. Ruhe bewahren!
Outlook mit Safemode starten. Auch nix.
Also Google fragen.

 Schnell werde ich fündig, die gescheiteste Anleitung mit etwas Hintergrund war hier zu finden:
http://www.outlook-stuff.com/lang-de/tipps-und-tricks/problemloesungen/729-microsoft-office-outlook-kann-nicht-gestartet-werden.html
Bei anderen wurde einfach nur gesagt: Neues Profil anlegen. Aber hier steht wenigstens die Info, dass es an einer XML-Datei liegt, die so heißt wie mein Profil!

Ich schau in mein Verzeichnis C:\Users\Martin\AppData\Roaming\Microsoft\Outlook dort finde ich eine Standard.xml Datei. Standard war der Profilname, den ich verwendet habe.
Die Datei hat eineGröße von 0 Bytes ❗ Das sieht falsch aus für eine XML-Datei.

Na! Warum also löschen und neu anlegen, ich verfüge doch über eine Datensicherung de ich regelmäßig mit Acronis True Image 2010 durchführe! Also werfe ich meine USB Platte an. Doppelklicke einfach meine TIB-Datei, navigiere in das Verzeichnis im Backup. Einfach Copy & Paste der Datei direkt aus dem Backup.  Ja, einfach so ganz ohne Restore, als ob es eine ZIP-Datei ist. Acronis True Image ist geil.

Outllook neu starten und siehe, alles ist wieder gut ❗

Es geht doch nichts über eine Datensicherung ❗
BTW: Sagte ich es schon? Acronis True Image ist geil? 😉

Nachtrag vom 16. November 2009:
In einem Kommentar von Dave vom 15.11. wurde geraten Outllook mit der Option /resetnavpane zu starten. Also über Start -> Ausführen folgendes eingeben: 

<Pfad von Outlook>\outlook.exe /resetnavpane

Wieder Andere hatten Erfolg damit, die XML-Datei mit dem Profilnamen einfach zu löschen!

Da andere Leser meines Blogs das Problem auf diese Weisen beheben konnten, nehme ich diesen Hinweis nachträglich direkt in diesen Artikel auf. Denn nicht alle haben ein Backup wie ich 😉
– Danke liebe Kommentatoren!!!

Nach Windows 7 Upgrade einige GB an Plattenplatz freigeben

Nachdem ich vor einigen Tagen ein Update auf meinen Vista Rechner auf Windows 7  durchgeführt habe, sind mir zwei versteckte Ordner im Rootverzeichnis auf meiner Festplatte aufgefallen, die nicht klein sind.

Durch eingeschränkte Rechte hat man normalerweise keinen Zugriff, aber wenn man eine elevated Session mit dem Explorer startet kann man herausbekommen was sie beinhalten:

$WINDOWS.~Q    2200 MB (2.364.075.683 Bytes)
$INPLACE.~TR    471 MB (  494.284.806 Bytes)

Die Dateien in diesem Ordner schienen auf den ersten Blick irgendwas mit dem Update zu tun zu haben.

  • Der erste Schritt: Mal in der Systemsteuerung nachsehen ob man dort etwas deinstallieren kann. Nada.
  • Zweiter Blick: Starten der Datenrägerbereinigung. Auch nichts auffälliges.
  • Dritter Versuch: Starten der Datenträgerbereinigung als Administrator. Bingo ❗

Siehe da:

Datenträgerbereinigung

Zwei Dateigruppen finden sich:
Beim Window-Upgrade verworfene Dateien – und –
Protokolldateien für Windows-Upgrades

Anhaken und Schwupps sind 3GB mehr Plattenplatz da…

Endgültiger Fix für die Probleme bei Installation des Sicherheitsupdates KB947319, Fehler Code A95

Ich habe vor einiger Zeit in dem Artikel Probleme bei Installation des Sicherheitsupdates KB947319, Fehler Code A95 von meinen Ärger mit dem Windows Update berichtet.

Ich war extrem überrascht welche Aufmerksamkeit dieser Artikel erregte. Das ging so weit, dass ich weitere Kommentare blocken musste und in meinem überfüllten Email-Postfach zu einem Standardtext greifen musste für Leute, die nach der Case Id fragten.

Endlich ist ein offizieller Fix für den KB947319 verfügbar ❗

http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=95c94c9a-6aca-42fb-9679-3234f06c72f7

Probleme mit der ISA-Server Konsole: Der ISA Server kann die Eigenschaftenseite nicht laden

An unserem primären DC (Windows Server 2003-SBS) läuft unter anderem auch ein ISA-Server 2004.
Irgendwie musste ich nach längerer Zeit mal wieder etwas kontrollieren, weil ein externer User keinen Zugriff bekam. Ich wollte die ISA-Server Console starten und erhielt die folgende Fehlermeldung:
Der ISA Server kann die Eigenschaftenseite nicht laden.
Fehler 0x80004005
Unbekannter Fehler

Isa1-1

Kurz danach noch einige andere Meldungen und abschließend diese:
Snap-In konnte nicht initialisiert werden.

Isa1-2

Am ISA-Server lag es nicht, denn mein Kollege konnte die ISA-Server Console, sofort starten. Also musste es mit meinem Account zusammenhängen.

Nach einigen Googeln fand ich die Lösung. Das Problem war die Managment Console selbst.
In der Registry werden bestimmte Daten zwischengespeichert. Und da schien etwas kaputt gegangen zu sein. Man kann diese Daten jedoch einfach löschen über Datei -> Optionen kommt man in die Datenträgerbereinigung. Dort einfach Dateien löschen auswählen und die abschließende Frage mit Ja beantworten und das war es.

Isa2

Visual Studio 2010 News

Erstmal die wichtigsten News vorab:

  • Die Beta 2 ist ab heute den 19.10.2009 auf MSDN verfügbar.
  • Für alle die, die kein MSDN haben wird es die Beta 2 vorraussichtlich ab Donnerstag den 22.10.2009 frei für alle verfügbar geben.
  • Das Erscheinungsdatum des Visual Studio 2010 wird voraussichtlich der 22. 03.2010 sein ❗

Die Zusammenstellung der Visual Studio Produkte wird sich komplett ändern. Insbesondere was den Team Foundation Server (TFS) und das Team System selbst bettrifft. Es wird nur noch drei Produkte geben (Professional, Premium, Ultimate) und nicht wie bisher 7 (Standard, Professional, Team System Developer, Test, Database, Architecture  und  Team-Suite) ❗
Das bisherige System mit den unterschiedlichen Rollen in Verbindung mit dem TFS kam nicht an und war unverständlich. Die drei neuen Versionen schließen immer die Leistung aller vorhergehenden Pakete ein. Im Detail sieht das bei den neuen Visual Studio Paketen in etwas so aus:

  • Professional: Alles was man bisher eben auch von der Professional Version kennt plus einige Extras, wie Multi-Monitor Support, Managed Extensibility etc.
  • Premium: Alles was Professional hat, inkl. das was wir bisher so in der Team System Developer, Database und der Tester Version kannte.
  • Ultimate: Alles was Professional und Premium umfasst plus die Team System Architecture Funktionen. Kommt also in etwa auf das hinaus was bisher die Team Suite war.

Auffällig! Es ist keine Visual Studio Standard Version geplant. Visual Studio Standard stirbt.
Aber auch hier soll was preiswertes kommen, so dass die Professional Version erschwinglich wird. So jedenfalls meine Hintergrundinfos.

Aber das aller wichtigste ❗ ❗ ❗

  • Alle Visual Studio 2010 Versionen schließen den TFS und eine CAL mit ein ❗
    (Diese Info ist unter Vorbehalt!)
  • Der TFS bekommt eine neue Installationsform mit dem Namen Basic.

Soweit ich das verstanden habe ist das ein vollständiger TFS, wie wir ihn heute kennen aber ohne Sharepoint Overhead. Das bedeutet einfache Installation in 15 Minuten. Und das läuft auch auf einem DC oder SBS, für alle die, die sich keinen zweiten Server hinstellen wollen. Natürlich eignet sich die Basic Installation auch als Installation für den Einplatz (d.h. auch für jeden XP, Vista und Windows 7 Rechner).
Die TFS Basic Installation bietet alles und viel viel viel viel mehr,  als das was wir bisher mit VSS und Visual Studio erledigt haben.

Microsoft will also ganz klar den TFS pushen und auf jeden Entwickler dazu bringen den TFS zu nuzen. Das heißt natürlich in zweiter Linie eine klare Absage für Visual Source Safe (VSS). Man kann sicherlich den VSS auch weiterhin in 2010 nutzen, wie man das in Visual Studio 2005+2008 her kennt. Aber ich kann nur jedem raten sich schnellstmöglich mit dem TFS anzufreunden.
Der VSS Mainstream Support läuft noch bis 11.04.2011!

Anmerkung zum Schluß:
Die Beta2 schließt bereits eine Go-Live Lizenz mit ein, eigent sich also direkt auch für das produktive Entwickeln.

Nachtrag: Alle Infos zur Lizensierung und Bündelung der Pakete bitte ich noch mit etwas Vorbehalt zubehandeln. Die Informationen wie ich sie hier wiedergebe basieren auf einem Webcast vom letzten Freitag und geben wieder wie was ich verstanden habe.

Upgrade meines privaten Desktop PCs auf Windows 7

Meinen neuen Samsung Laptop, den ich vor ca. 2 Monaten gekauft habe, wurde gleich platt gemacht und mit Windows  7 versehen.
Ich musste nicht einen Treiber nachinstallieren. Alles hat Windows 7 selber erkannt und es lief alles weitaus glatter als erwartet.

Heute habe ich den Mut gefasst und meinen privaten Desktop PC von Vista Ultimate 32bit auf Windows 7 Ultimate upzugraden. Kurz zuvor hatte ich mit meinem schönen Acronis Home 2010 noch ein Backup gemacht. Ohne würde ich es nicht wagen.
Und zuvor habe ich natürlich mit dem Upgrade Advisor geprüft ob es irgendwelche Probleme eben wird, dem war nicht so.
Zu einer Neuinstallation fehlt mir einfach die Muße, bis alles wieder läuft würden Stunden vergehen. Also wage ich das Upgrade!

Kurz vor dem Länderspiel um 17:00 habe ich das Setup gestartet, um ca. 21:45 war das Upgrade durch.

Gleich zu Anfang beschwerte sich das Setup über drei Programme:

  • Adobe Reader 7 (der definitiv nicht auf meiner Maschine war)
  • iTunes (mit dem ich die Musik für meinen IPod verwalte)
  • VMWare (mein ultimatives Testtool)
  • Cannon-EasyLayout Print (gehört zu meinem Drucker)

Windows 7 Update hatte mir empfohlen die Programme zu deinstallieren. Ich habe die Hinweise einfach ignoriert, denn alle drei Programm sind für mich nicht lebenswichtig und lassen sich nachinstallieren.

Da ich einige sehr große Dateien auf dem Rechner habe (ISO-Images etc.) hatte ich manchmal zwischendrin ganz schön Bammel ob das Setup durchläuft. Zwischendrin blieb die Prozentzahl der Fortschrittanzeige ziemlich oft und lange auf einem Wert stehen (10 Minuten lang).

Irgendwann war es so weit und ich konnte mich anmelden und … Spannung ❓
Keine Probleme. Alles läuft auf Anhieb ❗
Alle Treiber, alle Geräte inklusive WLAN, WebCam, SD-Kartenleser, Videokarte usw. sind sofort betriebsbereit.
Gleiches gilt für alle Software, Acronis 2010 Home, ESET Antivirus, Office etc.

Erster Eindruck:

  • Windows 7 läuft wirklich flüssiger und flinker. Eindeutig auch weniger Festplattenaktivität zu hören.
  • Grundsätzlicher Hauptspeicher Bedarf etwa 8% weniger als unter Vista zuvor. Windows 7 will 44% meines Speichers gleich nach dem Start, Vista wollte 52%.
  • Das Upgrade von Vista auf Windows 7 ist vollkommen schmerzfrei. Alles wurde 1a übernommen.
  • Sich mit dem Windows 7 Heimnetzwerk anzufreunden macht Spaß!

Ich kann ein Update nur empfehlen ❗

VS-Tipps & Tricks: Format Specifier in den Debugger Fenstern

Beim Debuggen Variablen im Watch-Window oder im Quick-View anzeigen zu lassen ist gängige Praxis und jeder etwas fortgeschrittene Entwickler wird diese Funktionen des Visual-Studios nutzen.

Üblicherweise wählt der Debugger eine Darstellungsform, die für die Variable geeignet ist. Besonders für STL Datentypen hat sich hier einiges getan seit VC-2005.

Dennoch kann man dem Debugger für manche Datentypen noch einen Format Specifier mitgeben, der einem die Arbeit beim Debuggen extrem erleichert.
Format Specifier erlauben es eine Variable entsprechend Ihrer Verwendung zu interpretieren. Typisch hier wäre eine Windows Nachricht. Als Integer sagt einem 0x0129 nicht viel, aber WM_NCCREATE einiges. Wenn man hinter die Variable nMsg im Watch-Fenster einfach aus nMsg,wm erweitert erhält man sofort die Nachricht als symbolischen Wert angezeigt.

Ich will hier nicht alle aber wenigstens ein paar sehr nützliche und weniger bekannte Format Specifier aufzählen:

! – Raw format
hr – HRESULT in Klartext
su -Unicode
s8 – UTF8
wm – Windowsnachricht
wc – Fensterstil
<n> – Anzahl der Arrayelemente

Am schönsten sieht man die Wirkung an dem folgenden Code und den nachfolgenden Bildern der Watch-Windows:

int g_ai[] =
{
  4711,
  815,
  1234
};

int _tmain(int argc, _TCHAR* argv[])
{
  std::list lst;
  lst.push_back(1);
  lst.push_back(2);
  DWORD dwHResult = 2147943623;
  void *szUnicode = L"Unicode ÄÖÜäöü";
  char *szUTF8Code = "Umlaute AE=\xc3\x84 OE=\xc3\x96 UE=\xc3\x9c.";
  UINT winmsg = 125;
  DWORD winstyle = 0xA6730000;
  int *pi = g_ai;

  DebugBreak();
  return 0;
}

Hier das Ganze die Daten im Watchwindow ohne Formatspecifier:

Watch1

Hier das Ganze mit:

Watch2

Weitere Links dazu:
http://msdn.microsoft.com/en-us/library/75w45ekt.aspx
http://blogs.msdn.com/vcblog/archive/2006/08/04/689026.aspx