<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin&#039;s Blog &#187; MFC</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/mfc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.m-ri.de</link>
	<description>Gesammeltes aus dem Leben eines &#34;normalen&#34; Programmierers... :-)</description>
	<lastBuildDate>Sat, 04 Feb 2012 12:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Für was ist der Makro %(PreprocessorDefinitions) gut ?</title>
		<link>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/</link>
		<comments>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 17:54:35 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[ATL]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=903</guid>
		<description><![CDATA[In den C++ Compilereinstellungen finden sich ein vorgegebener Makro %(PreprocessorDefinitions) in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich. Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der General-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über [...]]]></description>
			<content:encoded><![CDATA[<p>In den C++ Compilereinstellungen finden sich ein vorgegebener Makro <em>%(PreprocessorDefinitions)</em> in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich.</p>
<p>Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der <em>General</em>-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über den Makro <em>%(PreprocessorDefinitions)</em> in die allgemeinen Compiler-Einstellungen übernommen (die entsprechenden Defines sind <em>_UNICODE; UNICODE; _MBCS </em>).<br />
Erzeugt man eine DLL wird zusätzlich <em>_WINDLL</em> gesetzt.<br />
Setzt man ATL Optionen in der General Seite wird auch über die <em>%(PreprocessorDefinitions) _ATLDLL</em> bzw. <em>_ATL_STATIC_REGISTRY</em> gesetzt oder zurückgesetzt.<br />
Gleiches gilt, wenn die <em>MFC</em> als shared DLL verwendet wird. In diesem Fall wird der Define <em>_AFXDLL</em> zusätzlich gesetzt.</p>
<p>Löscht man also <em>%(PreprocessorDefinitions)</em> dann werden alle diese Einstellungen nicht mehr  korrekt übernommen.</p>
<p>Anmerkung:<br />
Bei dem Linker Makro <em>%(AdditionalDependencies) </em>habe ich eine ähnliche Verwendung vermutet, konnte aber keine direkte Beziehung zur Seite General herstellen.</p>
<p>Obwohl es auch hier Einflüsse auf die Linkereinstellungen gibt bei Änderungen in den <em>General</em>-Einstellungen. Werden allerdings die MFC als zusätzliche Bibliothek ausgewählt werden die Standard-LIBs aus dem SDK komplett entfernt. Hier gibt die MFC Bibliothek selbst vor in welchen zusätzlichen Libs, des SDK gesucht werden soll über #pragma comment(lib,..).</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Auflösung des GetBuffer und GetAllocLength Rästels</title>
		<link>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 16:16:09 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=880</guid>
		<description><![CDATA[Dann will ich mal das Problem lüften, dass sich mit diesem Code ergibt, dein ich meinem letzten Artikel vorgestellt habe: template &#60;class T&#62; void SecureClearString&#40;T &#38;strText&#41; &#123; ::SecureZeroMemory&#40;strText.GetBuffer&#40;0&#41;,strText.GetAllocLength&#40;&#41;&#41;; strText.Empty&#40;&#41;; &#125; Zuerst einmal liegt es nicht daran, dass es hier Template verwendet wurde. Ein Template wurde verwendet, weil in dem Code nicht nur CString, sondern implizit [...]]]></description>
			<content:encoded><![CDATA[<p>Dann will ich mal das Problem lüften, dass sich mit diesem Code ergibt, dein ich meinem <a href="http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/">letzten Artikel</a> vorgestellt habe:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Zuerst einmal liegt es nicht daran, dass es hier Template verwendet wurde.<br />
Ein Template wurde verwendet, weil in dem Code nicht nur <em>CString</em>, sondern implizit <em>CStringA</em> und <em>CStringW</em> verwendet wurde. Der Code sollte also mit beiden Typen funktionieren.</p>
<p>Und damit sind wir bei Problem 1, das auch gelöst wurde:<br />
Wenn ein <em>CStringW</em> verwendet wird, dann wird nur die Hälfte des Strings gelöscht, und nicht alles.</p>
<p>Das Szenario, dass zu einem miesen Crash führen kann, will ich nun in den einzelnen Schritten schildern (es wurde ja vermutet, dass es mit GetBuffer zusammenhängt und die Vermutung ist richtig):</p>
<ol>
<li>Der <em>CString</em> der mit diesem template behandelt wurde enthielt einen größeren <em>CString</em> und anschließend wurde ein kürzerer <em>CString</em> zugewiesen. Damit ist <em>GetAllocLength</em>&gt;<em>GetLength</em>.</li>
<li>Dieser <em>CString</em> wird nun an eine weitere Variable zugewiesen. Durch die Referenzzählung wird keine volle Kopie erzeugt.</li>
<li>Nun kommt unsere schöne Funktion ins Spiel und einer der beiden Strings wird mit dieser Template Funktion behandelt.</li>
<li>Die Funktion hat zwei Argumente, die von rechts nach links berechnet und auf den Stack geschoben werden.</li>
<li>D.h. Zuerst wird <em>GetAllocLength</em> ausgeführt. Und dies ergibt einen Wert für die Länge, der ursprünglich einmal in diese Variable passte.</li>
<li>Als zweites erfolgt nun der Aufruf von <em>GetBuffer</em>. Da wir aber einen <em>CString</em> haben, der mehrfach benutzt wird, muss nun ein Copy on Write erfolgen. D..h. der String wird kopiert und mit der jetzt benötigten Länge neu alloziert und der Zeiger auf diesen Speicher wird zurückgegeben, dieser ist aber eben kürzer als der ursprüngliche Puffer.</li>
<li>Und nun erfolgt der <em>memset</em>, auf einen Speicher der nur noch so groß ist wie der kurze String. Folgerichtig wird der Heap zerstört, weil der Speicher hinter dem String überschrieben wird.</li>
<li>Peng <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  Wir haben hier einen ganz miesen Seiteneffekt.</li>
</ol>
<p>Hier der Code, mit dem man den Crash gezielt nachbauen kann:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> Crash<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  CString str1 <span style="color: #000080;">=</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;12345678901234567890&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  str1 <span style="color: #000080;">=</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;123&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  CString str2 <span style="color: #000080;">=</span> str1<span style="color: #008080;">;</span>
  SecureClearString<span style="color: #008000;">&#40;</span>str1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Crash</span>
  SecureClearString<span style="color: #008000;">&#40;</span>str2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Der Vollständigkeit halber will ich aber auch noch ein Stück Code zegen, der es richtig macht:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// We need this only if there is a private buffer</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Execute GetBuffer first. This might cause a fork and may change</span>
    <span style="color: #666666;">// GetAllocLength.</span>
    T<span style="color: #008080;">::</span><span style="color: #007788;">XCHAR</span> <span style="color: #000040;">*</span>pBuffer <span style="color: #000080;">=</span> strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">size_t</span> iLen <span style="color: #000080;">=</span>strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>pBuffer,iLen<span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>T<span style="color: #008080;">::</span><span style="color: #007788;">XCHAR</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p lang="cpp">PS: Der Leser kann sich denken, dass mich dieser Bug und die entsprechende Reproduktion einige Nerven gekostet haben.  Denn es war nicht einfach die Vorbedingung (erst langer String, dann kurzer String, dann Zuweisung) zu ermitteln. Und wie es oft so ist führen Heap-Fehler erst sehr verzögert zu einem Problem.<br />
Wen es genau interessiert: Ich habe ca 7 Stunden an dem Fall geknobelt und hatte 3 verschiedene Crashdumps zur Verfügung. Selbst konnte ich diesen Fehler in unserem Testfeld zuvor nicht erzeugen, weil eben nie alle Bedingungen erfüllt waren. Erst als mir klar war wo das Problem lag, gelang es mir natürlich auch sofort Eingaben zu erzeugen, die den Crash reproduzierten.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS-Tipps und Tricks:Feststellen ob ATL oder MFC in einem Projekt benutzt werden</title>
		<link>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 15:45:06 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[ATL]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=747</guid>
		<description><![CDATA[Für manche Standardklassen bzw. Header oder Libraries ist es manchmal schön zu wissen ob die ATL oder die MFC in einem Projekt verwendet werden.  In der Vergangenheit habe ich dies oft benutzt um bestimmte Member in Klassen einzubauen, die dann zum Beispiel Daten auch als CString aktzeptieren, oder diese Member dann eben nicht einzubauen um eine Nutzung [...]]]></description>
			<content:encoded><![CDATA[<p>Für manche Standardklassen bzw. Header oder Libraries ist es manchmal schön zu wissen ob die <em>ATL</em> oder die <em>MFC</em> in einem Projekt verwendet werden.  In der Vergangenheit habe ich dies oft benutzt um bestimmte Member in Klassen einzubauen, die dann zum Beispiel Daten auch als <em>CString </em>aktzeptieren, oder diese Member dann eben nicht einzubauen um eine Nutzung in einem &#8220;puren&#8221; <em>WinAPI</em> Projekt zu ermöglichen.<br />
Seit die <em>CString </em>Klassen allerdings eigenständige Templates wurden ist dieser Grund für mich eigentlich weggefallen.<br />
Ich benutzte es heute nur noch um evtl. Memberfunktionen zu unterscheiden die evtl. CWnd* zusätzlich zu HWND Parametern akzeptieren.</p>
<p>Aber wer weiß, vielleicht hat der eine oder andere doch die Frage wie er erkennen kann ob die <em>ATL</em> oder die <em>MFC</em> in einem Projekt Verwendung finden.</p>
<p>Vordefinierte Preprozessor Variablen gibt es dafür nicht, allerdings kann man erkennen ob die Standard <em>ATL</em>/<em>MFC</em>Header in einem Projekt bereits als Include eingefügt wurden, denn in diesem Fall kann man die Existenz der Include-Guards prüfen.</p>
<p>Die <em>MFC</em> benutzt <strong><em>__AFX_H__ </em></strong>als Guard für die <em>afx.h</em>.<br />
Die Basisklassen der <em>ATL</em> befinden sich in der <em>atlbase.h</em>und entsprechend lautet der Guard: <strong><em>__ATLBASE_H__</em></strong>.</p>
<p>Sofern also diese Guards definiert sind wurden auch die entsprechenden Libraries in der <em>stdafx.h</em> oder anderen Headern zuvor included.</p>
<p><strong>Nachtrag 12.07.2011:<br />
Stefan</strong> hat natürlich vollkommen recht mit seinem Kommentar, dass es die zwei Präprozessor-Variablen <strong><em>_MFC_VER </em></strong>und <strong><em>_ATL_VER </em></strong>gibt, die natürlich für den hier erwähnten Einsatz weitaus besser geeigent sind.<br />
Siehe: <a href="http://msdn.microsoft.com/de-de/library/b0084kay.aspx">http://msdn.microsoft.com/de-de/library/b0084kay.aspx</a><br />
Ich habe hier den Wald vor lauter Bäumen nicht gesehen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Herzlichen Dank für diese produktive Ergänzung.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GetDefaultAccelerator der unbekannte Helfer</title>
		<link>http://blog.m-ri.de/index.php/2011/05/28/getdefaultaccelerator-der-unbekannte-helfer/</link>
		<comments>http://blog.m-ri.de/index.php/2011/05/28/getdefaultaccelerator-der-unbekannte-helfer/#comments</comments>
		<pubDate>Sat, 28 May 2011 08:44:13 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tastatur]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=799</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>Tastatur Acceleratoren werden in der <em>MFC</em> in <em>CFrameWnd</em> geladen und <em>PreTranslateMessage</em> angewendet. Üblicherweise passiert das Laden direkt wenn <em>LoadFrame</em> ausgeführt wird, oder wenn in einer <em>MDI</em>-Anwendung das Childframe mit dem entsprechenden Document-Template erzeugt wird.</p>
<p>Allerdings wird es spannend, wenn man den Accelerator wechseln will aufgrund verschiedener Ansichten oder Zustände in der Anwendung. Denn ein <em>CMainFrame</em> weiß ja eigentlich nichts von den Dokumententypen oder dessen Zustand. Und ich fände es eigentlich nicht schön entsprechenden Code imFrame zu verankern.</p>
<p>Zum Glück ist das auch nicht nötig, denn es gibt schon immer die zwei netten undokumentierten Funktionen <em>CFrameWnd::GetDefaultAccelerator</em> und <em>CDocument::GetDefaultAccelerator.</em></p>
<p>Sobald eine Tastatureingabe in <em>CFrameWnd::PreTranslateMessage</em> ankommt wird <em>CFrameWnd::GetDefaultAccelerator</em> aufgerufen. Nur wenn diese Funktion <em>NULL</em> zurückgibt wird der im Frame gespeicherte <em>m_hAccel</em> verwendet. Nun und <em>CFrameWnd::GetDefaultAccelerator</em> ruft nun <em>CDocument::GetDefaultAccelerator </em>für ds aktuelle Dokument auf.<br />
Damit kann nun das Dokument selbst über den Accelerator bestimmen, der verwendet werden soll. Wird NULL zurückgegeben wird der Accelerator des Frames verwendet.</p>
<p>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.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/05/28/getdefaultaccelerator-der-unbekannte-helfer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was macht man eigentlich gegen unerwünschte Übersetzung von Acceleratoren?</title>
		<link>http://blog.m-ri.de/index.php/2011/05/18/was-macht-man-eigentlich-gegen-unerwunschte-ubersetzung-von-acceleratoren/</link>
		<comments>http://blog.m-ri.de/index.php/2011/05/18/was-macht-man-eigentlich-gegen-unerwunschte-ubersetzung-von-acceleratoren/#comments</comments>
		<pubDate>Wed, 18 May 2011 19:21:50 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tastatur]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=798</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Accelerator sind ein einfach gutes Hilfsmittel um Funktionen in einem Programm über die Tastatur verfügbar zu machen.<br />
Behandelt werden Accelerator in <em>CFrameWnd::PreTranslateMessage</em>. 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 <em>PreTranslateMessage</em> angeboten.</p>
<p>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.</p>
<p>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 <em>CFrameWnd</em> zum Tastenschlucker und in dem Moment führen Bild-Hoch/Runter nicht zu dem gewünschten Blättern im Popupfenster.</p>
<p>Wie geht man nun vor?<br />
Wenn man im View nun in <em>PreTranslateMessage FALSE</em> zurückgibt frisst der Accelerator im <em>CFrameWnd</em> die Taste. Gibt man <em>TRUE</em> zurück, dann wird die Nachricht nicht ausgeliefert. Der Trick ist eigentlich ganz simpel. Wenn alle <em>PreTranslateMessage</em> Funktionen <em>FALSE</em> zurückgeben wird die Nachricht ausgeliefert indem die beiden Funktionen <em>TranslateMessage</em> und <em>DispatchMessage </em>aufgrufen werden.<br />
Das Ganze kann man abkürzen. Im <em>PreTranslateMessage</em> Handler des Fensters selbst  kann man nun einfach <em>TranslateMessage</em> und <em>DispatchMessage</em> aufrufen und nun <em>TRUE</em> 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 <em>CFrameWnd</em> wird umgangen.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/05/18/was-macht-man-eigentlich-gegen-unerwunschte-ubersetzung-von-acceleratoren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>_MSC_VER, _MFC_VER und die bisherigen Werte für die bekannten Compiler</title>
		<link>http://blog.m-ri.de/index.php/2011/05/13/_msc_ver-und-die-bisherigen-werte-fur-die-bekannten-compiler/</link>
		<comments>http://blog.m-ri.de/index.php/2011/05/13/_msc_ver-und-die-bisherigen-werte-fur-die-bekannten-compiler/#comments</comments>
		<pubDate>Fri, 13 May 2011 19:28:08 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=771</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Die <em>Microsoft</em> C/C++ Compiler haben schon immer eine durchgängige Versionsnummer, die mit den Produkten in denen sie eingebunden sind (z.B. <em>VS-2010</em>) nicht zu tun hat.</p>
<p>Diese Produktversion spiegelt auch auch in der vordefinierten Compiler Präprozessor Variable <em>_MSC_VER </em>wieder. Über diese Variable ist es zum Beispiel möglich verschiedene <em>CRT</em> oder <em>STL</em> 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 <em>MFC</em> (siehe Anmerkung am Fuß der Tabelle).</p>
<p>Hier eine kleine Tabelle der Werte, die <em>_MSC_VER </em>für die verschiedenen Compiler annimmt mit ein paar zusätzlichen Hinweisen.</p>
<pre>_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++</pre>
<p>Noch ein Hinweis auf <em>_MFC_VER:<br />
</em>In der Tabelle habe ich nur die Versionen der zum Compiler passenden MFC Versionen aufgeführt. Die <em>MFC</em> setzt einen Define mit dem Namen <em>_MFC_VER </em>entsprechend. Dieser definiert ein <em>WORD</em> im Format <em>0xVVRR</em>. Wobei VV für die Version der <em>MFC</em> steht in hexadezimaler schreibweise und RR für die Revision allerdings in dezimaler Schreibweise. Die aktuelle <em>_MFC_VER </em>von <em>VS-2010 </em>hat also den Wert 0x0A00 und in der MFC 4.21 wurde _MFC_VER als 0&#215;0421 definiert.</p>
<p>PS: Auf die Idee für diese Tabelle kam ich durch eine Diskussion mit einem Teilnehmer auf der <a href="http://cpp.adc2011.de/">ADC für C++ in Prien</a>, 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&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/05/13/_msc_ver-und-die-bisherigen-werte-fur-die-bekannten-compiler/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>BUG: Black Patchday for all OS from XP and later 3. &#8211; MFC 8.0 (VC-2005) or MFC 9.0 (VC-2008) linked dynamically to the MFC may not find the MFC language DLLs after installation of the security packs dated April 12th 2011</title>
		<link>http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 15:30:15 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WIndows XP]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=830</guid>
		<description><![CDATA[This is the English translation of the already published German article: BUG: Schwarzer Patchday für alle OS XP und später 3. – MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011 Affected are: All programs created with MFC 8.0 and [...]]]></description>
			<content:encoded><![CDATA[<p><strong>This is the English translation of the already published German article:</strong><br />
<a title="Permanent Link: BUG: Schwarzer Patchday für alle OS XP und später 3. – MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011" rel="bookmark" href="http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/">BUG: Schwarzer Patchday für alle OS XP und später 3. – MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011</a></p>
<h3>Affected are:</h3>
<ul>
<li>All programs created with MFC 8.0 and MFC 9.0 that link dynamically to the <em>MFC DLLs</em> .</li>
<li>All operating systems from <em>Windows XP </em>and later. 32bit as 64bit</li>
<li>Al programs that do not use an application local installation (program directory, see note at the bottom of the article). So all programs that use and depend on <em>WinSxS</em> and <em>VCRedist_x86.exe </em>( <em>VCRedist_x64.exe</em>).</li>
<li>All programs that are localized and use the <em>MFC90xxx.DLL </em>or. <em>MFC80xxx.DLL </em>language-DLLs and the OS system language is not set to English.</li>
</ul>
<h3>It is affected due to the security fixes offered April 12th, 2011:</h3>
<p>For VS-2005 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465367">http://support.microsoft.com/kb/2465367</a> and <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467175">http://support.microsoft.com/kb/2467175</a><br />
For VS-2008 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465361">http://support.microsoft.com/kb/2465361</a> and <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467174">http://support.microsoft.com/kb/2467174</a></p>
<h3>Failure description:</h3>
<p>The MFC language DLLs (satellite DLLs) are not loaded any longer. Parts of the application appear in English and not the selected language from the OS.</p>
<h3>Background:</h3>
<p>To prevent loading of wrong satellite DLLs (<em>Binary Planting</em>), an internal function in <em>appcore.cpp</em> named <em>_AfxLoadLangDLL was </em>changed. It checks if an activation context is active or not and if the DLLs should be loaded using this context. If there is an activation context active it is safe to load the satellite DLLs(<em>MFCDEUxxx.DLL</em> etc.) without defining a full path. If no activation context is active the path of the current application is used to load and find the satellite DLLs. The DLLs are loaded with a call to <em>LoadLibrary</em>.</p>
<p>The code used looks like this (empty lines removed):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">...
<span style="color: #007788;">TCHAR</span> <span style="color: #000040;">*</span>pszFilename <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">PathFindFileName</span><span style="color: #008000;">&#40;</span>szLangDLL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
ACTCTX_SECTION_KEYED_DATA data<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FindActCtxSectionString<span style="color: #008000;">&#40;</span>
    FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX,
    <span style="color: #0000ff;">NULL</span>,
    ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
    pszFilename,
    <span style="color: #000040;">&amp;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the dll name only...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>pszFilename, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">else</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the full path...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>szLangDLL, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
...</pre></div></div>

<p>The code looks OK.  And it is conform to the documentation of <a href="http://msdn.microsoft.com/en-us/library/aa375149(VS.85).aspx#">FindActCtxSectionString</a> where the last parameter is defined as <em>__out</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL FindActCtxSectionString<span style="color: #008000;">&#40;</span>
  __in   DWORD dwFlags,
  __in   <span style="color: #0000ff;">const</span> GUID <span style="color: #000040;">*</span>lpExtensionGuid,
  __in   ULONG ulSectionId,
  __in   LPCTSTR lpStringToFind,
  __out  PACTCTX_SECTION_KEYED_DATA ReturnedData
<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>But the documentation of <a href="http://msdn.microsoft.com/en-us/library/aa374148(VS.85).aspx">ACTCTX_SECTION_KEYED_DATA </a>tells a different story:</p>
<blockquote><p>Callers <strong>should initialize </strong>the ACTCTX_SECTION_KEYED_DATA structure as such:<br />
&#8220;ACTCTX_SECTION_KEYED_DATA askd = { sizeof(askd) };&#8221;<br />
which initializes all members to zero/null except the size field which is set correctly.</p></blockquote>
<p>(BTW: In my eyes a documentation failure)</p>
<p>So what we see is that the code misses this: <strong>data.cbSize isn&#8217;t initialized</strong> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
Now we have 3 possible scenarios what can happen with a  randomly initialized <em>data.cbSize </em>field:</p>
<ol>
<li><em>data.cbSize </em>is larger than <em>sizeof(ACTCTX_SECTION_KEYED_DATA):</em><br />
In this case the activation context is correctly detected. The program executes normal.  With an activation context no full path is needed. The MFC90xxx.DLL will be loaded from the WinSxS (Side by Side) or found over the common search path.</li>
<li><em>data.cbSize </em>is less than  <em>sizeof(ACTCTX_SECTION_KEYED_DATA)</em>:<br />
In this case <em>FindActCtxSectionString</em> returns with an error. The DLL is now loaded with a full path name constructed from the application directory to prevent <em>Binary Planting</em>. Butthe problemis that with a normal installation the searched files are all in WinSxS, and the application directory has no such data. The DLL is not loaded.<br />
If the application local assemblies are used and placed in sub directories they aren&#8217;t found either.</li>
<li>A future problem.<br />
If an OS will use a larger <em>ACTCTX_SECTION_KEYED_DATA </em>and <em>data.cbSize </em>has a greater value than the corresponding <em>sizeof(&#8230;)</em>:<br />
We have a buffer-overrun!</li>
</ol>
<p>I always recommend to use private and application local assemblies for the CRT and MFC DLLs. And to install all this files local to the application.<br />
Years ago I wrote an article for this scenario that was published on CodeProject and a hotfix for <em>VS-2008 </em>is also available<em> </em> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
<strong><a title="Create projects easily with private MFC, ATL and CRT assemblies" href="http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx">Create projects easily with private MFC, ATL and CRT assemblies</a><br />
<a title="Hotfix für UseMSPrivateAssemblies.h und VC-2008" href="http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/">Hotfix für UseMSPrivateAssemblies.h und VC-2008</a></strong></p>
<h3>What to do?</h3>
<p>Uninstall all of the mentioned security fixes with the specified article IDs.<br />
Runtime-2005: KB2467175, Runtime-2008: KB2467174<br />
VS-2007 SP1: KB2465367, VS-2008 SP1: KB2465361).</p>
<h3>Further notes:</h3>
<p>The affected C/C++ Runtimes of <em>Visual Studio </em>have the following version numbers:<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)</p>
<p>My comment to tis issue:<br />
It was easier to live with the DLL-hell. <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Many thanks to my Co-MVP</strong><strong> Mike Ryan who helped me to discover this problems with the latest security patches:!:</strong></p>
<p><strong>What Do I mean with &#8220;application local&#8221;?<br />
</strong>Some people ship the MFC files in the application directory. In such a case this DLLs are not loaded if a newer version can be found in the WinSxS directory. This is not application local for <strong>me</strong>!<br />
So if the manifest file in the program directory still have a publicKey entry, the local files will be used  in case of the here described bug. Even if the activation context was not detected, so the local files are a kind of fallback and help prevent get around the problem.<br />
My articles describe how to make your application really application local in removingthe publicKey tokens from the manifest files. Such programs will never fail on such broken security patches. (Just read my article at Codeproject). (Thanks for Co-MVP David Ching who asked me for a clarification)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Workaround für Patchday Bug vom 12.04.2011: Wenn unter Windows 2000 der Einsprungpunkt FindActCtxSectionStringA nicht gefunden wird</title>
		<link>http://blog.m-ri.de/index.php/2011/04/14/workaround-fur-patchday-bug-vom-12-04-2011-wenn-unter-windows-2000-der-einsprungpunkt-findactctxsectionstringa-nicht-gefunden-wird/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/14/workaround-fur-patchday-bug-vom-12-04-2011-wenn-unter-windows-2000-der-einsprungpunkt-findactctxsectionstringa-nicht-gefunden-wird/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 08:30:30 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[W2K]]></category>
		<category><![CDATA[Windows 2000]]></category>
		<category><![CDATA[Workarround]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=827</guid>
		<description><![CDATA[Hintergrund siehe hier: BUG: Schwarzer Patchday für Windows 2000 – MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) DLLs sind nicht mehr lauffähig nach Installation von KB2467174 bzw. KB2467175 BUG: Schwarzer Patchday für Windows 2000 2.- MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) Static Libraries erzeugen auch inkompatiblen Code für Windows 2000 durch KB2465367 bzw. KB2465361 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Hintergrund siehe hier:</strong><br />
<a title="Permanent Link: BUG: Schwarzer Patchday für Windows 2000 – MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) DLLs sind nicht mehr lauffähig nach Installation von KB2467175 bzw. KB2467175" rel="bookmark" href="http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-dlls-sind-nicht-mehr-lauffahig-nach-installation-von-kb2467175-bzw-kb2467175/">BUG: Schwarzer Patchday für Windows 2000 – MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) DLLs sind nicht mehr lauffähig nach Installation von KB2467174 bzw. KB2467175</a><br />
<a title="Permanent Link: BUG: Schwarzer Patchday für Windows 2000 2.- MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) Static Libraries erzeugen auch inkompatiblen Code für Windows 2000 durch KB2465367 bzw. KB2465361" rel="bookmark" href="http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/">BUG: Schwarzer Patchday für Windows 2000 2.- MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) Static Libraries erzeugen auch inkompatiblen Code für Windows 2000 durch KB2465367 bzw. KB2465361</a></p>
<p><strong>Unter Windows 2000 kann man wie folgt vorgehen und das Problem beheben:</strong></p>
<ol>
<li>Am Besten macht man das nachdem man das System neu gestartet hat und noch keine Anwendung gestartet hat.</li>
<li>Alle betreffenden Hotfixe entfernen (für Runtime-2005 KB2467175, Runtime-2008 KB2467174, für VS-2007 SP1: KB2465367, VS-2008 SP1: KB2465361).<br />
Die betroffenen C/C++ Runtimes des <em>Visual Studio, </em>die deinstalliert werden müssen, haben die folgenden Versionsnummern<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)<br />
<strong>Um VS-2005/2008 wiederherzustellen ist zwingend eine Deinstallation des Patches nötig.<br />
</strong>Die Dateien für das <em>Visual Studio </em>sollten dann wieder denen des letzten Fix aus 2005/2008 entsprechen.</li>
<li><strong>Eigentlich sollte die Deinstallation des Patches genügen.</strong><br />
<strong>Sofern es sich nur um ein Problem mit den Runtimes handelt und sich das Problem nicht behoben hat kann man mit den nächsten Schritten weiter machen und versuchen die alten Dateien wieder herzustellen.<br />
(</strong>Man kann diese Schritte auch ohne Deinstallation durchführen)</li>
<li><strong>Für VS-2008: </strong>Die Dateien für aus dem letzten Sicherheitsupdate müssten in dem folgenden Verzeichnis unter <em>C:\WinNT\winsxs\ </em>liegen:<br />
a.<em> x86_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.4974_&#8230;<br />
</em>b.<em> </em><em>x86_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.4148_&#8230;<br />
</em>c. <em>x86_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.1_&#8230;<br />
</em>Man wählt das Verzeichnis, dass man zuerst findet.</li>
<li><strong>Für VS-2005:</strong> Die Dateien für aus dem letzten Sicherheitsupdate müssten in dem folgenden Verzeichnis unter <em>C:\WinNT\winsxs\ </em>liegen:<br />
a. <em>x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.4053_&#8230;<br />
</em>b. <em>x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.4027_&#8230;<br />
</em>c. <em>x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.1833_&#8230;<br />
</em>d. <em>x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.762_&#8230;<br />
</em>Man wählt das Verzeichnis, dass man zuerst findet.</li>
<li>Alle Dateien aus diesen gefundenen Verzeichnissen in das <em>C:\WinNT\System32</em> Verzeichnis kopieren.</li>
</ol>
<p>Hope that helps <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<p>PS: Ich habe den Artikel mehrfach überarbeitet während er bereits veröffentlicht war und immer neue Infos eingebaut bzw. die Vorgehensweise besser erklärt.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/14/workaround-fur-patchday-bug-vom-12-04-2011-wenn-unter-windows-2000-der-einsprungpunkt-findactctxsectionstringa-nicht-gefunden-wird/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BUG: Schwarzer Patchday für alle OS XP und später 3. &#8211; MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011</title>
		<link>http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 08:12:30 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[MFCNext]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WIndows XP]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=826</guid>
		<description><![CDATA[Betroffen sind: Alle Programme die mit MFC 8.0 oder MFC 9.0 erzeugt wurden und dynamisch an die MFC DLLs gelinkt sind. Alle Betriebssysteme ab Windows XP aufwärts. 32bit wie 64bit Alle Programme, die nicht die MFC und CRT DLLs applikationsnah (d.h. im Programmverzeichnis, siehe dazu auch die Fußnote in meinem Artikel) installiert haben. Also alle [...]]]></description>
			<content:encoded><![CDATA[<h3>Betroffen sind:</h3>
<ul>
<li>Alle Programme die mit MFC 8.0 oder MFC 9.0 erzeugt wurden und dynamisch an die <em>MFC DLLs</em> gelinkt sind.</li>
<li>Alle Betriebssysteme ab <em>Windows XP </em>aufwärts. 32bit wie 64bit</li>
<li>Alle Programme, die nicht die <em>MFC</em> und <em>CRT DLLs </em>applikationsnah (d.h. im Programmverzeichnis, siehe dazu auch die Fußnote in meinem Artikel) installiert haben. Also alle Programme die <em>WinSxS</em> benutzen und die <em>VCRedist_x86.exe </em>( <em>VCRedist_x64.exe</em>)  mit ausliefern.</li>
<li>Alle Programme, die lokalisiert sind und die <em>MFC90xxx.DLL </em>bzw. <em>MFC80xxx.DLL </em>Sprach-DLLs verwenden und das OS nicht auf Englisch eingestellt ist</li>
</ul>
<h3>Betrifft die folgenden Fixes vom 12.04.2011:</h3>
<p>Für VS-2005 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465367">http://support.microsoft.com/kb/2465367</a> und <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467175">http://support.microsoft.com/kb/2467175</a><br />
Für VS-2008 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465361">http://support.microsoft.com/kb/2465361</a> und <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467174">http://support.microsoft.com/kb/2467174</a></p>
<h3>Effekt:</h3>
<p>Die MFC Statelite DLLs werden nicht geladen. Teile der Anwendung erscheinen in englischer Sprache.</p>
<h3>Hintergrund:</h3>
<p>Um das Laden von falschen Satelite DLLs zu verhindern (<em>Binary Planting</em>), wurde intern in <em>appcore.cpp </em>in der Funktion <em>_AfxLoadLangDLL </em>geprüft, ob die DLLs in aus einem Activation Context geladen werden oder nicht.  Sollte ein Activation Context vorhanden sein, dann kann man gefahrlos die Sprach DLLs (<em>MFCDEUxxx.DLL</em> etc.) ohne Pfadnamen laden. Ist kein Activation Context vorhanden wird der Pfad der Anwendung verwendet und <em>LoadLibrary</em> mit vollem Pfadnamen durchgeführt.</p>
<p>Der Code der dazu verwendet wird sieht so aus (Leerzeilen entfernt):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">...
<span style="color: #007788;">TCHAR</span> <span style="color: #000040;">*</span>pszFilename <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">PathFindFileName</span><span style="color: #008000;">&#40;</span>szLangDLL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
ACTCTX_SECTION_KEYED_DATA data<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FindActCtxSectionString<span style="color: #008000;">&#40;</span>
    FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX,
    <span style="color: #0000ff;">NULL</span>,
    ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
    pszFilename,
    <span style="color: #000040;">&amp;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the dll name only...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>pszFilename, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">else</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the full path...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>szLangDLL, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
...</pre></div></div>

<p>Eigentlich sieht der Code prima aus. Und er verträgt sich auch mit der Doku von <a href="http://msdn.microsoft.com/en-us/library/aa375149(VS.85).aspx#">FindActCtxSectionString</a> dort wird der letzte Parameter als <em>__out</em> definiert.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL FindActCtxSectionString<span style="color: #008000;">&#40;</span>
  __in   DWORD dwFlags,
  __in   <span style="color: #0000ff;">const</span> GUID <span style="color: #000040;">*</span>lpExtensionGuid,
  __in   ULONG ulSectionId,
  __in   LPCTSTR lpStringToFind,
  __out  PACTCTX_SECTION_KEYED_DATA ReturnedData
<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Aber die Doku zu <a href="http://msdn.microsoft.com/en-us/library/aa374148(VS.85).aspx">ACTCTX_SECTION_KEYED_DATA </a>sagt was anderes:</p>
<blockquote><p>Callers <strong>should initialize </strong>the ACTCTX_SECTION_KEYED_DATA structure as such:<br />
&#8220;ACTCTX_SECTION_KEYED_DATA askd = { sizeof(askd) };&#8221;<br />
which initializes all members to zero/null except the size field which is set correctly.</p></blockquote>
<p>(BTW: Auch ein krasser Doku-Bug in meinen Augen)</p>
<p>Und jetzt sieht man was dem Code fehlt: <strong>data.cbSize wird nicht gesetzt</strong> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
Daraus ergeben sich nun drei Varianten, da <em>data.cbSize </em>nun zufälligen (nicht initialisierten) Inhalt hat:</p>
<ol>
<li><em>data.cbSize </em>ist größer als  <em>sizeof(ACTCTX_SECTION_KEYED_DATA):</em><br />
In diesem Fall wird korrekt ermittelt ob ein Activation Context vorhanden ist. Das Programm läuft normal. Mit Activation Context ist kein voller Pfadname nötig. Die MFC90xxx.DLL wird evtl. aus dem WinSxS (Side by Side) geladen, oder in einem der Suchpfade gefunden.</li>
<li><em>data.cbSize </em>ist kleiner als  <em>sizeof(ACTCTX_SECTION_KEYED_DATA)</em>:<br />
In diesem Fall liefert <em>FindActCtxSectionString</em> einen Fehler und nun wird es spannend. Die DLL wird nun versucht mit dem vollen Pfadnamen zu laden um <em>Binary Planting</em> zu verhindern. Das Problem ist aber dass bei korrekter Installation im WinSxS, dass im Applikationsverzeichnis keine dieser Daten liegen. Die DLL wird nicht gefunden.<br />
Sollten die private applikationsnahe Assemblies in einem Unterverzeichnis installiert sein, werden diese auch nicht gefunden.</li>
<li>Für die Zukunft.<br />
Ein zukünftiges OS vergrößert <em>ACTCTX_SECTION_KEYED_DATA </em>und <em>data.cbSize </em>hat zufälligen Inhalt und ist größer als <em>sizeof(&#8230;)</em>:<br />
Ein Buffer-Overrun!</li>
</ol>
<p>Ich empfehle nicht ohne Grund seit <em>VS-2005 </em>private Assemblies zu verwenden, und die MFC Dateien in das Anwendungsverzeichnis zu kopieren. Dazu habe ich auf Code-Projekt einen entsprechenden Artikel geschrieben und ein Hotfix für <em>VS-2008</em> existiert auch <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
<strong><a title="Create projects easily with private MFC, ATL and CRT assemblies" href="http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx">Create projects easily with private MFC, ATL and CRT assemblies</a><br />
<a title="Hotfix für UseMSPrivateAssemblies.h und VC-2008" href="http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/">Hotfix für UseMSPrivateAssemblies.h und VC-2008</a></strong></p>
<h3>Was ist zu tun?</h3>
<p>Deinstallation aller hier erwähnten Sicherheitspatches mit den entsprechenden Arikelnummern:<br />
Runtime-2005: KB2467175, Runtime-2008: KB2467174<br />
VS-2007 SP1: KB2465367, VS-2008 SP1: KB2465361).</p>
<h3>Weitere Anmerkungen:</h3>
<p>Die betroffenen C/C++ Runtimes des <em>Visual Studio </em>haben die folgenden Versionsnummern<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)</p>
<p>Mein Kommentar dazu:<br />
Das Leben in der DLL-Hölle war fast angenehmer als das hier. Ohne Worte <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Herzlichen Dank auch an meinem Mit-MVP</strong><strong> Mike Ryan, der mit mir zusammen auf diese gesamte Problematik gestoßen ist <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </strong></p>
<p><strong>Was meine ich mit &#8220;application local&#8221;?<br />
</strong>Einige Entwickler installieren die MFC runtme Dateien im Applikationsverzeichnis. In diesem Fall werden diese DLLs nicht verwendet wenn eine neuere Version der DLLs im WinSxS Verzeichnis liegen. Das ist <strong>für mich </strong>keine applikationsnahe Instalation! Diese Manifeste im Programmverzeichnis haben immer noch einen publicKey Eintrag. Aber durch die Existenz der lokalen Dateien wird dieses hier beschriebene Problem umgangen, weil die lokalen Dateien eine Art Fallback bilden.<br />
Meine Artikel beschriben wie man eine Anwendung wirklich applikationslokal macht und damit unabhängig von solchen &#8220;kaputten&#8221; Security Patches. Dazu muss der publicKey Token aus den Manifesten entfernt werden. (Lesen Sie meinen Artikel aufCodeproject).<br />
(Danke an Co-MVP David Ching der mich um Kläurung gebeten hat)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>BUG: Schwarzer Patchday für Windows 2000 2.- MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) Static Libraries erzeugen auch inkompatiblen Code für Windows 2000 durch KB2465367 bzw. KB2465361</title>
		<link>http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 20:48:14 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[W2K]]></category>
		<category><![CDATA[Windows 2000]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=824</guid>
		<description><![CDATA[Wer VS-2005 SP1 oder VS-2008 SP1 installiert hatte und bei dem auch die entsprechenden Patches von gestrigen Tag (12.04.2011) durchlaufen wurden, der hat nun auch veränderte statische Libraries. Sollte man nun also EXEs oder DLLs mit den neuen Libararies statisch linken, dann sind diese genausowenig lauffähig unter Windows 2000. wie auch die EXEs und DLLs [...]]]></description>
			<content:encoded><![CDATA[<p>Wer <em>VS-2005 SP1 </em>oder <em>VS-2008 SP1 </em>installiert hatte und bei dem auch die entsprechenden Patches von gestrigen Tag (12.04.2011) durchlaufen wurden, der hat nun auch veränderte statische Libraries.</p>
<p><strong>Sollte man nun also EXEs oder DLLs mit den neuen Libararies statisch linken, dann sind diese genausowenig lauffähig unter <em>Windows 2000</em>. wie auch die EXEs und DLLs die gegen die MFC 8.0 bzw. MFC 9.0 DLLs gelinkt werden</strong> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<p>Das Ganze ist hier aufgelistet:<br />
für VS-2005 SP1 <a href="http://support.microsoft.com/kb/2465367">http://support.microsoft.com/kb/2465367</a><br />
für VS-2008 SP1 <a href="http://support.microsoft.com/kb/2465361">http://support.microsoft.com/kb/2465361</a></p>
<p>Die LIBs sind aufgeführt und auch diese verwenden auch die Funktion <em>FindActCtxSectionStringA</em>, die natürlich nicht unter <em>Windows 2000 </em>vorhanden ist.</p>
<p>Siehe auch:<br />
<a href="http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-dlls-sind-nicht-mehr-lauffahig-nach-installation-von-kb2467175-bzw-kb2467175/">http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-dlls-sind-nicht-mehr-lauffahig-nach-installation-von-kb2467175-bzw-kb2467175/</a></p>
<p>PS: Ich kann nur raten die entsprechenden Patches zu deinstallieren sofern man noch für Windows 2000 entwickelt und warten bis neue Securitypatches vorhanden sind.</p>
<p><strong>Nachtrag:<br />
</strong>Die betroffenen C/C++ Runtimes des <em>Visual Studio </em>haben die folgenden Versionsnummern<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

