VS Tipps & Tricks: Kontextmenü für Refactor Befehle in VA-X ab Build 1557

Die Refactoring Befehle in VA-X sind ja schon länger bekannt und sind wirklich ein prima Feature (Build 1534 seit 09.2006).

Nur war es manchmal etwas trickreich an diese Befehle zu kommen. Meistens habe ich die Maus verwendet und über dem Symbol platziert und gewartet, bis das entsprechende Dropdown Symbol aus VA-X erschien. Intuitiv und schnell war das nicht.

Seit dem Build 1557 (052007) finden sich die Refactoring Befehle direkt als erster Menüpunkt im normalen Kontextmenü und sind damit auch über die Tastatur direkt mit der Kontextmenütaste (oder Umschalt+F10) zu erreichen. Ein Grund mehr sich diese Funktionen wirklich mal anzusehen. Sie sind wirklich einen Tipp wert!
Meine Favoriten im Refactoring Menü sind immer wieder Find References und Rename.

Und für alle die meinen ich habe was vergessen oder übersehen: 😉

  • Es gab zwar seit dem Build 1540 einen entsprechenden Befehl den man einem Hotkey zuordnen konnte, aber allzu viele Hotkeys passen in meinen Kopf auch nicht rein.
  • Ja und man kam an diese Befehle auch über Umschalt+Kontextmenütaste erhalten. Nur ist das komplette VA-X Menü leider etwas unaufgeräumt und groß.

TFS: Alle Jobs des SQL Agents für den TFS laufen nicht

Nach der Installation des TFS war im Event Log alle 10 Minuten der folgende Fehler zu lesen:

Ereignistyp:       Warnung
Ereignisquelle:    SQLSERVERAGENT
Ereigniskategorie: Job Engine
Ereigniskennung:   208
Datum:             12.09.2007
Zeit:              12:00:00
Benutzer:          Nicht zutreffend
Computer:          SVR-02
Beschreibung:
SQL Server Scheduled Job ‚TfsWorkItemTracking Process Identities Job‘ (0x152D401A0604DF4D984F5835301DA43F) – Status: Fehler – Invoked on: 2007-09-12 12:00:00 – Message: Auftragsfehler  Es kann nicht bestimmt werden, ob der Besitzer (‚Domäne\TFSSETUP‘) von Auftrag ‚TfsWorkItemTracking Process Identities Job‘ Serverzugriff aufweist. (Ursache: Die Informationen über Windows NT-Gruppe oder -Benutzer ‚Domäne\TFSSETUP‘ konnten nicht abgerufen werden, Fehlercode 0x5. [SQLSTATE 42000] (Fehler 15404)  Die Anweisung wurde beendet. [SQLSTATE 01000] (Fehler 3621)).

Der selbe Fehler wurde auch für alle anderen TFS Jobs angezeigt, die im SQL-Agent eingetragen wurden.
Ganz verstehen kann ich den Fehler bis heute noch nicht. Nicht wenige kämpfen mit diesem Problem, wenn man im Internet nach dem Fehler sucht. Direkte Lösungen dazu habe ich nicht gefunden.
Warum nicht korrekt geprüft werden kann, ob die entsprechenden Accounts in der Domäne sind oder nicht ist mir ein Rästel. Der Fehlercode 5 heißt: Zugriff verweigert.

Die Jobs wurden im SQL Server unter dem Benutzer Domäne\TFSSETUP eingetragen. Der entsprechende Benutzer TFSSETUP ist korrekt Mitglied der Domäne und auch Administrator auf der lokalen Maschine auf der sowohl TFS als auch MS-SQL Server 2005 läuft. Warum dieser Account genutzt wurde und nicht TFSSERVICE ist mir ein Rätsel.
OK, aber selbst wenn ich TFSSERVICE als Besitzer wähle funktionieren die Jobs nicht.

Nachdem ich die Jobs auf NT-AUTORITÄT\SYSTEM gesetzt habe ging es dann.
Verstehe wer will.

