Achtung: Alle Visual Studio 2010 Express Editionen müssen registriert werden

In den Express Editionen für Visual Studio 2005 und 2008 war es nur nötig die Versionen zu registrieren, die mit dem Online Installer installiert wurden. Die Installationen die mit dem ISO-Image durchgeführt wurden dies nicht nötig.

Das hat sich mit den VS-2010 Express Editions (VS-EE) geändert. Es spielt keine Rolle ob es sich hier um die EE von C#, C++, VB oder eine der anderen verfügbaren Versionen handelt.
Alle diese Versionen müssen registriert werden. Die Laufzeit ohne Registrierung beträgt 30 Tage.

Ich rate dringend dazu, sofort nach der Installation auch die Registrierung durchzuführen. Und wenn es nicht klappt am nächsten Tag gleich wieder zu versuchen. Die Seite funktioniert leider oft genug nicht. So klagen zumindest nicht wenige Benutzer in den Foren.

Infos zur Registrierung hier:
http://www.microsoft.com/germany/express/registration/default.aspx

Download Link für alle Express Editionen (inkl. ISO-Image) hier:
http://www.microsoft.com/germany/express/download/default.aspx

Nachtrag:
Die FAQ ist ziemlich ungenau. Das jedes Produkt einen eigenen Schlüssel braucht habe ich ausprobiert. Aber man benötigt nur einmal eine Nummer für die Registrierung von VC#-2010 EE oder VC++-2010 EE ❗
Man kann ohne weiteres diese Registrierungsnummer auf mehreren Rechnern für mehrere Installationen benutzen (probiert auf Windows XP und Windows 7 Starter). Zumindest bei mir hat das geklappt. Es ist scheint nicht notwendig zu sein jede Version separat auf jedem neuen Rechner wieder zu registrieren ❗

VS-Tipps & Tricks: Kommentare intelligent und einfach umbrechen

 Wer programmiert, der dokumentiert auch. Denke ich zumindest 😀

Ich zumindest habe teilweise Kommentare, die sich über 10 bis zu 100 Zeilen erstrecken. Die sind nah am Code und erklären, oft was die Hintergründe für das gewählte Design und Vorgehen sind.

Leider ist aber der Editor vom Visual Studio kein Word. D.h. absatzweisen Umbruch kennt das Ding nicht und manuell solche Texte inkl. Einrückungen und Listen mit Bindestrichen oder 1., 2., 3. zu formatieren ist etwas was gar keinen Spaß macht. Zudem sind die Kommentar Zeichen // oder * eher lästig als hilfreich beim schreiben.
Und auch VAX muss hier mal passen. Aber! Netterweise gibt e auch andere Addins.

Ich habe vor langer Zeit schon den Comment Reflower  entdeckt. Mit dem ist das Ganze ein Klacks.
Aus dem nachfolgenden Text:

// Dies ist ein Kommentar, den man nicht wirklich hier schreiben
// müsste und der
// eigentlich nichts bedeutet außer
// die Funktionen von einem netten Addin zu zeigen.
// Das
//  1. wirklich Arbeit erspart
//  2. total simpel zu bedienen ist
//  3. für alle VS-Versionen von 2005 über 2008 bis 2010 verfügbar ist.
// Was bei der Formatierung heraus kommt lässt sich sehen.

Wird in Null-Komma-Nichts der folgende Text:

// Dies ist ein Kommentar, den man nicht wirklich hier
// schreiben müsste und der eigentlich nichts bedeutet
// außer die Funktionen von einem netten Addin zu
// zeigen. Das
//  1. wirklich Arbeit erspart
//  2. total simpel zu bedienen ist
//  3. für alle VS-Versionen von 2005 über 2008 bis
//     2010 verfügbar ist.
// Was bei der Formatierung heraus kommt lässt sich
// sehen.

Wer noch mehr Beispiele sehen will, was das Tool leistet findet hier auf der Sourceforge Seite ein Vorher Nacher Pärchen.

Das Addin existiert für alles Visual Studio Versionen ab 2005.
Es kann hier heruntergeladen werden:

PS: Es empfiehlt sich ein Blick auf die Blockdefnition in den Einstellungen. Dort ist oft ein Leerzeichen hinter dem * bzw. // eingetragen. Leider lässt sich in meiner Version hier RegEx nicht einschalten. Wer also ein <tab>-Zeichen hinter dem * oder // hat wird sich wundern wenn das Addin keinen Kommentar findet. Ich habe das Leerzeichen einfach entfernt…

