Probleme nach Upgrade auf Microsoft SQL Server 2008 R2

Ein Kollege von mir hat ein Upgrade von seinen Microsoft SQL Server 2008 auf einen Microsoft SQL Server 2008 R2 durchgeführt.

Soweit ist alles gut abgelaufen, der SQL Server läuft. Einzig die Reporting Services ließen sich nicht mehr starten. Die Reporting Services liefen allerdings zuvor ohne Probleme.

Eine Reparaturinstallation sowie Entfernen und erneutes Hinzufügen des Dienstes wurden ohne jedweden Erfolg durchgeführt.

Nach dem fehlgeschlagenem Start des Dienst fanden sich nur die drei folgenden Einträge im Event-Log:

Protokollname: Application
Quelle:        SQL Server Reporting Services (MSSQLSERVER)
Datum:         26.05.2011 14:56:09
Ereignis-ID:   0
Aufgabenkategorie:Keine
Ebene:         Fehler
Schlüsselwörter:Klassisch
Benutzer:      Nicht zutreffend
Computer:      xyz
Beschreibung:
Der Dienst kann nicht gestartet werden. System.Exception: Default appdomain failed to initialize.
bei Microsoft.ReportingServices.Library.ServiceAppDomainController.Start()
bei Microsoft.ReportingServices.Library.ReportService.OnStart(String[] args)
bei System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)
Protokollname: Application
Quelle:        Report Server Windows Service (MSSQLSERVER)
Datum:         26.05.2011 14:56:09
Ereignis-ID:   140
Aufgabenkategorie:Starten/Herunterfahren
Ebene:         Fehler
Schlüsselwörter:Klassisch
Benutzer:      Nicht zutreffend
Computer:      xyz
Beschreibung:
Fehler beim Initialisieren der DefaultDomain-Anwendungsdomäne. Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt..

Protokollname: Application
Quelle:        Report Server Windows Service (MSSQLSERVER)
Datum:         26.05.2011 14:56:09
Ereignis-ID:   113
Aufgabenkategorie:Protokollierung
Ebene:         Fehler
Schlüsselwörter:Klassisch
Benutzer:      Nicht zutreffend
Computer:      xyz
Beschreibung:
Der Berichtsserver kann den Leistungsindikator 'Report Requests' nicht erstellen.

Der letzte Eintrag mit der Meldung „Der Berichtsserver kann den Leistungsindikator ‚Report Requests‘ nicht erstellen.“, in Verbindung mit der Meldung „System.Exception: Default appdomain failed to initialize.“ . Hat mich letzten Endes auf die Spur gebracht.

Die Lösung ist hier zu finden: http://support.microsoft.com/kb/956155/en-us

Offensichtlich wurde bei der Deinstallation des 2008er SQL-Servers mehr entfernt als gut war und der hier vorgeschlagene Weg einer Reparaturinstallation war leider nicht erfolgreich.
Ich habe die 4 Schlüssel die fehlten einfach manuell eingefügt und der Dienst konnte danach sofort wieder gestartet werden.

„C++ and Beyond“ und andere Seminare mit Scott Meyers und anderen

Ich habe den nachfolgenden Beitrag von Scott Meyers in meinem Blog erhalten und finde es wert ihm einen eigenen Platz in meinem Blog zu geben.
Hier der gesamte originale Kommentar wie er bei mir eingegangen ist:
http://blog.m-ri.de/index.php/2011/05/08/adc-c-konferenz-in-prien-am-chiemsee-ein-ruckblick/#comment-4369

Weil Du so viel Begeisterung für C++ und “Events,” die C++ angehen, hast, wollte ich das “C++ and Beyond” Veranstaltung in August in Banff (Kanada) erwähnen. Dort sprechen Herb Sutter, Andrei Alexandrescu und ich Themen wie das Speichermodell für C++0x, die Verwendung von GPGPUs und die Behandlung von grossen Mengen von Daten an. Anzahl der Teilnehmer ist zu 100 begrenzt. Vorträge finden in Englisch statt, aber Herb ist ein Deutschmuttersprachler, und ich versuche, Deutsch zu sprechen. Details der Veranstaltung sind unter http://cppandbeyond.com/ zu finden.