PS: Wer meint, dass es an dem Recht „Anmelden als Dienst“ liegt, der rät falsch. Der Account TFSSERVICE hat dieses Recht und damit hatte ich auch keinen Erfolg. 

PPS: Meine Installation ist gemischt und funktioniert aktuell ohne Probleme:
Windows 2003 R2 Deutsch
SQL Server 2005 Deutsch
TFS in Englisch
Nur als Anmerkung, da ich einem der letzten Kommentare noch die Absicht hatte, die Installation auf Englisch Pur umzustellen.

VS-Tipps & Tricks: Der Property Manager, der unbekannte Helfer.

Es gibt oft genug die Problematik, dass man eine bestimmte Environment Variable für ein Projekt setzen will, oder auch dass man für eine Gruppe von Projekten ein bestimmtes Include-Verzeichnis hinzufügen will oder bestimmte andere Projekteinstellungen benötigt.

Der bisherige Weg war meistens Handarbeit wenn es um die Projekteinstellungen ging. Bei Environment Variablen hatte man oft genug wenig Chancen.

Ein Weg ist es, einen Batch File zu schreiben, der die Environment Variablen setzt und dann die IDE mit DEVENV /useenv startet. In diesem Fall werden nur die entsprechenden Environment Variablen für LIB/INCLUDES etc. verwendet. Zusätzlich natürlich auch die eigenen spezifizierten.
Das hat aber den Nachteil, dass man nicht vergessen darf die IDE zu verlassen und neu zu starten hat, bevor man ein neues „normales“ Projekt bearbeiten will.
Summa summarum: Geht, ist aber kein guter Weg.

Es gibt eine weitaus effektivere Möglichkeit Projekteinstellungen einfach zu manipulieren und auch einfach für andere Projekte zu übernehmen: Der Property Manager!

Mit dem Property Manager kann man Projekteinstellungen erzeugen und zusammenfassen. Diese Projekteinstellungen lassen sich in einer XML Datei abspeichern (vsprops-Dateien) und auf andere Projekte auf einfache Art anwenden indem man nur die entsprechende Datei in das Projekt in den Projekteinstellungen einfügt.

Das nette ist, dass der Property Manager es auch erlaubt Environment Variablen zu setzen, die dann in den Optionen und auch den Custom-Build-Steps auf einfache Weise über $(MyUserMacro) nutzen lassen.

Und so geht man vor:

  • Über View -> Other Windows holt man sich den Property Manager auf den Bildschirm. Man kann nun sofort sehen welche aktuellen Properties gesetzt sind. (Zum Beispiel sieht man sofort woher zum Beispiel bei konvertierten Projekten das define _VC80_UPGRADE kommt)
  • Man findet zwei Schalter Add New Project Property Sheet um ein neuen Satz Properties anzulegen und Add Existing Property Sheet um ein bereits existierendes Property Sheet anzuwenden (dazu später).
  • Nun kann man einfach wie man es gewohnt ist, die gewünschten Eigenschaften in diesem Sheet einstellen, die man benötigt. Rechter Mausklick oder Doppelklick genügt und man erhält Zugriff auf alle Eigenschaften der Projekte. Ob es nun den Compiler oder Linker betrifft ist egal.
  • Wichtig ist gleich der zweite Eintrag User Macros. Hier kann man nun nach Lust und Laune Environment Variablen und andere defines setzen. Besonders interessant ist hier auch die Möglichkeit Werte anzuhängen an eine bestehende Environemt Variable. Nett für INCLUDE und LIB!

Zuletzt sei erwähnt, dass sich eine solche vsprops Datei auch einfach in ein bestehendes Projekt eingefügt werden kann. Das geht zum einen über den Property Manager mit dem schon erwähnten Schalter Add Existing Property Sheet , oder aber auch direkt über die Projekteinstellungen. Dazu einfach die Projekteigenschaften öffnen und den Abschnitt General auswählen. Dort findet man den Eintrag Inherited Projekt Property Sheets in dem man direkt die entsprechenden vsprops Dateien angeben kann.