PPS: Für alle nicht C++ Entwickler. Das Tool funktioniert auch für VB und C# ❗

Tool: Screen-OCR, einfach mal Texte vom Monitor aus Bildschirmausschnitten und Grafiken in die Zwischenablage kopieren

Im Second-Level Support habe ich es oft mit Fehlermeldungen zu tun, die mir von Kunden als Screenshots gesendet werden. Um das ganze in unserem Support-System zu dokumentieren, müssen die oft genug abgeschrieben werden. Oder ich möchte diese Texte haben um sie einfach in Google suchen zu können. Viele Leute wissen nicht, dass man ganz einfach Texte aus Messageboxen in die Zwischenablage kopieren kann. Also bekommt man Megabyte große Screenshots.
Lästig…

Es gibt einige kleine Tools  für Geld (z.B. von Abbyy) und auch einige kostenlose habe ich mal ausprobiert, mit denen man solch einen Screen-OCR durchführen kann. Aber die waren alle nicht das wahre oder unverschämt groß.

Da ich wusste, dass es

  1. im MODI (Microsoft Office Document Imaging) ein einfaches COM Interface gibt,
  2. ein Screenshot einfach zu machen ist und
  3. man mit GDI+ alle möglichen Grafikumwandlungen machen kann benötigt man
  4. nur etwas C++ als Kleber um alles zusammen zu bringen.

Herausgekommen ist Version 1.0 von MRiScreenOCR.exe. Eine simple Freeware EXE, mit der man einen beliebigen Bildschirmausschnitt per OCR in Text umwandeln kann und wahlweise in einem Dialog anzeigen kann oder direkt in die Zwischenablage kopieren kann.
Optional kann man das ganze über ein paar Optionen im Systemmenü steuern.
Eigentlich komplett selbsterklärend.
Wer weiß, vielleicht mache ich mich noch an Version 2.0 und ergänze noch eine Trayicon-Funktion optional.

❗ Einzige Voraussetzung MODI (Microsoft Office Document Imaging) muss installiert sein, damit das kleine Tool arbeiten kann (siehe auch Anmerkung unten). Sonst benötigt man nichts. Die EXE funktioniert stand alone mit XCOPY Installation. Das Tool wurde mit VC-2010 erzeugt, man benötigt also mindestens Windows XP SP2.

Hier kann man MRiScreenOCR.exe kostenlos herunter laden und es steht jedem als Freeware zur freien Nutzung.

PS:
MODI ist übrigens teil von Microsoft Office 2003 und Office 2007. Leider ist es im Office 2010 nicht mehr enthalten. Schade, denn es war für mich das primäre Programm Dokumente zu scannen zu archivieren und auch zu indizieren.

Nachtrag 18.05.2010:
Es ist ohne weiteres möglich nur MODI aus Office 2007 alleine ohne weitere Komponenten zu installieren. Das funktioniert sowohl auf 32bit Systemen wie auch auf 64bit Systemen.

Nachtrag 01.06.2010:
Die Version 2.0 von MRiScreenOCR.exe ist nun verfügbar.

Nachtrag 03.10.2011:
Ich zitiere den Kommentar von Robin hier:

falls man MODI nicht hat, hier kann man es kostenlos bekommen:
http://support.microsoft.com/kb/982760

Microsoft schließt die nntp://microsoft.public.* Gruppen

Seit Jahren haben sich MVPs dafür eingesetzt, dass NNTP Gruppen weiter ein integraler Bestandteil der Community Szene bei Microsoft bleiben. Das Reden und diskutieren hat nun ein Ende. Microsoft schafft Fakten.
Siehe
http://www.microsoft.com/communities/newsgroups/default.mspx
http://news.cnet.com/8301-13860_3-20004109-56.htm

Ab heute wird Microsoft in allen NNTP Gruppen bekanntgeben, dass diese Gruppen nach und nach abgeschaltet werden. Dieses Abschalten wird im Juni beginnen mit Gruppen, die wenig Traffic haben und im Herbst diesen Jahres soll dann die letzte Gruppe vom Netz gehen. Das heißt auch, dass im Community Bereich der Microsoft Homepage die Spiegelung der NNTP Gruppen beendet wird. http://www.microsoft.com/germany/community/developer/newsgroups.mspx.