Etwas näher zu Hause sind die Seminare, die ich in Oktober mit meinem Partner QA Systems in Stuttgart halte. Ich gehe vier verschiedene Themen an, und zwar “Fastware” (schnelle Software), die effektive Nutzung von C++ im eingebetteten Bereich, Richtlinien für gute C++ Klassen und wie man die Kraft der C++-Templates zu Designmuster bringen kann. Drei von diesen werden auf Englisch durchgeführt, aber die zwei-tägige Präsentation über C++ im eingebetteten Bereich gebe ich — zum ersten Mal — auf Deutsch. Linke für die Vorträge sind auf http://www.aristeia.com/seminars.html zu finden.

Bitte um Entschuldigung, falls dieser Kommentar wie eine Werbung klingt, aber Tatsache ist, dass es immer noch interessante Veranstaltungen für C++ Entwickler gibt, auch in Deutschland und auch in Deutsch.

Kanada ist etwas weit, aber Stuttgart ist in Reichweite… mal sehen 😉

GetDefaultAccelerator der unbekannte Helfer

Ich bin Tastatur-Fan und ich achte in meinen Anwendungen immer darauf, dass ein Benutzer meine Anwendungen einfach mit der mit der Tastatur bedienen kann. Accelerator sind in Windows für den Entwickler hier ein einfaches Tool, Funktionen über die Tastatur einfach verfügbar zu machen.

Tastatur Acceleratoren werden in der MFC in CFrameWnd geladen und PreTranslateMessage angewendet. Üblicherweise passiert das Laden direkt wenn LoadFrame ausgeführt wird, oder wenn in einer MDI-Anwendung das Childframe mit dem entsprechenden Document-Template erzeugt wird.

Allerdings wird es spannend, wenn man den Accelerator wechseln will aufgrund verschiedener Ansichten oder Zustände in der Anwendung. Denn ein CMainFrame weiß ja eigentlich nichts von den Dokumententypen oder dessen Zustand. Und ich fände es eigentlich nicht schön entsprechenden Code imFrame zu verankern.

Zum Glück ist das auch nicht nötig, denn es gibt schon immer die zwei netten undokumentierten Funktionen CFrameWnd::GetDefaultAccelerator und CDocument::GetDefaultAccelerator.

Sobald eine Tastatureingabe in CFrameWnd::PreTranslateMessage ankommt wird CFrameWnd::GetDefaultAccelerator aufgerufen. Nur wenn diese Funktion NULL zurückgibt wird der im Frame gespeicherte m_hAccel verwendet. Nun und CFrameWnd::GetDefaultAccelerator ruft nun CDocument::GetDefaultAccelerator für ds aktuelle Dokument auf.
Damit kann nun das Dokument selbst über den Accelerator bestimmen, der verwendet werden soll. Wird NULL zurückgegeben wird der Accelerator des Frames verwendet.

In der MFC-Next ist das Verhalten etwas anders, weil dort der Keyboard Handler eingeschaltet ist, aber letzten Endes wird GetDefaultAccelerator auch von dort aufgerufen.

Draft für C++11 (vormals C++0x) jetzt noch kostenlos herunter laden

Michael Wong auf der ADC
Michael Wong auf der ADC in Prien

Auf der ADC für C++ in Prien hat uns Michael Wong (Intel, Mitglied des C++ Standard Commitee) in seinem Vortrag zum aktuellem Stand des C++ Standard geraten, den aktuellen Draft für C++11 (vormals C++0x) jetzt noch kostenlos herunter zu laden.

Dieser Draft wird sich gegenüber dem ISO Standard Dokument höchstens noch bzgl. Rechtschreibung und vermutlich einigen Formatierungen verändern. Inhaltliche Änderungen kann und wird es keine mehr geben. Wer nicht später hunderte von Dollars für das offizielle ISO Dokument ausgeben will kann das jetzige Dokument als PDF Datei noch kostenlos hier herunterladen.

Achtung: Dieser Link scheint sich schnell zu ändern
Ich versuche ihn aktuell zu halten. Auf dieser Seite finden alle entsprechenden Dokumente inkl. des aktuellen Drafts http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/
Es steht zu vermuten, dass nach Abschluß des Dokumentes alle Entwürfe entfernt werden.

