Der zweite Versuch: Visual C++ 2008 Feature Pack Refresh (MFCNext & TR1)

Nach dem ersten Versuch nun der zweite Versuch. Alle bisher bekannten Installationsprobleme sind gefixed.

Weitere Infos: http://blogs.msdn.com/vcblog/archive/2008/04/22/visual-c-2008-feature-pack-refresh.aspx

Download: http://www.microsoft.com/downloads/details.aspx?FamilyID=d466226b-8dab-445f-a7b4-448b326c48e7&displaylang=en

Das bereits installierte Feature Pack muss deinstalliert werden! Glücklich wer nur die Beta bisher installiert hat, der kann wie bisher einfach drüber installieren. ❗

BTW: Eine Responsezeit von 16 Tagen ist gar nicht soooo schlecht 😉

Visual Studio 2008 Feature Pain…

Hier die bisherige offizielle Bug-Liste des gerade veröffentlichten Feature Packs:

http://blogs.msdn.com/vcblog/archive/2008/04/12/visual-c-2008-feature-pack-setup-deployment-issues.aspx

Mit Ruhm hat sich Microsoft hier wirklich nicht bekleckert.
Vor allem ist das Feature Pack ohne ein funktionierendes Deployment für Vista erstmal wertlos…

In der Haut derjenigen, die das Setup und Deployment zu verantworten haben möchte ich nicht stecken.

Leider ist das Ganze wieder mal nicht ganz vertrauenserweckend. Man kann ja jetzt nur hoffen, dass der Rest des Packs mit nicht ganz so heißer Nadel gestrickt wurde. Die nächste Zeit wird es zeigen.

Visual C++ 2008 Libraries Extension Feature Pack Final Release (MFCNext & TR1)

❗ Es ist da, die finale Version des MFC-Feature Pack für VS-2008 (MFCNext & TR1) ❗

Das Feature Pack ist nur für die Englische VS-Version (ENU) ab Visual Studio 2008 Standard Edition verfügbar.
Andere Sprachversionen werden in Visual Studio 2008 Service Pack 1 enthalten sein.

Visual C++ 2008 Libraries Extension Feature Pack Final Release
Download link, 322.8 MB
Redistributable Package (x86)

Dokumentation:
MSDN MFC Feature Pack for Visual C++ 2008
MSDN TR1 Extensions

❗ Wichtige Anmerkung sofern ein Deutsches OS eingesetzt wird ❗

Bei mir schlug die erste Installation fehl (sowohl auf Deutschem Vista Ultimate SP1 als auch XP SP2). In der Log-Datei im %TMP% Verzeichnis konnte ich herausbekommen, dass die Datei SPInstallerResources.1031.dll vermisst wird:

Unable to load UI satellite DLL SPInstallerResources.1031.dll 

Nach einigem hin und her Tricksen mit Entpacken und Umbenennen der Datei fand ich folgenden Trick um das Feature Pack zu installieren:
Man muss einfach vorher in der Systemsteuerung in den Regions- und Spracheinstellungen, die Einstellungen für die Formate auf „Englisch (USA)“ umstellen. Zusätzlich habe ich auch den Standardort auf „Vereinigte Staaten“ eingestellt. Danach lief die Installation korrekt ab.

Es spielt übrigends keine Rolle ob die Feature Pack Beta Version zuvor installiert war!

Vista Stil bei Tree-Controls und List-Controls

Unter Vista wurden die Tree- und List-Controls noch einmal kräftig aufgemöbelt.
Diesen neuen Look kann man auch in seinen Applikationen nutzen und das mit 2 simplen Codezeilen.

#pragma comment(lib,"uxtheme.lib") 
SetWindowTheme(m_myCtrl.GetSafeHwnd(),L"Explorer",NULL);

Und schon hat man die neue Darstellung des Tree-Controls mit den Dreiecken, die Knotenlinien sind weg.
Beim List-Control hat man nun die hellblaue Färbung mit dem Hover-Effekt.