Begründet wird dies damit, dass die Microsoft Community durch die Zentralisierung auf die Microsoft Webforen weiter gestärkt werden soll. Das Ganze wird weiter begründet mit der Möglichkeit einer effektiveren Suche, der besseren Archivierung, größerer Sicherheit und weniger Spam.

Verstehen kann ich diese ganze Argumentation nicht. Microsoft selbst hat es versäumt die NNTP Gruppen stärker zu umwerben und auch direkter auf diese effektiven Gruppen hinzuweisen. Suchen konnte man immer schon, wenn man es wollte und Spam war eher die Ausnahme als die Regel in den NNTP Gruppen. Manche Stimmen mögen hier eher anführen, dass Microsoft über diese Foren einfach keine Kontrolle hatte und das dies einer der wesentlichen Gründe für die Abschaffung ist. Ich befürchte dies leider auch. „Zensur“ oder „Kontrolle“ ist in den hauseigenen Webforen eben viel einfacher als im „freien“ Usenet.

Microsoft hat IMHO alle Vorschläge der MVPs zu einer Stärkung dieser Community ignoriert und ist seine eigenen Wege gegangen und stellt nun leider Ihre eigene Community vor vollendete Tastsachen. Das andere Zeiten andere Techniken nötig machen oder eben auch hervorbringen ist eine Sache, aber dieses Für&Wider will ich hier jetzt gar nicht mehr diskutieren…

Das der Traffic die letzten Jahre abgenommen hat war klar zu sehen, ist aber eben auch Schuld von Microsoft selbst, weil keine Werbung gemacht wurde. Für meine „Lieblingsgruppe“ 😉 nntp://microsoft.public.de.vc war dies nicht unbedingt schlecht. Es blieb immer ein guter harter Kern an Regulars, der für eine gleichbleibend hohe Qualität sorgte. Jeder der diese Gruppe besuchte konnte mit einer qualitativ hochwertigen Antwort rechnen.

Ich kann nicht für alle Produktbereiche und alle Foren sprechen, aber ich denke, dass ich einen guten Überblick über die technischen Foren für C/C++ und WinAPI habe (sowohl in Englisch als auch in Deutsch). So möchte ich auch speziell zu der Situation dieser Foren hier Stellung nehmen. Als Regular seit über 13 Jahren in nntp://microsoft.public.de.vc , Moderator für die MFC und WinAPI Foren im deutschen C++ Forum (http://www.c-plusplus.de/foren) und Moderator in den C++ und Windows Entwicklungsbereichen der MSDN (http://social.msdn.microsoft.com/Forums/de-de/categories/) kann ich mir wahrscheinlich auch  ein Urteil erlauben. 😉

Im Vergleich zu allem, was ich in den letzten 12 Jahren an Community erlebt habe, ist keines der Webforen jemals an die hohe Qualität der Microsoft NNTP Foren herangekommen, zumindest was den Bereich Technik und Entwicklung betrifft. Dies gilt meines Erachtens sowohl für die deutschen, als auch englischen Foren. Dies habe ich so auch als Stellungnahme von anderen MVPs anderer Produktbereiche wahrgenommen. Man kann nur hoffen, dass sich das in Zukunft ändert. Das dies ein Automatismus wird wage ich stark zu bezweifeln.

Mit dem Launch von VS-2005 wurden auch deutsche Webforen eingeführt, die aber definitiv als Flop endeten. Im März letzten Jahres gab es dann einen Relaunch auf breiter Basis und mit mehr Engagement von Microsoft und einem vernünftigen Angebot von Gruppen gegenüber dem Start in 2005. Ich habe dazu damals entsprechend berichtet.
Das Microsoft hier weitaus mehr investierte war sofort auch daran zu erkennen, dass hier regelmäßig Microsoft Mitarbeiter präsent waren. Das war auch im Startup der englischen Webforen zu beobachten. Sie sorgten für eine hohe Antwortquote egal um welches Thema es auch ging.
Zumindest fangen diese Foren an zu funktionieren, obwohl sie im C/C++/WinAPI Bereich in keiner Weise an den Traffic der NNTP Gruppe oder des deutschen C++ Forums heran kommt. Ich muss auch klar sagen, dass hier noch einige thematische Gruppen fehlen. Aber wir werden vermutlich in nächster Zeit hier auch noch entsprechende Erweiterungen erleben.