Was macht man eigentlich gegen unerwünschte Übersetzung von Acceleratoren?

Accelerator sind ein einfach gutes Hilfsmittel um Funktionen in einem Programm über die Tastatur verfügbar zu machen.
Behandelt werden Accelerator in CFrameWnd::PreTranslateMessage. D.h. bevor eine Eingabe-Nachricht aus der Message Queue an ein Fenster ausgeliefert wird, bekommt das Fenster selbst und jedes Parent des Fensters die Nachricht zur Behandlung in PreTranslateMessage angeboten.

Aber das kann auch zu einem kleinen Problem werden. Nehmen wir an, wir haben eine Datenbank Anwendung und Bild-Hoch/Runter werden über Accelerator für das Blättern in den Datensätzen definiert. Soweit OK.

Was aber wenn man nun ein Inplace Control hat, oder eine kleine dynamische Listbox, die man einblendet und in der man nun auch blättern will? Dann wird der Accelerator im CFrameWnd zum Tastenschlucker und in dem Moment führen Bild-Hoch/Runter nicht zu dem gewünschten Blättern im Popupfenster.

Wie geht man nun vor?
Wenn man im View nun in PreTranslateMessage FALSE zurückgibt frisst der Accelerator im CFrameWnd die Taste. Gibt man TRUE zurück, dann wird die Nachricht nicht ausgeliefert. Der Trick ist eigentlich ganz simpel. Wenn alle PreTranslateMessage Funktionen FALSE zurückgeben wird die Nachricht ausgeliefert indem die beiden Funktionen TranslateMessage und DispatchMessage aufgrufen werden.
Das Ganze kann man abkürzen. Im PreTranslateMessage Handler des Fensters selbst  kann man nun einfach TranslateMessage und DispatchMessage aufrufen und nun TRUE zurückgeben. Das Fenster selbst oder evtl. sein Parent sorgt dafür, dass es die gewünschte Nachricht bekommt wie man es erwartet und der Accelerator im CFrameWnd wird umgangen.

_MSC_VER, _MFC_VER und die bisherigen Werte für die bekannten Compiler

Die Microsoft C/C++ Compiler haben schon immer eine durchgängige Versionsnummer, die mit den Produkten in denen sie eingebunden sind (z.B. VS-2010) nicht zu tun hat.

Diese Produktversion spiegelt auch auch in der vordefinierten Compiler Präprozessor Variable _MSC_VER wieder. Über diese Variable ist es zum Beispiel möglich verschiedene CRT oder STL Library Eigenarten abzufragen und entsprechen den eigenen Code für mehrere Compiler lauffähig zu machen. Gleiches gilt natürlich auch für den Code der MFC (siehe Anmerkung am Fuß der Tabelle).

Hier eine kleine Tabelle der Werte, die _MSC_VER für die verschiedenen Compiler annimmt mit ein paar zusätzlichen Hinweisen.

_MSC_VER  = Compiler
510  = C Compiler 5.1 (DOS)     - 1988?
       Mein aller erster Kontakt mit dem MS-Compiler
600  = C Compiler 6.x (DOS)     - 1990?
700  = C/C++ 7.0                - 1992
       Die UI war damals die PWB. MFC 1.0 wurde veröffentlicht
800  = Visual C++ 1.0           - 1993
       Existierte IMHO als 16bit und 32bit Compiler
900  = Visual C++ 2.0
       Existierte IMHO als 16bit und 32bit Compiler. MFC 3.0
1000 = Visual C++ 4.0           - 1995-03 ?
       Ab dieser Verison nur noch 32bit Compiler. MFC 4.0
???? = Visual C++ 4.1
       War nur für MSDN Subscriber verfügbar. Kam mit erstem Game/DirectX SDK.
???? = Visual C++ 4.2 und 4.21
       Erste Cross-Platform Version für Mac und PC. MFC 4.2, 4.21
1100 = Visual Studio 97 (5.0)   - 1997
       Enthielt weiterhin MFC 4.21
1200 = Visual C++ 6.0           - 1998-06
       Populärtse VC Version. MFC 6.0
1300 = Visual Studio.NET (2002) - 2002-02-13
       .NET hält Einzug. MFC 7.0
1310 = Visual Studio.NET 2003   - 2003-04-24
       MFC 7.1