❗ Man sollte aber auch daran denken, diese speziellen vsprops Dateien dem eigenen Source Control System hinzuzufügen und auch eine entsprechende Dokumentation dazu anzulegen.
Gut ist es auch ein zentrales Verzeichnis für diese Projekteinstellungen anzulegen um eine einfache Wiederverwendung zu ermöglichen.

Auf einmal Zertifikatsfehler im IE…

Ich komme nach Hause und schmeiße meine Kiste an.
Ich logge mich ein und bekomme als erstes von NOD32 gesagt, dass meine Signaturdatenbank veraltet ist. Komisch, ein Blick in die Konsole ergibt: Die Signaturdatenbank ist von heute.

Dann schmiert ein Programm in der Autostart Gruppe sofort ab, dass mit die täglichen Losungen anzeigt.

OK. Ich starte den IE und bekomme sowohl auf der Google-Seite als auch auf der Ebay Seite sofort Zertifikatsfehler angezeigt. Jetzt wird es aber zu bunt!
Was ist los? Windows Update geht auch nicht…

Ich bin am verzweifeln. Ich mache mich schon darauf gefasst den ganzen Rechner neu aufsetzen zu müssen, da fällt mein Blick auf die Datumsanzeige… 13.09.2164.

So ein Schrott. Meine Tochter hat anscheinend aus Versehen das Datum des Systems verändert! Alles andere war eine Folge dieses falschen System-Datums. Uffff…

Sicherheitsupdate für Microsoft Visual Studio 2005 Service Pack 1 (KB937061) wird immer wieder installiert

Vielleicht geht es einigen von Euch genauso und bekommt von Windows Update das „Sicherheitsupdate für Microsoft Visual Studio 2005 Service Pack 1 (KB937061)“ immer wieder installiert.

Scheinbar trifft es alle diejenigen, die sich Crystal Reports nicht angetan haben, wie z.B. mich. Alle meine 4 Rechner (Vista+XP x86) sind davon betroffen. Dies entnahm ich den Infos eines Microsoft MSFT’s aus diesem Thread. Zitat:

Eric Brodish [MSFT]
If you have VS 2005 SP1 present but the Crystal Reports feature is not present, MS07-052 is re-offered. Customers are protected and are not at risk to this vulnerability We will be updating the detection on Microsoft Update, customers that have already installed this update need to take no action.  We are working to resolve this issue and it should be fixed shortly Thank you Eric

Gleiches scheinen andere auch herausgefunden haben in den MS-Foren

Wie stellt man es ab?

  • Einfach über den IE die Microsoft Update Seite aufrufen.
  • Benutzerdefinierte Suche starten
  • Die Updates anzeigen lassen
  • Den Haken entfernen und zusätzlich den Haken bei „Dieses Update nichtmehr anzeigen“ setzen.

Beschreibung dieses Security Updates:
http://support.microsoft.com/kb/937061

Die Cx2y Falle…

In einem Programm habe ich diese unscheinbare Schleife für eine spezielle Analyse im Debug-Mode eingebaut.

for (POSITION pos= m_aBind.GetHeadPosition(); pos; )

 S_BIND& b= m_aBind.GetNext(pos);
 TRACE(__FUNCTION__ “  %-32s %2d\n“,
  CT2A(b.sName.GetString()),
  b.GetStatus());
}

Sieht auf den ersten Blick OK aus.
Auf den zweiten Blick wundert einen evtl. die Nutzung von CT2A. Warum nehme ich nicht einfach den Zeiger von GetString wie er ist? Es ist ja ein PCTSTR! Begründung:

  1. Das Projekt ist ein Unicode Projekt. 
  2. CT2A verwende ich hier, weil die TRACE Funktion in dieser Schreibweise nur MBCS Strings verwendet. D.h. %s erwartet einen Zeiger auf einen MBCS String.
  3. Die _T Schreibweise für die Ausgabemaske ist hier nicht geeignet, weil ich gerne den Funktionsnamen auch mit ausgegeben hätte. Und __FUNCTION__ ist nun mal eine normale String-Konstante, und kein wchar_t-String.
  4. T2A verwende ich nicht, weil dies in einer Schleife tödlich ist, weil der Stack immer weiter anwächst.