Es bleibt die Tatsache, dass die Qualität in fast allen Webforen zum Teil unterirdisches Niveau haben.
Ein Großteil der Fragen entspringt der Unfähigkeit Google und Bing zu verwenden, geschweige denn die Möglichkeit zu nutzen technische Dokumentationen auch zu lesen. Mangelnde Eigeninitiative in Verbindung mit der allgegenwärtigen Forderung „Gib mir ein paar Zeilen Beispielcode“ sorgen bei mir nicht gerade für Spaß und Herausforderung in diesen Community Bereichen.
Wen wundert es, dass sich ein Techie mit Niveau eher abgeschreckt, als angezogen fühlt, durch die Qualität der Diskussion und Mitglieder. Die Nische NNTP Gruppen war Qualitativ und aufgrund der gewachsenen Strukturen der Mitglieder eine gute Sache. Leider wird diese Nische nun bald verschwinden. Wenn nicht… wer weiß?

Für die Zukunft kann ich nur hoffen, dass viele der Regulars aus den NNTP Gruppen tatsächlich „umziehen“ in die Webforen und damit hoffentlich für mehr Qualität und durch Ihre kontrollierte Präsenz auch für mehr Netiquette sorgen.
Ich bin gespannt was wird. Leider ist meine Hoffnung dies bzgl. gering. Ich befürchte eher, dass sich ein Profi nach dem anderen aus der Online-Community langsam genervt verabschieden wird.

Als Community Dinosaurier weine ich den NNTP Foren nicht nur eine Träne nach, aber das Leben geht weiter…

PS: Die Frage wann die microsoft.public.* Gruppen endgültig verschwinden bleibt natürlich offen. Nicht alle benutzten news.micrsoft.com als Newsserver und NNTP ist nun mal ein verteiltes System. Microsoft wird also eine RMGRPOUP Befehl für seine Gruppen versenden und es bleibt abzuwarten welche Newsserver diesen wirklich ausführen.
Es kann also gut sein, dass uns die microsoft.public.* Gruppen noch eine Weile erhalten bleiben, selbst wenn news.microsoft.com abgeschaltet ist. Nur werden Sie ein Schattendasein fristen und Sicherheit wird der Traffic hier weiter abnehmen, wenn es keinerlei Hinweise mehr von Microsoft selbst auf diese Foren gibt.

Tipps & Tricks: VS-2010 Hilfe aufbohren

Microsoft ist es wirklich gelungen in zwei großen Schritten die VisualStudio Online Hilfe bzw. MSDN Integration von einem brauchbaren Tool in VC6, über VS-2003/5/8 wo es gerade auszuhalten war, in VS-2010 zu einem Ding zu verwandeln, bei dem mir fast die Worte fehlen.
Man schmeiße alle Funktionen des Hilfe-Viewers weg und behalte gerade die F1-Taste… alle Vorteile, die mir als Vorteile verkauft werden (keine separate Installation, alles im gewohnten Browser etc. siehe Video unten), sehe ich nicht als Vorteile gegenüber den Nachteilen, die in Kauf genommen wurden.
Ein vielleicht hartes Urteil, aber es geht seit Jahren in dieser Beziehung leider nur bergab.
– Just my 2 cents – 🙁

Das Erste was ich sofort vermisst habe war in der folgenden Reihenfolge:

  1. Dynamic Help
  2. Table of contents (TOC)
  3. Sync to TOC
  4. Index
  5. Filter
  6. Direkte Suche in VS, oder dem entsprechenden Viewer

Ich bin dann auf im Internet auf die Suche gegangen und wurde mit 2 Tools fündig, die einem hier helfen können:

HelpViewerKeywordIndex

Aber wie angekündigt soll es auch hier Verbesserungen geben. Und das außerhalb der Wartungszyklen des VS (siehe Video unten mit Ryan Linton). Zumindest was den Index betrifft und die Suchmöglichkeit innerhalb von VS betrifft schafft ein kleines Tool von Ryan Linton (wie versprochen seit dem 20.04.) wenigstens etwas Abhilfe, der HelpViewerKeywordIndex.