1400 = Visual Studio 2005       - 2005-11-07
       MFC 8.0
1500 = Visual Studio 2008       - 2007-11-19
       MFC 9.0
1600 = Visual Studio 2010       - 2010-04-10
       MFC 10.0
1700 = Visual C++ 2011          - 2011 ???
       Produktname noch offen evtl. WinC++

Noch ein Hinweis auf _MFC_VER:
In der Tabelle habe ich nur die Versionen der zum Compiler passenden MFC Versionen aufgeführt. Die MFC setzt einen Define mit dem Namen _MFC_VER entsprechend. Dieser definiert ein WORD im Format 0xVVRR. Wobei VV für die Version der MFC steht in hexadezimaler schreibweise und RR für die Revision allerdings in dezimaler Schreibweise. Die aktuelle _MFC_VER von VS-2010 hat also den Wert 0x0A00 und in der MFC 4.21 wurde _MFC_VER als 0x0421 definiert.

PS: Auf die Idee für diese Tabelle kam ich durch eine Diskussion mit einem Teilnehmer auf der ADC für C++ in Prien, der auch schon x-Jahre mit dem MS-Compiler verbracht hat wie ich, und wir über die Entwicklung der Sprache C/C++ nachgedacht haben und was wann als Innovation unsere Programme veränderte. Eben ein typisches Bits+Bytes Gespräch… 😉

ADC C++ Konferenz in Prien am Chiemsee – Ein Rückblick

Wenn man etwas weiter zurückdenkt, dann war C++ eigentlich ein Thema, das von keiner Entwicklerkonferenz wegzudenken war. Das hat sich allerdings in den letzten Jahren gravierend geändert. C++ fristete mehr oder weniger ein Nischendasein (speziell auch auf Microsoft Konferenzen). Nicht zu vergessen begannen die ADC Konferenzen (IMHO vor 15 Jahren) auch mit Themen aus der nativen Welt und wurden in den letzten Jahren immer mehr nur eine Konferenz für die „Managed Welt“.
Und wenn man manche Vorträge der Vergangenheit anhörte (gerade auch von deutschen Microsoft Mitarbeitern), dann bekam man das Gefühl vermittelt, dass man mit C++ Native Code eigentlich keinen Platz in der „geplanten/zukünftigen neuen Welt“ hat.

Alleine das Microsoft Deutschland niemanden im deutschsprachigen Raum hat, der für C++ zuständig ist und das Produkt auch wirklich kennt und damit arbeitet ist für mich eine Eigentümlichkeit der besonderen Art und hoffentlich etwas was sich in der Zukunft ändern könnte 😉

Umso mehr muss man den Mut von ppedv bewundern eine Konferenz genau zu diesem Thema „Natives C++“ zu veranstalten, die Advanced Developers Conference zu C++ in Prien.

Das wichtigste was ich zuerst schreiben möchte ist:
Solch eine Veranstaltung war überfällig

