Visual Studio ohne Visual Assist ist wie Windows ohne SpeedCommander. Im Blog von Whole Tomato ist nun zu lesen, dass mit einer Version für Visual Studio 2010 in den nächsten ein bis zwei Wochen gerechnet werden kann.
Stingray gibt’s immer noch
Stingray war Mitte/Ende der neunziger Jahre zusammen mit Dundas einer der führenden Anbieter für MFC-Komponenten. Ich kann mich noch genau daran erinnern, wie perplex ich damals war, als mich unmittelbar nach einer Bestellung Scott Wingo (Mitbegründer von Stingray und MFC-Experte) anrief und mir für die Bestellung dankte.
Im Januar 1998 wurde Stingray dann von Rogue Wave übernommen. Anfangs lief alles wie gewohnt weiter, aber nach einem Jahr wurden die Strukturveränderungen dann sichtbar. Die Stingray-Produktreihe war plötzlich nur noch eine unter vielen, die Preise stiegen an und auch die Aktualisierung der Komponenten verlangsamte sich spürbar. Das war dann der Moment, in dem ich mich nach anderen Alternativen umgeschaut und bis 2003 die BCGControlBar verwendet habe.
Heute kam wieder ein Newsletter von Rogue Wave, in dem die Verfügbarkeit von Objective Studio 10.2 angekündigt wird. Beim Anschauen der Demos fand ich mich in der Vergangenheit wieder. Im Vergleich zu der letzten von mir gekauften Version 6 vor 10 Jahren hat sich kaum etwas geändert. Alles scheint auf dem Stand von Office 2000 stehengeblieben zu sein.
Kurz nach dem Erscheinen von Windows 7 ermöglicht die Preview von Objective Studio 11, dass sich Symbolleisten, Menüs und Bedienelemente wie die von nativen Vista-Applikationen verhalten. Bei Erscheinen von Windows 8 kommt dann sicher auch Unterstützung für Windows 7.
Mein Interesse an einem Produkt lässt auch spürbar nach, wenn Preisinformationen nicht öffentlich sichtbar sind und diese erst nach einer Registrierung angefragt werden können. Wenn ich mir die in der eMail aufgelisteten Preise anschaue, dann erschließt sich auch, warum Rogue Wave das so handhabt.
Objective Toolkit kostet in der 32-bit Ausführung 1.045 €, die 32/64-bit Variante ist für 1495 € erhältlich. Für das ganze Studio (Toolkit, Edit, Views, Chart, Grid) zahlt man 2495 € in der 32-bit Ausführung und 3395 € für die 32/64-bit Kombination. Die Preise verstehen sich netto zzgl. der entsprechenden Mehrwertsteuer. Das braucht man wohl nicht mehr zu kommentieren, wenn man sich mal die Preise von Codejock und BCGSoft anschaut. Das Produkt des damaligen Mitbewerbers Dundas gibt es übrigens mittlerweile für lau.
MSSQL-Datenbanken sichern
Mit Datenbankprogrammierung hatte ich bisher weniger zu tun. Einzige Ausnahme war das kleine Programm SpeedCD, welches seine Daten in einer dBase-Datenbank abgelegt hat. Aber das ist schon lange her, damals war ich noch glücklich mit Turbo Pascal für Windows.
Meine Erfahrungen mit dem MSSQL-Server beschränken sich daher auf das Ausführen eines Installationsprogramms sowie das Installieren eines Servicepacks. Mehr war für das Aufsetzen des TFS vor einem Jahr auch nicht nötig. Ich hatte aber keinen blassen Schimmer, wie man die Datenbankdateien mit Boardmitteln sichert und wiederherstellt. Ab und zu soll es ja mal passieren, dass einen die Daten aus unerfindlichen Gründen verlassen oder man im TFS etwas macht, was man hinterher tief bereut. Sicherungen sollen da helfen.
Glücklicherweise fand ich in der c’t einen Hinweis auf das Programm DBSave. Die der Zeitschrift beiliegende ältere Vollversion war leider etwas eingeschränkt, sie sicherte nur eine Datenbank. Eine Lizenz der aktuellen uneingeschränkten Version kostet 49 Euro. Wenn man aber nur eine Serverinstanz hat und auf automatische oder inkrementelle Sicherungen verzichtet, dann kann man DBSave auch als Freeware einsetzen (kommerziell und privat). Beim ersten Start muss dann die Eingabe des Freischaltcodes abgebrochen werden.
DBSave präsentiert sich als Formularanwendung mit mehreren Registerkarten. Auf der ersten Seite wird der Name des SQL-Servers eingetragen. Nach erfolgreicher Verbindungsaufnahme werden die Datenbanken angezeigt:
Die dritte Seite fragt das Ziel der Sicherung ab. Unterhalb des Ordners wird dann für jede Datenbank ein eigener Ordner erstellt, in dem die Sicherungsdaten abgelegt werden:
Ist alles eingetragen, dann kann man die Konfiguration über die Symbolleiste speichern. Der Start der manuellen Sicherung ist etwas schwer zu finden, da er über das Kontextmenü des Symbols im Infobereich erfolgt:
Der Abschluss der Sicherung wird über eine Statusmeldung mitgeteilt:
Die Sicherung erfolgt im laufenden Betrieb, am SQL-Server muss nicht herumgespielt werden. Also genau das richtige für einen, der sich nicht weiter auskennt.
Screenshots unter Vista
z42 fragte gestern in einem Kommentar zu Projektspezifischen Umgebungsvariablen, mit welchem Programm ich die Screenshots unter Vista mache. Bis einschließlich Windows XP habe ich immer SnagIt v6 verwendet, was auch schon etwas älter ist. Mit Vista hatte SnagIt aber so seine Probleme, auch die neueren Versionen haben bei Dialogen nicht immer 100%ig funktioniert.
Während den Anfängen der Vista-Programmierung habe ich oft im Blog von Kenny Kerr gelesen und somit auch die Entwicklung seines Screenshot-Tools Window Clippings mitverfolgt. Im Gegensatz zu anderen Programmen entfernt Window Clippings den durchscheinenden Hintergrund unter Vista (z.B. bei Titelzeilen) automatisch, so dass auf den Screenshots keine Unschönheiten auftauchen. Das Programm kann natürlich auch eine ganze Menge mehr, aber das ist alles auf der Webseite beschrieben.
Mit der Version 2.0 wurde die Software kostenpflichtig, $18 sind aber ein fairer Preis.
Wir sind ja nicht von der Post
Das sagte gestern früh der UPS-Mensch, als er mir ein am Dienstag bei Intel Press bestelltes und am Mittwoch verschicktes Bücherpaket in die Hand drückte und ich es einfach nicht glauben konnte, dass die Auslieferung so schnell erfolgte.
Wer das bis zum 30. Juni geltende Angebot auch noch wahrnehmen möchte: Zu den $69,95 für die beiden Bücher kommen noch einmal $26,00 für die UPS-Expresszustellung (einzige Versandoption) sowie knapp 15 Euro Zollgebühren (bei Übergabe fällig). Eins der beiden Bücher (Multi-Core Programming) gibt es ab Mitte Juni auch in Deutsch, bei Amazon wird es bereits für 54,90 Euro gelistet.
Erster Treffer
Letzte Woche hatte Ralf mir von einem Absturz in SpeedCommander berichtet, der während der Deinstallation eines Windows-Updates auftrat. Anhand des mitgelieferten Mini-Speicherabbilds konnte ich erkennen, dass der Absturz während einer Dateisystemaktualisierung auftrat, und zwar während der Bearbeitung der Datei ‘ntldr’. Der eigentliche Absturz erfolgte in der Windows-Funktion StrCmpI beim Test auf eine bestimmte Erweiterung.
Erst kam mir das etwas merkwürdig vor, da diese Funktion zum Erweiterungstest ja sehr häufig verwendet wird. Beim anschließenden manuellen Aufruf mit dem Dateinamen ‘ntldr’ erkannte ich dann das Problem. Ich hatte die Dokumentation zu PathFindExtension nicht korrekt gelesen und den Rückgabewert nur auf einen NULL-Zeiger geprüft und nicht auch noch auf einen leeren String.
Damit wurde der zurückgegebene Zeiger auch bei einer nicht vorhandenen Erweiterung um eins erhöht (um den Punkt zu überspringen) und fleißig gegen eine Liste mit bekannten Erweiterungen verglichen. Im normalen Betrieb war der nachfolgende Speicherbereich wohl immer gut gefüllt und damit gültig. Im minimierten Zustand räumt Windows aber immer wieder Speicher frei, was dann zur Zugriffsverletzung führte.
Ohne Mini-Speicherabbild wäre die Fehlersuche sehr viel schwieriger geworden, weil die wichtigen Begleitumstände unbekannt bleiben. Die neue Funktion hat sich also schon gelohnt.
TortoiseSVN: Kontextmenü ohne Icons
Ich habe schon immer eine Abneigung gegen die Anzeige von Symbolen im Explorer-Kontextmenü. Das hatte anfangs damit zu tun, dass dieses Menü dafür einfach nicht vorgesehen war und diese Symbole aufgrund der beschränkten Möglichkeiten in der Regel nur 14 Punkte groß waren und mit maximal 16 Farben angezeigt wurden. Meistens brauchte man also viel Phantasie, um eine mögliche Information erkennen zu können.
Mit der Zeit waren aber immer mehr Programmierer der Meinung, mit einem entsprechenden Symbol punkten zu können. Ein Farbklecks mag ja bei einem Menü ohne weitere Symbole noch herausragen, aber bei vielen Farbklecksen fällt die Auswahl schon schwerer.
Unter Vista sind die einzelnen Kontextmenü-Einträge etwas größer, was vermutlich mit dem Befehl Als Administrator ausführen zusammenhängt. Dieser Befehl enthält als einziger ein Symbol, was wohl mit seiner besonderen Bedeutung zusammenhängt. Anfangs war das etwas ungewohnt, aber mit der Zeit empfand ich die Menüs aufgrund der größeren Abstände auch als besser lesbar.
Nach der Installation von TortoiseSVN sah das Kontextmenü aber plötzlich ganz anders aus. Die Abstände zwischen den Einträgen waren extrem verkürzt, zudem ist das Schneckensymbol Schildkrötensymbol (Korrektur) in meinen Augen nicht wirklich eine Augenweide, vom fehlenden Abstand zwischen Symbol und Text mal ganz abgesehen:
Beim Stöbern im Quellcode von TortoiseSVN fand ich glücklicherweise eine Option, über die man das Verhalten im Kontextmenü steuern kann:
REGEDIT4
[HKEY_CURRENT_USER\Software\TortoiseSVN]
“OwnerdrawnMenus”=dword:00000002
Damit unterlässt es TortoiseSVN, die Proportionen vom Kontextmenü zu verändern und fügt keine eigenen Symbole hinzu. So gefällt mir es dann wieder.
Von SourceSafe zu Subversion
Seit mehr als 11 Jahren nutze ich Visual SourceSafe als Quellcodeverwaltung, letzte Woche habe ich meine Projekte auf Subversion umgestellt. Als SourceSafe-Geschädigter muss man sich aber erst einmal an das neue Modell gewöhnen. Unter SourceSafe checkt man die zu bearbeitenden Dateien einzeln oder in Gruppen aus, editiert sie und checkt sie dann wieder ein. Eingecheckte Dateien werden mit einem Schreibschutz-Attribut versehen und können daher nicht einfach so bearbeitet werden. Damit das Auschecken funktioniert, muss Visual Studio eine ständige Verbindung zum Server mit der Quellcodeverwaltung haben. Arbeitet man mal unterwegs, dann simuliert Visual Studio ein Auschecken, indem es das Schreibschutz-Attribut der lokalen Datei entfernt. Beim nächsten Andocken an den Server werden die Dateien dann richtig ausgescheckt.
Mit Subversion ist das alles ein wenig anders. Nach dem Abruf einer Arbeitskopie vom Subversion-Server kann man Dateien beliebig editieren. Sind die Änderungen abgeschlossen, werden die Dateien wieder auf den Subversion-Server übertragen. Dieser speichert dann nur die Unterschiede und hält so seine Datenbank möglichst klein. Eine Verbindung zum Subversion-Server muss nur während des Abrufens/Aktualisierens der Arbeitskopie und des Übertragens zurück bestehen. Damit lässt es sich auch problemlos unterwegs arbeiten.
Die Unterstützung von mehreren Entwicklungszweigen (Branches) ist in SourceSafe quasi gar nicht vorhanden. Zudem wird die Verbindung eines Projekts zur Quellcodeverwaltung direkt in der Projektdatei gespeichert, was die Ablage von Projektkopien in anderen Ordnern (z.B. bei einem neuen Release) sehr erschwert. Wenn man dann die Verbindung nicht löst, möchte Visual Studio immer die Verbindung zum Originalprojekt herstellen.
Mit Subversion gibt es diese Probleme nicht. Verschiedene Entwicklungszweige sind einfach zu verwalten, auch die Übernahme von Änderungen in andere Zweige ist problemlos möglich. Die Projektdateien sind anderen Dateien gleichgestellt und enthalten keine datenbankspezifischen Informationen mehr.
Das ermöglicht es mir jetzt endlich, ein paar Wochen vor der Veröffentlichung eines Updates einen separaten Zweig dafür zu erstellen, die aktive Entwicklung dafür einzustellen und wirklich nur noch nötige Korrekturen vorzunehmen. Die normale Entwicklung an der nächsten Version kann dann schon weitergehen, ohne auf das geplante Update Einfluss zu nehmen. Damit entfällt nun auch die Wohlverhaltensperiode vor und nach dem Release, in der ich mich zwingen musste, meine Finger im Zaum zu halten. Treten nach dem Update doch noch unerwartete Fehler auf, so können diese im separaten Zweig behoben und schneller als Fix zur Verfügung gestellt werden.
Die Einrichtung von Subversion ist sehr einfach. Nach der Installation wechselt man in der Kommandozeile in das bin-Verzeichnis und richtet svnserver.exe als Dienst ein:
sc create svnserve binPath= “C:\Programme\Subversion\bin\svnserve.exe –service -r D:\Projekte\Subversion” DisplayName= “Subversion” depend= tcpip start= auto
Anschließend muss nur noch ein neues Projektarchiv erstellt werden. Alternativ kann man sich auch das Rundum-Sorglos-Paket VisualSVN Server herunterladen. Dieses installiert einen Apache-Server samt Subversion-Integration und erstellt auch gleich das Projektarchiv. Damit hatte ich meine ersten Gehversuche gemacht, bin aber anschließend auf die performantere Dienst-Methode umgestiegen.
Auf dem Client-Rechner wird TortoiseSVN installiert, damit erfolgt der Zugriff auf die Quellcodeverwaltung bequem aus SpeedCommander (oder dem Explorer) heraus. Für die Integration in Visual Studio empfiehlt sich VisualSVN. Die Einzellizenz kostet $49 und macht sich schnell bezahlt.
Letztlich kann ich jedem SourceSafe-Anwender nur empfehlen, auf Subversion zu wechseln. Beim Einstieg beantwortet die umfangreiche Dokumentation viele Fragen, für die ersten Gehversuche kann man sich ein Projektarchiv zum Spielen einrichten. Mit einer möglichen Konvertierung der SourceSafe-Datenbank habe ich mich nicht beschäftigt, ich wollte einen frischen Start ohne Altlasten.
SysLink-Control unter Windows 2000
Mit Hilfe des SysLink-Controls lassen sich anklickbare Hypertext-Elemente in einem Fenster darstellen. Die Formatierung des Textes erfolgt mit Hilfe von <a>anklickbarer Text</a>-Tags. Bei Aktivierung durch Maus oder Tastatur wird das Elternfenster informiert und es kann die jeweilige Aktion durchführen. Leider ist das SysLink-Control erst ab der ComCtl32.dll V6 enthalten und lässt sich so nur ab Windows XP verwenden.
Unter Windows 2000 gibt es ebenfalls ein SysLink-Control. Es ist aber nicht Bestandteil der ComCtl32.dll, die Implementierung erfolgt in der Shell32.dll. Mit Hilfe der Funktion LinkWindow_RegisterClass lässt sich das Control registrieren und verwenden. Der hauptsächliche Unterschied zum SysLink-Control von Windows XP ist der Name der Fensterklasse. Unter Windows XP heißt das Control SysLink, unter Windows 2000 Link Window. Zudem unterstützt die Windows 2000-Implementierung keine HREF und ID-Attribute innerhalb des Anchor-Tags.
Die verschiedenen Fensterklassen-Namen erschweren die Verwendung von SysLink-Controls in Dialogvorlagen. Der Dialog kann nur erzeugt werden, wenn alle verwendeten Fensterklassen registriert sind. Der Dialogeditor von Visual Studio verwendet SysLink als Fensterklasse, das verhindert aber die Anzeige des Dialogs unter Windows 2000.
Mit einem kleinen Trick lässt sich das Problem recht einfach lösen. Beim Start der Anwendung wird geprüft, ob die Fensterklasse SysLink existiert. Wenn nicht, dann wird mit Hilfe von LinkWindow_RegisterClass die Fensterklasse Link Window registriert. Anschließend ruft man die Fensterklassen-Daten für Link Window ab, ändert den Namen auf SysLink und registriert die Klasse unter dem neuen Namen. Nun kann man auch unter Windows 2000 mit SysLink arbeiten.
Das ganze sieht dann so aus:
BOOL RegisterCommonControls(){// Common Controls initialisierenINITCOMMONCONTROLSEX initCCex;initCCex.dwSize = sizeof(initCCex);initCCex.dwICC = ICC_WIN95_CLASSES | ICC_LINK_CLASS;// Common Controls initialisierenInitCommonControlsEx(&initCCex);// Erfolg?BOOL fSuccess = FALSE;// Fensterklasse abrufenWNDCLASSW wndLinkClass;if (!GetClassInfoW(NULL, L"SysLink", &wndLinkClass)){// Registrierungsfunktiontypedef BOOL (WINAPI* pfnLinkWindowRegisterProc)();// Shell32-Dll ladenHINSTANCE hModShell32 = LoadLibraryW(L"shell32.dll");if (NULL != hModShell32){// Funkion importierenpfnLinkWindowRegisterProc pfnLinkWindowRegister = reinterpret_cast<pfnLinkWindowRegisterProc>(GetProcAddress(hModShell32, MAKEINTRESOURCEA(258)));if (NULL != pfnLinkWindowRegister){fSuccess = pfnLinkWindowRegister();}// Dll freigebenFreeLibrary(hModShell32);}// Fensterklasse fuer "Link Window" registriertif (fSuccess){// Fensterklasse abrufenif (GetClassInfoW(NULL, L"Link Window", &wndLinkClass)){// Fensterklasse auf SysLink setzenwndLinkClass.lpszClassName = L"SysLink";// Fensterklasse registrierenif (!RegisterClassW(&wndLinkClass)){fSuccess = FALSE;}}// Fehler beim Abruf der Fensterklasseelse{fSuccess = FALSE;}}}// Fensterklasse existiert bereitselse{fSuccess = TRUE;}// Erfolgreturn fSuccess;}- Code downloaden: RegisterCommonControls.cpp
Verzwickter Code – Auflösung
Die Antwort von Marcus zum verzwickten Code war richtig. In Zeile 17 wird für die Fensterklasse zusätzlicher Speicher angefordert, um in Zeile 29 das Handle zum Elternfenster zu speichern. Unter Win32 funktioniert auch alles wie gewünscht.
Es wird aber nicht beachtet, dass unter Win64 ein Fensterhandle nicht mehr vier Byte groß ist (DWORD), sondern acht Byte. Somit ist in der Fensterklasse nicht mehr genug Platz, um das Fensterhandle zu speichern. SetWindowLongPtr setzt daher den Fehlercode ERROR_INVALID_INDEX.
Zeile 17 muss also korrigiert werden zu
wcTaskSwitch.cbWndExtra = sizeof(HWND);
Letztlich ist die Speicherung des Elternfensters aber auch total überflüssig, denn dieses lässt sich jederzeit über GetParent abrufen. Aber warum einfach, wenn es auch kompliziert geht.
Durch diesen Fehler ist es nicht möglich, den in den Infobereich minimierten SpeedCommander in der x64-Version per Tastatur wieder zu aktivieren. Bisher war dies noch keinem aufgefallen.