Mit diesem Tool erhält man zumindest mal wieder den Index und ein Suchfenster in VS.
Auch dass das Sucherergebnis in einen VS-Fenster angezeigt werden kann ist nett. Leider betrifft diese Einstellung nicht die Funktion der F1-Taste. In diesem Fall wird immer noch der externe Browser angeworfen und nicht der interne, oder ich habe die Einstellung nicht gefunden wo man mit der F1-Taste ein Browser Fenster in VS öffnet.
Ganz verstanden habe ich auch die Option „Display TOC in page“ nicht.
Das Tool ist zumindest mal ein kleiner Schimmer eines eventuellen zukünftigen Lichtblicks 😉

Aber wer weiß, vielleicht lässt Version 1.1 von  HelpViewerKeywordIndex nicht lange auf sich warten.

H3Viewer

Mit H3Viewer, von meinem MVP-Kollegen Rob Chandler, bekommt man zumindest mal wieder das, was man in VS-2008 auch hatte. Table of Contents, Sync to contents. Und der Viewer ist nicht im Browser. Mit dem Ding lässt sich leben oder zumindest ersetzt es den Viewer den wir aus VS-2005/8 kannten ziemlich gut. Und ja, es gibt auch hier wieder Bookmarks, die jetzt keine Favoriten Einträge im Browser sein müssen 😉
Besonders gefreut habe ich mich auch über die Funktion im Index die Doubletten zum gleichen Stichwort im Index in einem separaten Fenster wieder angezeigt zu bekommen, denn nicht jeder Treffer zu GetWindowtext ist der den ich suche.
Nett auch die TTS Funktion (Text to Speech)
Hier fehlen jetzt eigentlich nur noch die Filter zum vollständigen Glück.

Aber wer weiß, was Microsoft uns demnächst noch zu bieten hat. Laut der Homepage von H3Viewer hat Microsoft noch bereits einige andere Viewer in der Schublade.

Siehe auch:
http://channel9.msdn.com/posts/kmcgrath/Help-30-New-Help-System-in-Visual-Studio-2010/

Links:
http://visualstudiogallery.msdn.microsoft.com/en-us/4af86641-a302-4edf-9853-007bcc670b30
http://mshcmigrate.helpmvp.com/viewer

SELECT … FROM … WHERE … NOT IN (…) Mystik

Wieder mal ein ganz normaler Wahnsinn, der einen Stunden gekostet hat…

Wenn wir uns die nachfolgenden SQL Statements ansehen, dann würde ich davon ausgehen, dass die ersten 6 eine Ausgabe erzeugen.

SELECT 'Test 1' WHERE 1 IN (NULL, 1, 2, 3, 4)
SELECT 'Test 2' WHERE 1 IN (1, 2, 3, 4)
SELECT 'Test 3' WHERE 1 NOT IN (NULL, 2, 3, 4) -- !!!
SELECT 'Test 4' WHERE 1 NOT IN (2, 3, 4)
SELECT 'Test 5' WHERE NOT (1 IN (NULL, 2, 3, 4)) -- !!!
SELECT 'Test 6' WHERE NOT (1 IN (2, 3, 4))
-- Empty as expected
SELECT 'Test 5' WHERE 1 IN (NULL, 2, 3, 4)
SELECT 'Test 6' WHERE 1 IN (2, 3, 4)

Aber ❗ Pustekuchen ❗
Die Zeilen 3 und 5 erzeugen keine Ausgabe ❗Dadurch, dass in dem Ausdruck in der Klammer NULL enthalten ist funktioniert der NOT IN Test nicht mehr korrekt.

Ich bin darauf gestoßen, weil ich ein Subquery durchgeführthabe und mit NOT IN prüfen wollte, dass ein bestimmter Wert eben nicht in diesem Subquery enthalten ist. Einziges Problem war, dass in einigen Fällen dieser Subquery eben auch NULL als Ergebnis geliefert hat. 
Und genau in diesem Fall funktionierte die Abfrage nicht korrekt (s.o.). Das sah vereinfacht in etwas so aus:

SELECT [ID] FROM [Table1]
    WHERE [SomeData] NOT IN
        (SELECT [OtherIDWithNULL] FROM [Table2])