OK! Soweit dazu, warum der Code aussieht wie er aussieht.

❗ Nur… es kommt nur Schrott dabei heraus!
Die Ausgabe zeigt brav, den Text, den ich haben möchte, nur die Zahlenwerte stimmen in keiner Weise mit den Rückgabewerten von GetStatus überein! Warum? ❓

Was ist passiert? Der Debugger gibt schnell Auskunft:
CT2W erzeugt ein Objekt vom Typ CW2AEX!!! Dieses Objekt ist aber größer als ein PCSTR Zeiger. Dieses Objekt umfasst bei meinen Projekteinstellungen 4 Bytes für einen Zeiger plus einen char-Array der Größe 128. TRACE hätte aber gerne einen 4-Byte Zeiger auf dem Stack und danach für die Ausgabe einen Integer.
Ausgegeben, werden also die 4 ersten Bytes des Puffers von CW2AEX und nicht die gewünschten numerischen Werte für GetStatus!

Das ist übrigens die selbe Falle in die man tritt, wenn man CString direkt ohne CString::GetString in printf/TRACE und Konsorten verwendet. Nur hat man hier das Glück, dass ein CString exakt 4 Bytes groß ist und genau aus einem Zeiger auf einen PTSTR besteht.

Wie macht man es richtig?
Genau… man führt den entsprechenden cast ein. Der cast benutzt nun den cast-Operator der Klasse CW2AEX, und der liefert uns den Zeiger den wir wollten.

for (POSITION pos= m_aBind.GetHeadPosition(); pos; )
{
 S_BIND& b= m_aBind.GetNext(pos);
 TRACE(__FUNCTION__ “ %-32s %2d\n“,
  static_cast<PCSTR>(CT2A(b.sName.GetString())),
  b.GetStatus());
}

Amerkungen:

  • Ich brauche wahrscheinlich nicht zu erwähnen, dass ähnliche Probleme mit CA2W, CA2T etc. auch auftauchen können.
  • An den meisten Stellen an denen, wir diese Konvertierungen, wie z.B. CT2A verwenden wird auch direkt ein PCTSTR erwartet, oder eben ein Zeiger auf den entsprechend konvertieren String. Dadurch wird implizit der Konvertierungs-Operator der Klasse aufgerufen und damit funktioniert ales wie es soll.
  • Auch wenn das Projekt ein MBCS Projekt gewesen wäre, hätte es die selben Probleme verursacht. Denn in diesem Fall wird aus CT2A eine Objekt der Klasse CA2AEX. Im Gegensatz dazu würde T2A einfach zu ener Noop.

VS-Tipps & Tricks: Schnelle Navigation über Strg+Tab

Wenn man mit dem, aus anderen MDI-Applikationen bekannten, Tasten Strg+Tab in andere Dokumente wechselt, dann wird auch ein Navigationsfenster angezeigt. Am Anfang wunderte mich, was das für ein Geflackere war, wenn ich wie gewohnt Strg+Tab und Umschalt+Strg+Tab verwendete. Bis ich entdeckte, dass man das geöffnete Navigationsfenster noch weitaus besser nutzen kann als nur als Navigationshilfe, wo man mit dem nächsten Strg+Tab landet.

Sofort nach Drücken der Tasten Strg+Tab, kann man bei gedrückter Strg-Taste in dem Navigationsfenster über die Cursor-Tasten jede beliebige offene Datei auswählen, ohne x-mal Strg+Tab zu drücken. Besonders nett ist, dass man auch die Pfeil-Rechts und Pfeil-Links Tasten nutzen kann.

Besonders interessant ist hier, dass man auch die Toolfenster, wie z.B. den Solution-Explorer, den Ressource-View, oder im Debugger den Call-Stack sofort erreichen kann (auch wenn es dazu direkte Hotkeys gibt).

Neues für VC++ 2008 Express

Irgendwie habe ich es gar nicht mitbekommen, aber VC++ Express wird mit der 2008er Version endlich ein „brauchbareres“ Produkt auch für Win32-Entwicklung.