Vorraussetzung dafür ist, dass auch ein Manifest für die Windows Common Controls Version 6 vorliegt. Dem entsprechend ist SetWindowTheme und die Uxtheme.dll erst ab Windows XP verfügbar. Wer das ganze auch kompatibel mit Windows 2000 haben möchte, der verwendet natürlich das dynamische Laden der Uxtheme.dll und sucht den Einsprungpunkt für SetWindowTheme mit GetProcAddress!

Siehe auch MSDN Doku zu SetWindowTheme

C++ Community Event am 17.04 findet in Bad Homburg statt

Der folgende Community Event findet in Bad Homburg statt und nicht wie angekündigt in Frankfurt.

C++ Community Event in Bad Homburg mit Microsoft Program Managern
Ich habe den entsprechenden Artikel geändert.

Termin & Ort:

  • Datum: 17.4.2008, 16 – 19 Uhr

  • Ort: Steigenberger Hotel Bad Homburg
    Kaiser-Friedrich-Promenade 69-75
    61348 Bad Homburg v. d. Höhe

Anmeldung erfolgt per Email über den offizieller Link für die Veranstaltung:
http://blogs.msdn.com/softwarehersteller/pages/cpp2008-4-ffm.aspx

Arithmetik mit GetTickCount

Immer wieder sehe ich Code um GetTickCount oder Aussagen, die sich um den Überlauf von GetTickCount drehen, der alle 49,7 Tage entsteht. Muss man also irgendwelche Vorkehrungen treffen, wenn man Zeitdifferenzen errechnen will?

Eigentlich muss man sich gar nicht darum kümmern, sofern man in 49,7 Tagen eben mindestens einmal diese Differenz errechnet und das damit dafür gesorgt ist, dass diese Differenz nicht größer sein kann als eben besagt 49,7 Tage.

DWORD dwStart=::GetTickCount(); 
while (::GetTickCount()-dwStart < dwTimeout) 
   DoSomething();

Die Arithmetik über unsigned Integer macht es an dieser Stelle möglich. Dieser Code funktioniert, solange eben DoSomething nicht länger als 49,7 Tage dauert. Das ist die einzige Bedingung!

Leider schweigt sich die normale Windows SDK Doku zu GetTickCount darüber aus.
http://msdn2.microsoft.com/en-us/library/ms724408.aspx

Eigentlich problematisch an dieser Stelle, ist es nicht Differenzen zu bilden sondern Vergleiche durchzuführen ❗

Einen interessanten Zusatz dazu findet sich jedoch in der Windows CE Doku. Warum dieser Zusatz nicht auch in der normalen SDK Doku steht ist eigentümlich. Im Allgemeinen empfinde ich die CE-Doku in der MSDN immer eher als lästig.
Es ist aber eben wahrscheinlicher, dass dein CE Rechner und dementsprechend Programme die darauf laufen, länger als 49,7 Tage laufen als auf einem Desktop, ohne einen Reboot, alleine schon wegen der Security Updates, so kann man sich diesen Umstand zumindest erklären.
http://msdn2.microsoft.com/en-us/library/ms885645.aspx

When using GetTickCount, subtraction is safe but comparisons such as

if (GetTickCount() > MyTickCount)

are not. You can use the GetTickCount function to time the duration of an activity as shown in the example below, but using GetTickCount for any other operation will cause issues.

wOldTime = GetTickCount(); 
DoSomething(); 
dwTimeElapsed = GetTickCount() – dwOldTime;

Gleiches findet sich in der Windows Mobile 6 Doku noch etwas besser
http://msdn2.microsoft.com/en-us/library/aa915056.aspx

When using GetTickCount, subtraction is safe, even if the rollover occurred, and subtraction always yields the correct difference and the number of clock ticks passed between two tick values. Comparing tick values directly does not always yield the correct results; only compare the differences. Be sure that your code can service the difference before the second rollover, that is, before another 49.7 days pass. Comparisons such as the following are not safe:

#define DELTA_TICKS sample_tick_value 
// initialized somewhere in the code 
DWORD dwStartTick = GetTickCount(); 
DWORD dwEndTick =   GetTickCount() + DELTA_TICKS;     

// The following function fails on a rollover. 
BOOL no_compare_tick_difference() 
{ 
  if ( GetTickCount() > dwEndTick ) 
    return ( TRUE); 
  return (FALSE); 
}

The following code shows how to properly use GetTickCount by comparing tick differences. This code handles the rollover situation.

BOOL compare_tick_difference() 
{ 
  if ( (GetTickCount() – dwStartTick) > DELTA_TICKS) 
    return ( TRUE); 
  return (FALSE); 
}

C++ Community Event in Bad Homburg mit Microsoft Program Managern

Bei Microsoft passiert wieder mehr zum Thema C++.
Nachdem sich Dariusz Parys schon über volle C++ Vorträge bei dem Launch in Frankfurt wunderte und er nach Interessenten gefragt hat, die an weiteren lokalen Events für C++ interessiert sind tut sich nun was!

Am 17. April bietet Microsoft für die C++-Entwickler-Gemeinschaft eine dreistündige Veranstaltung zum Thema C++ in Visual Studio 2008 und dem VS2008 Feature Pack für C++ in Frankfurt/Main an.

Es wurden zwei Program Manager aus der Product Group eingeladen und sie einiges zum Thema C++ vortragen:

  1. What’s new in Visual Studio 2008
    • walkthrough new C++ features
    • VSTS for C++ developers
  2. A deeper look into the VS2008 Feature Pack for C++
    • demo of improvements to MFC
    • the value of TR1
  3. A brief glimpse into the future of Visual C++
    • highlights from what we’re building for the next version of C++

Termin & Ort (Update 31.03.2008):

  • Datum: 17.4.2008, 16 – 19 Uhr

  • Ort: Steigenberger Hotel Bad Homburg
    Kaiser-Friedrich-Promenade 69-75
    61348 Bad Homburg v. d. Höhe

Die Teilnahme an der Veranstaltung ist kostenfrei ❗

Anmeldung erfolgt per Email über den offizieller Link für die Veranstaltung:
http://blogs.msdn.com/softwarehersteller/pages/cpp2008-4-ffm.aspx

Anmerkung (31.03.2008):
Der ursprüngliche Veranstalltungsort war Frankfurt. Wurde am 31.03. endgültig auf Bad Homburg festgelegt!

LoadIcon macht es nicht richtig…

… oder sollte man sagen: Nicht so wie erwartet. 

In einer der Micosoft Newsgroup fand sich eine Anfrage, die sich um folgenden Code drehte:

HICON m_hIcon[2]; 
[...] 
m_hIcon[0] = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
m_hIcon[1] = AfxGetApp()->LoadIcon(IDR_SMALL); 
[...] 
SetIcon(m_hIcon[0], TRUE);   // Großes Symbol verwenden 
SetIcon(m_hIcon[1], FALSE);  // Kleines Symbol verwenden

Das Problem des Posters war, dass er sich Mühe mit dem Layout eine kleines Icons gegeben hat, aber leider immer nur ein verkleinertes 32×32 Icon verwendet wurde.

Das Problem liegt an der Verwendung von LoadIcon! LoadIcon lädt immer das Standard-Format 32×32. Bzw. in dem Format, dass durch das System als Standard-Icon-Größe vorgegeben wird.

Um es richtig zu machen, muss man das Icon wirklich in der gewünschten Größe laden. Dazu verwendet man die Funktion LoadImage. Eine kleine Helper Routine LoadIconEx kann dann wie folgt aussehen:

HICON LoadIconEx(PCTSTR pszIconName, bool bLargeIcon) 
{ 
 HINSTANCE hInstance = ::AfxFindResourceHandle(pszIconName,RT_GROUP_ICON); 
 return reinterpret_cast<HICON>(::LoadImage( 
       hInstance, 
       pszIconName, 
       IMAGE_ICON, 
       GetSystemMetrics(bLargeIcon ? SM_CXICON : SM_CXSMICON), 
       GetSystemMetrics(bLargeIcon ? SM_CYICON : SM_CYSMICON), 
       0)); 
}

VS-Tipps & Tricks: Downgrade für VC-200x Projekte

Kann man ein auf VC-2005 erstelltes Projekt einfach auch unter VC-2003 builden?
Oder ein 2008er Projekt auf VS-2005 laden?

Der Mühsame weg, ist es, das Projekt neu aufzubauen. D.h. ein leeres Projekt anzulegen und die entsprechenden Dateien aus dem alten Projekt in das neue Projekt in der niedrigeren Version aufzunehmen.
Es geht etwas leichter mit einem kleinen Hack ❗

Nehmen wir das Beispiel eines Downgrades von VS-2008 auf VS-2005.

  • Man kopiert einfach die entsprechende VCPROJ Datei unter einen neuen Namen
  • Man öffnet diese Datei mit dem Editor seiner Wahl
  • Man schaut in die Datei und findet den folgenden XML Code

<?xml version="1.0" encoding="Windows-1252"?>
 <VisualStudioProject
  ProjectType="Visual C++"
  Version="9,00"

Alles was man nun ändern muss ist die Zeile 4 mit dem Version Eintrag.
Wie ändern diesen Eintrag auf

 Version="8,00"

für VS-2005. Will man zurück auf die Version VS-2003 dann muss der neue Wert

 Version="7.10"

heißen.

Und schon sind wir fertig. Man glaubt es kaum 🙂

Klar ist, dass natürlich neue Features, wie z.B. Eigenschaften des Manifest Compilers in der vorher gehenden Version, die das z.B. gar nicht kennt untergehen. Diese Dateien bleiben in der Projektdatei, aber werden Dank XML einfach in der alten VS Version ignoriert.

Hotfix für GDI Leaks unter Windows XP-SP2/2003 Server in MFC Applikationen

Unter XP SP2 und Windows 2003 Server kann es bei eingeschalteten Themes zu GDI-Leaks kommen. Speziell wird hier auf MFC Anwendungen hingewiesen (siehe dazu meine Anmerkung unten).

Die Beschreibung und der Download-Link für den Hotfix finden sich hier:
MFC applications leak GDI objects on computers that are running Windows Server 2003 or Windows XP

Anmerkung:

Dies ist ein Hotfix für Theme Handler unter Windows 2003 und Windows XP SP2. Er greift nicht in die MFC ein ❗
Man muss also eigentlich davon ausgehen, dass der Bug im Windows Themes Kern steckt und nichts mit der MFC zu tun hat, sondern eher damit zu tun hat wie in der MFC mit Windows Ressourcen umgegangen wird.
Den Effekt bekommt man ziemlich einfach hin, indem man mit dem Wizard eine MFC-MDI Applikation anlegt. Dann einfach Strg+N festhalten und alle Fenster wieder schließen mit Strg+F4, danach findet man einige Hundert GDI Objekte ausgewiesen im Task-Manager, die vorher nicht da waren.
Ich habe einen Test mit dem MDI-Sample aus dem Petzold gemacht und dieses zeigt diesen Effekt nicht. Evtl. liegt es auch einfach nur an dem Umgang mit den Toolbars. Genaueres konnte ich nicht herausbekommen. 

  • Erstaunlich 1.: Dieser Patch ist mit 2 Jahren doch relativ alt (März 2006) und er ist mir erst durch eine Diskussion in einer Produkt-Gruppe über den Weg gelaufen …
  • Erstaunlich 2.: Dieser Patch wird nicht durch den Windows Update Service installiert, obwohl er in meinen Augen da rein gehört ❗
    Ob nun der Update Service nun den primären Fokus auf Sicherheit hat oder nicht. Ich empfinde dieses Verhalten des Theme Handlers als kritisch!