Ich habe den Subquery dann entsprechende um ein WHERE … IS NOT NULL erweitert und siehe da es ging:

SELECT [ID] FROM [Table1]
    WHERE [SomeData] NOT IN
        (SELECT [OtherIDWithNULL] FROM [Table2]
            WHERE [OtherIDWithNULL] IS NOT NULL)

Rein gefühlt ist das für mich ein Bug, aber es ist keiner ❗
Hier kommt eine Einstellung zum tragen, die sich ANSI_NULL schimpft. (siehe SET ANSI_NULL { ON | OFF })

ANSI_NULL ist im Allgemeinen ON, und das bedeutet, dass ein Vergleich eines Wertes mit NULL immer undefiniert ist. Das ein IN-Statement aber nichts anderes ist als ein Vergleich der einzelnen Werte in der Klammer mit dem Zielwert, führt dies hier zu einem irritierenden Ergebnis. NULL=NULL und 1=NULL ist eben undefiniert und nicht False wenn ANSI_NULL ON ist! Also können die Zeilen 3+5 kein korrektes Ergebnis liefern.
Man beachte: Dies hat keinen Einfluß solange man IN verwendet und nicht NOT IN!

Meine rein persönliche Meinung:
Ich habe selten solch einen Unsinn in einem ANSI-Standard gesehen. Einfach Unlogisch ❗
Für mich ist NULL=NULL und NULL<>AnyThingElse eben True… Just my 2 cents…

Jetzt könnte man meinen, dass es also auch eine Lösung wäre SET_ANSI_NULL OFF zu verwenden ❗ (BTW: Eine Einstellung die auch als Attribut direkt auf der Datenbank selbst gesetzt werden kann). Aber der folgende Hinweis in der Doku sollte einen zum Umdenken bewegen:

Wichtig:
In einer späteren Version von SQL Server wird ANSI_NULLS immer auf ON festgelegt, und jede Anwendung, die für die Option explizit OFF festlegt, löst einen Fehler aus. Verwenden Sie dieses Feature beim Entwickeln neuer Anwendungen nicht, und planen Sie eine Änderung von Anwendungen, in denen es zurzeit verwendet wird.

Da dies also evtl. Einfluss auf andere Codebereiche haben könnte und zukünftig nicht mehr unterstützt wird habe ich auf diese Nutzung verzichtet und lieber das Subquery abgeändert.

PS: Bitte jetzt nicht darauf hinweisen, dass es auch JOIN gibt. Aufgrund der Komplexität der Abfrage und weil diese auch noch nach bestimmten Bedingungen gebaut wurde, war ein IN mit einem Subquery, der einfachere Weg.

Achtung: Die festen Mapping Modes des GDI basieren nicht auf LOGPIXELSX und LOGPIXELSY!

Jeder der mit Fontgrößen und Darstellungsgrößen herumspielt, oder wer selber in Fenstern zeichnet kennt LOGPIXELSX und LOGPIXELSY, die durch GetDevCaps geliefert werden. Diese Werte dienen auch CFont::CreatePointFont und anderen Funktionen bei der Umrechnung von „realen“ Maßen auf die Devicepoints, die man dann benötigt. Alles kein Hexenwerk und überall im Netz beschrieben.
Auf diesem Weg kann man mit etwas MulDiv Arithmetik schnell umrechnen wie viele Punkte man benötigt um etwas von 10mm Größe auf einem Device darzustellen.

Der nachfolgende Code wandelt Einheiten von 1mm entsprechend der Auflösung eines Devices in Pixel um.

pDC->SetMapMode(MM_TEXT);
// Convert mm to with LOGPIXELSX
CSize sizeLogPixel(pDC->GetDeviceCaps(LOGPIXELSX),
            pDC->GetDeviceCaps(LOGPIXELSY));
rect.top = ::MulDiv(rect.top,sizeLogPixel.cy*10,254);
rect.bottom = ::MulDiv(rect.bottom,sizeLogPixel.cy*10,254);
rect.left = ::MulDiv(rect.left,sizeLogPixel.cx*10,254);
rect.right = ::MulDiv(rect.right,sizeLogPixel.cx*10,254);

Die Auflösung von 0,1mm je Einheit ist die Metrik des Mappingmodes MM_LOMETRIC. Man sollte also meinen, dass die Verwendung von MM_LOMETRIC mit einem Faktor 10, der obigen Umrechnung gleich kommt.