Es wird endlich entsprechende Wizards geben für Win32 Projekte wie, DLLs, statische Libraries etc.
Nur scheinbar scheint der Resource-Editor nicht den Weg in die Express Version gefunden. Auch die MFC+ATL wird nicht Bestandteil der Express Versionen.

Da es keinen RC Kandidat geben wird, befürchte ich, dass der Resource-Editor leider aus dem Produkt draußen bleiben wird. Schade!

Nachzulesen hier:
http://blogs.msdn.com/somasegar/archive/2007/08/11/what-s-new-with-visual-studio-2008-express-editions.aspx
http://blogs.msdn.com/nikolad/archive/2007/07/26/what-s-new-in-visual-c-2008-express-for-beta-2-release-of-visual-studio-2008.aspx

VS-Tipps & Tricks: Das Menü mit der Liste der offenen Dateien anzeigen

Visual Studio 2005, zeigt nur einen Teil der offenen Dateien, in den Tabs über dem Editor.
Man sieht dort immer nur, die zuletzt verwendeten Dateien. In der Tabulatorleiste rechts außen findet sich ein Drop-Down-Schalter, mit dem man die Liste aller offenen Dateien anzeigen kann. Gerade wenn man mit vielen Dateien arbeitet ist man oft verzweifelt auf der Suche wo die eben noch offene Datei abgeblieben ist.

Dazu muss man aber nicht zu der ungeliebten Maus greifen, auch dafür gibt es einen netten und schnellen Hotkey:
Strg+Alt+Pfeil Unten, über einen Buchstaben, kann man auch in diesem Menü, schnell eine Datei auswählen.

VS-Tipps & Tricks: Tastatureinstellungen einfach auf einen anderen Rechner übernehmen

Unter dem Tools Menüpunkt verbirgt sich eine der schönsten Funktionen der Visual-Studio IDE: Import and Export Settings…

Wenn hat es nicht schon geärgert, wenn man kurze Zeit an einem anderen Rechner sitzt (ja man hat nicht immer Roaming Profiles) und man vermisst die so geliebten individuell eingestellten Shortcuts. Früher hieß dass irgendeinen mysteriösen Registry Ast zu sichern und zu importieren. Heute?

Kein Problem! Auf meinem USB-Stick befindet sich eine Datei Keyboard.vssettings. Mit dieser netten Datei stelle ich sofort meine Einstellungen wieder her. Wie?

Zuerst einmal ertsellen wir diese nette XML-Datei:

  • Dazu wählen wir Tools -> Import and Export Settings…
  • Wir wählen Export selected environment settings
  • Dann wählen wir alles ab indem wir in die Checkbox von All Settings klicken.
  • Jetzt wird in dem Baum unter All Settings -> Options -> Environment -> Keyboard die Checkbox angeklickt.
  • Die Datei speichert man unter einem sinnvollen Namen in C:\Dokumente und Einstellungen\UserName\Eigene Dateien\Visual Studio 2005\Settings

Für den Import geht man so vor:

  • Die Datei kopiert man am einfachsten in den Ordner C:\Dokumente und Einstellungen\UserName\Eigene Dateien\Visual Studio 2005\Settings auf der entsprechenden Maschine. (kann man sich auch sparen und die Datei auf dem Stick lassen)
  • Dann wählen wir Tools -> Import and Export Settings…
  • Wir wählen Import selected environment settings
  • Speichern der aktuellen Einstellungen wenn man will
  • Jetzt sieht man schon die Datei, wenn man Sie in den Ordner kopiert hat, oder man selektiert sie nun direkt vom USB-Stick.
  • Auswählen, was man importieren will. Hier sind natürlich nur die Keyboard settings zu sehen und schon selektiert.
  • Finish und wir haben unsere Einstellungen. Super!

BTW: Dieser Weg eignet sich auch ideal um festzustellen, was man eigentlich umdefiniert hat. Die XML-Datei enthält nur die Änderungen zum angewählten Profil. Damit kann man auch mal wieder auf die Suche gehen, was eigentlich von einem selbst stammt, oder eben Standard ist…