Warum?

  1. Es gibt einen Bedarf in unserer Industrie und Technik, nach nativem Code. Und das betrifft eben nicht nur „legacy Code“ sondern auch Neuentwicklungen.
  2. C++ ist alles andere als eine tote Sprache. Das zeigt gerade die Entwicklung der Sprache, Compiler und Library die C++11 (vormals (C++0x) mit sich gebracht hat.
    Und ich kann jedem C++ Entwickler nur dringend anraten sich mit den neuen Sprach- und Library-Features auseinander zu setzen.
    Es lohnt sich unbedingt und es ist produktiv diese neuen Features (auto, decltype, Lambdas uvam.) auch zu verwenden.
    Und der nächste Standard lässt hoffentlich mit seinen neuen Features keine 11 Jahre auf sich warten 😉
  3. Weil gerade auch der Microsoft C++ Compiler in VS-2010 (beginnend schon mit dem Featurepack von VS-2008 bzw. VS-2008 SP1) sehr viele der neuen Sprachfeatures anbietet. Alleine hier hat Microsoft eigentlich schon gezeigt, dass native Softwareentwicklung alles andere als tot ist.
  4. Viele C++ Entwickler leben längst in beiden Welten, d.h. sie entickeln sowohl in der Managed Welt mit C# und sie entwickeln auch in nativem C++.  Auch dieser Entwicklung muss Rechnung getragen werden, denn diese zwei Welten vertragen sich ja excellent mit C++/CLI, COM oder auch der MFC als Kleber.
  5. Das auch in Windows 7 alle neuen Features über bestehende native Technologien (Standard Windows API Interface, COM) verfügbar gemacht wurden. Wo doch „viele Auguren“ prophezeiten, dass nun auch .NET im OS weiter und weiter Fuß fassen wird.
  6. Und wenn man die angehende Diskussionen und Gerüchte um WinC++ und eine Modernisierung von COM (siehe letzte Artikel auf ZDNet) liest scheint unmanaged Code noch einiges Neues in Zukunft zu bieten.

Ich spare mir mal einen detaillierten Rückblick auf einzelne Sessions.
Wie immer auf solchen Konferenzen hört man bekanntes, in manchen Vorträgen schaltet man ab, oder macht seinen Kram 😉 …
und bei manchen hört man wirklich neues und wird aufmerksam auf Techniken, die man wirklich produktiv einsetzen kann.
Und was solch eine Konferenz auch mit sich bringt, ist neues „zwischen den Zeilen“. Man sieht zum Beispiel die Nutzung von Tools und Funktionen, die man noch gar nicht kannte (ich werde einiges, was ich selbst neu gelernt habe in einigen Artikeln noch verarbeiten). Viele dieser „Neuigkeiten“ für mich kamen in Vorträgen vor, die ich eigentlich als „nicht ganz so interessant“ und „kenne ich eigentlich“ eingestuft hätte. So irrt man eben manchmal.

Und sicherlich bringt solch eine Konferenz auch wieder einen guten Überblick über manche Funktionalität, die man sich alleine (auch mit einem Tutorial) nicht so gut erarbeiten kann. Hier in Prien war es für mich speziell die verschieden Ansätze der Libraries für „Parallel Programming“ (OpenMP und PPL) und auch was „Transactional Memory“ in C++ bringen kann.

Ein weiterer wichtiger Punkt: „Mal wieder aus seiner Höhle“ herauszukommen, wie es ein Teilnehmer in einer Frage-Session formulierte. Der Kontakt zu anderen Entwicklern in den Pausen. Der Austausch, wie man selber aktuell Probleme löst, auf was man hinarbeitet, eröffnet einem einen anderen Blick auf die eigene Arbeit und hilft auch zu anderen Einsichten.
Und wenn es nur die Erfahrung ist: „Ich bin nicht der einzige, der dieses und jenes Problem hat…“

Und nicht zu vergessen, ist es die Möglichkeit den Repräsentanten der verschiedenen Firmen auf den Zahn zu fühlen. Man bekommt zwar wie üblich oft keine 100% Antworten auf Fragen und manche Antwort wird durch Firmen-Policies verwässert, aber man kann zwischen den Zeilen doch oft etwas mehr als „Marketing“ herauslesen und sich ein Bild machen.

Speziell erwähnen will ich hier die für mich positiven und sehr offenen Worte von Boris Jabez erwähnen, der offen zugab, dass Microsoft in den letzten 10 Jahren keinen guten Job gemacht hat „natives C++“ in der Art zu unterstützen und zu propagieren, wie es eigentlich angebracht gewesen wäre. Ich will es mal ganz vorsichtig so formulieren.
Der Begriff der „C++ Renaissance“ macht ja langsam die Runde.
Die Zukunft wird es zeigen, dass es hoffentlich keine „reine Marketingmasche“ ist…

Relativ einmütig war die Meinung der Teilnehmer, dass es gut war nach all den Jahren endlich mal wieder eine „echte C++“ Konferenz zu haben und viele wünschen sich –  wie auch ich – dass dies keine Eintagsfliege bleibt.

Fazit für mich:
Die ADC zu C++ in Prien hat mir Appetit auf mehr gemacht

Ein absolut gelungenes Event an einem schönen Plätzchen am Chiemsee, interessanten Beiträgen und Referenten, eine schönen und gemütlichen Abendversanstaltung und guter Organisation.

Ich bin gespannt ob diese Konferenz wirklich im nächsten Jahr eine Fortsetzung findet. Mich persönlich würde es freuen und ich wäre in jedem Fall wieder dabei.  Hoffen wir, dass sich Träger und Sponsoren zu einer neuen ADC für C++ in 2012 finden.

ADC C++ Konferenz in Prien am Chiemsee – Tag 2

Ich wollte eigentlich schon über Tag 1 etwas schreiben, aber gestern ist es doch sehr spät geworden weil einige von uns nach einer Fahrt über den Chiemsee noch bis ca. Mitternacht mit Boris Jabez gesprochen haben.
Also wird es noch dauern bis ich noch etwas nachtrage.

Das Wetter ist super. Etwas über 100 Teilnehmer können hier die Gegend am Chiemsee zumindest in den Pausen genießen, wenn man nicht noch manchmal Fragen an die Referenten hat…

Meinen Tag für heute habe ich so geplant:

  • Intel Keynote: The Power for Second-Generation Intel® Core™ Processor Family for Software Developers – Aaron Coday
  • Software Transactional Memory in C++ – Michael Wong
  • Die C++ Releaseversion. Ein Buch mit sieben Siegeln? –Matthias Wedemeyer
  • Native C/C++-Code in der Cloud (Windows Azure)Cosmin Dumitru
  • Game Development with Visual Studio – Boris Jabes
  • DLL Injection – Matthias Wedemeyer

ADC C++ Konferenz in Prien am Chiemsee – Count Down

Die Gegend ist wirklich sehr schön ❗
Das ist der Ausblick oberhalb des Chiemsees auf einem Wanderweg Richtung Prien.

Leider werden wir von dieser schönen Landschaft morgen nicht soviel mitbekommen, wenn es um natives C++ geht auf der Advanced Devlopers Conference speziell zu C++.

Meine Agenda für den morgigen Tag sieht so aus (mal sehen, vielleicht wechsel ich noch,gerade bei den beiden letzten Sessions bin ich mir noch nicht sicher):

  • Microsoft Keynote: State of Native Development – Why You Should Care Boris Jabes
  • C++ Standard Committee Representative Michael Wong
  • Building Asynchronous And Parallel Applications With C++ Boris Jabes
  • Managed Wrapper Klassen mit C++/CLI Bernd Marquardt
  • Does & Don’ts in der Parallelprogrammierung Bernd Marquardt
  • Team Foundation Server 2010 Version Control Christian Binder

Mal sehen was der Tag bringt.
Jetzt werde ich noch mal in die Hotelbar gehen, denn Schalke liegt hoffungslos mit 2:1 hinten… 😉

Auf was man unbedingt achten muss, wenn man an Manifesten für Assemblies herumbastelt

Ich habe für ein Projekt Manifeste zur Verwendung von Registration-Free COM Module gebaut.

Diese COM-Module wurden über ein Manifest in einer EXE geladen. Natürlich hatte jedes der COM Module wieder ein eigenes Manifest, die ich entsprechend angepasst habe. Jede COM-Class, die verwendet wird, muss ja in dem Manifest der DLL-Assembly aufgeführt werden.

Eigentümlich war, dass ich nach Änderungen der Manifeste und auch nachdem das COM Modul komplett neu gelinkt wurde, dennoch die EXE ihr Ladeverhalten nicht geändert hat. Manche COM-Klassen wurden nicht gefunden. Sobald ich aber den Rechner neu gestartet hatte funktionierte ab dann alles wie gewünscht und das geänderte Manifest schien nun wirksam zu sein.

Da gibt es einen Cache dachte ich mir. Und nach einiger Recherche im Internet stieß ich auf den folgenden interessanten Artikel von Junfeng Zang:
Windows Vista Sxs Activation Context Cache

Wie man lesen kann, wird bei jedem erfolgreichen Einlesen einer Anwendung und dem erfolgreichen Laden aller Manifeste und DLLs, die ganzen ermittelten Daten in einen Cache gespeichert. Da ich die EXE aber nicht geändert habe, wurden auch die untergeordneten Manifeste nicht neu gelesen, auch wenn diese geändert wurden.

Durch das Ändern des Datums der EXE werden die Cacheeinträge ungültig, und danach werden alle Aktivierungskontexte der Anwednung und aller anderen Assemblies neu geladen.