pDC->SetMapMode(MM_LOMETRIC);
// Convert mm to 0.1mm
rect.top *= -10;
rect.bottom *= -10;
rect.left *= 10;
rect.right *= 10;

Probiert man dies aus, so stellt man überrascht fest, dass die Größen nicht übereinstimmen.
Der Dokumentation nach müsste man es aber denken.

Mit einem bisschen experimentieren bin ich letztlich auf den Grund gekommen.
Keiner der Mappingmodes MM_LOENGLISH, MM_HIENGLICH, MM_LOMETRIC oder MM_HIMETRIC verwendet LOGPIXELSX oder LOGPIXELSY. Diese Mappingmodes verwenden die Werte HORZRES und VERTRES in dem Viewport-Extent und die Werte HORZSIZE und VERTSIZE im Window-Extent.

D.h. der Viewport-Extent bekommt die Größe des Bildschirmes in Pixeln zugewiesen und das Window-Extent bekommt die Größe des Devices in mm zugewiesen. Nun ist diese Größe (HORZSIZE/VERTSIZE) bei Bildschirmen nicht die reale Größe sondern eine Größe, die der Hersteller festlegt. (Anmerkung: Bei Druckern stimmt dieser Wert)

Nun wäre noch alles OK, wenn sich aus den Werten von VERT/HORZSIZE und VERT/HORZRES nun der Quotient LOGPIXELSX/SY ermitteln ließe. Das ist aber nicht der Fall! LOGPIXELSX/SY sind Skalierungswerte die bei Bildschirmen unabhängig von der realen Auflösung angegeben werden und die z.B. dazu Dienen Schriftgrößen grundsätzlich größer oder kleiner anzeigen zu lassen (siehe auch High DPI Mode).

Die Konsequenz daraus ist, dass die Mappingmodes ein relativ exotisches Einzelleben führen, weil die meisten Entwickler eben korrekterweise auf LOGPIXELSX/SY zurückgreifen. Noch mal sei hier bemerkt, dass für Drucker DCs hier in mir bekannten Fällen kein Unterschied existiert und auch das ist gut so.

Die Lösung die sich anbietet, ist nicht weiter schwierig und sie auch der Grund warum ich erst jetzt auf diesen gesamten Umstand gestoßen bin. Ich habe niemals die MM_LO…/MM_HI… Mappingmodes verwendet. Entweder pur MM_TEXT und wenn ich was anderes benötigt habe einfach MM_ANISOTROPIC, und in der entsprechenden Skalierung habe ich dann meistens die Werte aus LOGPIXELSX/SY verwendet. Also musste es passen.

MM_ANISOTROPIC ist sowieso der Mappingmode der Wahl, wenn es um skalierbare Darstellungen und Zoomfaktoren geht, aber dazu vielleicht mehr in einem Artikel demnächst.

Ich habe ein kleines MFC-Programm gebaut (MappingModeTest), dass diese Konflikte aufzeigt. Ich zeichne dort ein Rechteck auf den Koordinaten 20mm,10mm mit der Größe 60mm,40mm. Damit die verschiedenen Rechtecke alle sichtbar werden verwende ich immer einen Versatz von 1mm und zeichne die Rechtecke in unterschiedlichen Farben.
In der Debugausgabe kann man wunderschön sehen wie Extents mit den Werten aus GetDeviceCaps zusammenhängen.

Dieser Artikel basiert auf zwei Anfragen in microsoft.public.de.vc die dieses unterschiedliche Verhalten aufzeigten und diskutieren:
http://groups.google.de/group/microsoft.public.de.vc/browse_thread/thread/23467a5e95051291/7c66c01b8295eaab
http://groups.google.de/group/microsoft.public.de.vc/browse_thread/thread/201719d23a411256/17b41c09844bf105

VS-2010 steht für MSDN Abonnenten sofort zum Download zur Verfügung

Jetzt wird es ernst 😉
Pünktlich wie angekündigt ist VS-2010 RTM in englisch für MSDN Benutzer verfügbar:
http://msdn.microsoft.com/en-us/subscriptions/downloads/default.aspx?pv=18:370

Die entsprechende Trial Versionen können sofort herunter geladen werden:
http://www.microsoft.com/visualstudio/en-us/download

Auch eine Express Version von VC-2010 ist bereits verfügbar:
http://www.microsoft.com/express/Downloads/

Laut Microsoft sollen Übersetzungen in andere Sprachen noch bis Ende diesen Monates auch zur Verfügung stehen.

Mal einen ganz anderen Blick auf seinen Code werfen mit CppDepend

Vor einiger Zeit habe ich versucht mit einem anderen Werkzeug mal den eigenen Code zu analysieren.
Ich habe CppDepend entdeckt.  http://www.cppdepend.com/

Gerade bei großen Projekten kann man schnell den Überblick verlieren und es ist schwierig die abhängigen Klassen und Objekte in Ihren Verbindungen zu sehen oder mögliche Designprobleme nachträglich festzustellen. Oder den richtigen Ansatzpunkt für Reviews zu finden. Man hat manchmal das Gefühl, dass etwas nicht stimmt, aber man weiß oft nicht genau was.

CppDepend kann helfen schlecht konstruierte Klassen zu finden, Fehler in den Namenskonfentionen oder der Dokumentation und gezielter auf notwendige Reviews hinzuweisen.
Durch eine eigene Abfragesprache ist es extrem einfach große unübersichtliche Funktionen zu finden. Klassen mit zyklischen Abhängigkeiten und extreme Vererbungstiefen aufzuspüren. Besonders einfach wird es zum Beispiel auch Namenskonventionen zu überprüfen. Die eigene Codebase wird durch die Abfragesprache analysierbar.

Ich empfand die graphischen Darstellungen der eigenen Codebasis und die Ergebnisse der Abfragen in diesen Grafiken als extrem anschaulich und nützlich. Weitaus mehr als manche tabellarische Analyse meines Codes.

Einen guten Einblick was hier möglich ist liefern die Case-Studies. Wie zum Beispiel die Analyse der MFC 8.0 (VC-2005) http://www.cppdepend.com/MFC.aspx. Man kann die MFC sicherlich nicht als Glanzstück des OOP bezeichnen, umso mehr ist es mal interessant mit diesem Tool einen Blick auf die MFC zu werfen. Wem das nicht anschaulich genug ist kann sollte sich auch die anderen Case-Studies mal ansehen. Oder noch besser die Software 2 Wochen testen.

Ein gutes Tool, aber leider nicht ganz billig, aber in jedem Fall mal einen Blick wert.

TFSDeleteProject und der Fehler TF30063

Wer nach „TFSDeleteProject TF30063“ googled findet genug Treffer, die eine Lösung anbieten. Viel ist hier nicht mehr dazu zu schreiben.

Hier die für mich wichtigsten Links, für Erklärung und Lösung dieses TFS Problems:
http://blogs.msdn.com/dstfs/archive/2009/08/21/tfsdeleteproject-exe-thwarted-by-windows-sharepoint-services-permissions.aspx
http://vsts-fu.blogspot.com/2008/10/tf30063-you-are-not-authorized-to.html
http://social.msdn.microsoft.com/Forums/en-US/tfsadmin/thread/b5e6a42a-dc22-499c-97e0-4fe5b563d49a/

Der letzte Link beschreibt die Lösung, aber es geht auch etwas schneller ohne sich an die Site und den TFS anzumelden ❗

Wer in die Site-Administration geht wird dort immer den Benutzer TFSSETUP als Site Collection Administrators vorbelegt finden.
Anstatt nun den eigenen Account in die Sharepoint Site Collection Administrators und in die Team Foundation Administrators einzutragen, kann man dem Account TFSSETUP auch die Rechte geben sich lokal an einem beliebigen Rechner anzumelden auf dem VS-2008 installiert ist. Das geht am einfachsten wenn man den TFSSETUP Account in die Gruppe Benutzer/Domänen-Benutzer aufnimmt.
Oft wird dies bei der Installation und dem Anlegen des Accounts nicht einmal eingeschränkt, bzw. der Account ist bereits Domänen-Benutzer 😉
Also als TFSSETUP anmelden und schon läuft der TFSDeleteProject ohne Probleme.

PS: Wenn man es richtig macht nimmt man dem TFSSETUP Account hinterher wieder das Recht für lokales Anmelden, den er benötigt es nicht im Gegensatz zu TFSSERVICE… 😉