<?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>Unmanaged Things &#187; MFC</title>
	<atom:link href="http://blog.speedproject.de/category/visual-studio/mfc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.speedproject.de</link>
	<description>Mehr .core als .nett</description>
	<lastBuildDate>Tue, 17 Jan 2012 13:51:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Multitouch, MFC 10 und das Kontextmenü</title>
		<link>http://blog.speedproject.de/2011/05/31/multitouch-mfc-10-und-das-kontextmenu/</link>
		<comments>http://blog.speedproject.de/2011/05/31/multitouch-mfc-10-und-das-kontextmenu/#comments</comments>
		<pubDate>Tue, 31 May 2011 14:30:56 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/?p=1499</guid>
		<description><![CDATA[Ein Anwender, der SpeedCommander auf seinem Tablet-PC einsetzt, hatte mir geschrieben, dass dort die Anzeige des Kontextmenüs nicht wie erwartet funktioniert. Eigentlich sollte das Kontextmenü erscheinen, wenn man den Stift etwas länger gedrückt hält. In SpeedCommander tut sich da aber nichts. Die Fehlersuche ergab, dass die Anzeige des Kontextmenüs bis zur Version 13.20 noch funktionierte [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Anwender, der SpeedCommander auf seinem Tablet-PC einsetzt, hatte mir geschrieben, dass dort die Anzeige des Kontextmenüs nicht wie erwartet funktioniert. Eigentlich sollte das Kontextmenü erscheinen, wenn man den Stift etwas länger gedrückt hält. In SpeedCommander tut sich da aber nichts.</p>
<p>Die Fehlersuche ergab, dass die Anzeige des Kontextmenüs bis zur Version 13.20 noch funktionierte und der Fehler erst ab der Version 13.30 auftrat. Ein Blick in die Versionsgeschichte zeigte aber, dass es zwischen diesen beiden Versionen keine Änderungen in der Listenansicht gab, die zu diesem Problem hätten führen können.</p>
<p>Mit der Version 13.30 erfolgte allerdings auch der Umstieg von der MFC 9 (SP1) von Visual Studio 2008 zur MFC 10 von Visual Studio 2010. Eigentlich sollte man erwarten, dass eine neue MFC-Version keine Verhaltensänderung nach sich zieht; zumindestens nicht, wenn man neue Funktionen nicht bewusst aktiviert. Die neue Multitouch-Unterstützung der MFC 10 ist hier aber eine Ausnahme, denn sie ändert die Funktionalität eines Fensters auch ohne explizite Verwendung der neuen Multitouch-Funktionen.</p>
<p>Die Ursache des Problems fand sich in der Verarbeitung der Nachricht <strong>WM_TABLET_QUERYSYSTEMGESTURESTATUS</strong> in der <strong>CWnd::OnTabletQuerySystemGestureStatus</strong>. Nach Konvertierung der Bildschirmkoordinaten in Koordinaten des Fensters wird die virtuelle Funktion <strong>CWnd::GetGestureStatus</strong> aufgerufen, die immer den Wert <strong>TABLET_DISABLE_PRESSANDHOLD</strong> zurückgibt. Die MFC 10 deaktiviert also für jedes von <strong>CWnd</strong> abgeleitete Fenster die Möglichkeit, das Kontextmenü der rechten Maustaste durch längeres Drücken des Stiftes oder Fingers anzuzeigen. Das ist unabhängig davon, ob die Multitouch-Funktionen verwendet werden oder nicht.</p>
<p>Die eleganteste Fehlerbehebung ist natürlich die Beseitigung der eigentlichen Ursache, indem die Rückgabe von <strong>CWnd::GetGestureStatus</strong> einfach auf <strong>0</strong> geändert wird. Nach einer Neuerstellung der MFC ist das Verhalten dann für alle Fenster wieder so, wie es in früheren MFC-Versionen war. Multitouch-Erweiterungen für bestimmte Fenster lassen sich trotzdem einbauen, die Funktion ist ja überschreibbar. Leider hat sich Microsoft mit der MFC 10 dafür entschieden, die entsprechenden Make- und Definitionsdateien nicht mehr auszuliefern. Sofern man sich die Dateien für eine Neuerstellung der MFC also nicht selbst zusammenbastelt, bleibt nur die Möglichkeit, die Funktion <strong>CWnd::GetGestureStatus</strong> in allen eigenen Ableitungen von <strong>CWnd</strong> zu überschreiben und den Wert <strong>0</strong> zurückzugeben:</p>
<pre class="brush: cpp; title: ; notranslate">
ULONG CMyWnd::GetGestureStatus(__in CPoint /*ptTouch*/)
{
    return 0;
}
</pre>
<p>Entsprechend des Umfangs der eigenen Anwendung und der Anzahl der Fenster mit eigenem Kontextmenü ist das natürlich ziemlich aufwendig. Aber es ist leider auch der einzige Weg, wenn man auf Tablet-PCs mit dem Kontextmenü arbeiten möchte. Einfacher für alle Betroffenen wäre es wohl, wenn Microsoft die nächste MFC-Version entsprechend anpassen würde.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2011/05/31/multitouch-mfc-10-und-das-kontextmenu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MFC abgespeckt</title>
		<link>http://blog.speedproject.de/2008/08/20/mfc-abgespeckt/</link>
		<comments>http://blog.speedproject.de/2008/08/20/mfc-abgespeckt/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 09:00:47 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2008/08/20/mfc-abgespeckt/</guid>
		<description><![CDATA[Letzte Woche Montag ist das Service Pack 1 für Visual Studio 2008 erschienen. Wichtige Neuerungen für den C++-Entwickler sind sicherlich die Unterstützung von TR1 und das UI-Update für die MFC. Nach den Installationsproblemen mit dem im April veröffentlichten Feature Pack wollte ich eigentlich erst einmal die Erfahrungen anderer abwarten. Daraus wurde dann doch nichts. Zu Testzwecken [...]]]></description>
			<content:encoded><![CDATA[<p>Letzte Woche Montag ist das <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&amp;FamilyID=27673c47-b3b5-4c67-bd99-84e525b5ce61">Service Pack 1 für Visual Studio 2008</a> erschienen. Wichtige Neuerungen für den C++-Entwickler sind sicherlich die Unterstützung von <a href="http://en.wikipedia.org/wiki/Technical_Report_1">TR1</a> und das <a href="http://blog.speedproject.de/2007/11/08/weitere-infos-zum-mfc-ui-update/">UI-Update für die MFC</a>. Nach den <a href="http://blog.speedproject.de/2008/04/14/vom-pech-verfolgt/">Installationsproblemen</a> mit dem im April veröffentlichten Feature Pack wollte ich eigentlich erst einmal die Erfahrungen anderer abwarten.</p>
<p>Daraus wurde dann doch nichts. Zu Testzwecken hatte ich mir ein VS 2008 in einer VM installiert und anschließend das SP1 eingespielt. Probleme gab es keine, die Microsoft-Entwickler haben aus dem Feature Pack-Dilemma gelernt und diesmal wieder ausreichend getestet.</p>
<p>Erfreulicherweise hat Microsoft auch das Konzept beibehalten, die bisherige MFC sowie die neuen UI-Klassen nicht zu verzahnen. Somit kann man die Einbindung der neuen Klassen durch Entfernen der entsprechenden Sektion im Makefile sehr einfach <a href="http://blog.speedproject.de/2008/01/08/visual-c-2008-feature-pack-beta/">entfernen</a> und die MFC weiter im bisherigen Umfang verwenden. Nach dem Löschen der nicht mehr benötigten Dateien hat man wieder ein schlankes und übersichtliches MFC-Verzeichnis.</p>
<p>Neben den neuen UI-Klassen gab es in der Standard-MFC nur kleinere Korrekturen. Die in <strong>afximpl.h</strong> definierten Konstanten CX_BORDER und CY_BORDER wurden nach AFX_CX_BORDER und AFX_CY_BORDER umbenannt. Bei einigen Zeigern fehlte bisher die Prüfung gegen NULL, das wurde mit dem SP1 auch behoben.</p>
<p>Nach den positiven Erfahrungen bei der VM-Installation habe ich das SP1 dann auch auf meinem Entwicklungsrechner eingespielt sowie C/C++-Laufzeit und MFC kompiliert. Die <a href="http://blog.speedproject.de/2007/11/30/vs-2008-cc-laufzeit-selbst-kompilieren/">Anleitungen für die C/C++-Laufzeit</a> sowie <a href="http://blog.speedproject.de/2007/12/01/vs-2008-mfc-selbst-kompilieren/">für die MFC</a> sind weiter gültig, zusätzlich müssen für einen manifestlosen Einsatz die Linkerkommentare in <strong>appmodul.cpp</strong></p>
<blockquote><p>#pragma comment(linker, &#8220;/include:__forceMFCManifestRTM&#8221;)</p></blockquote>
<p>und <strong>crtdll.c</strong></p>
<blockquote><p>#pragma comment(linker, &#8220;/include:__forceCRTManifestRTM&#8221;)</p></blockquote>
<p>auskommentiert werden. Ansonsten beschwert sich der Linker beim Erstellen der CRT sowie beim Erstellen einer MFC-Anwendung über einen fehlenden Import. Bisher habe ich leider noch nicht herausgefunden, was diese beiden Linkerkommentare bewirken sollen. Die RTM-Version kam noch ohne diese aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2008/08/20/mfc-abgespeckt/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fehler in CListCtrl::SortGroups</title>
		<link>http://blog.speedproject.de/2008/04/28/fehler-in-clistctrlsortgroups/</link>
		<comments>http://blog.speedproject.de/2008/04/28/fehler-in-clistctrlsortgroups/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 09:00:11 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2008/04/28/fehler-in-clistctrlsortgroups/</guid>
		<description><![CDATA[Die MFC-Unterstützung für die ComCtl32.dll von Windows XP war ja lange ziemlich mager, und so habe ich mir damals meine eigenen Wrapper-Funktionen geschrieben. Die MFC9 von Visual Studio 2008 ist mittlerweile auf dem aktuellen Stand, und so habe ich meine Wrapper-Funktionen zugunsten der MFC-Funktionen entfernt. Dabei ist mir aufgefallen, dass in der CListCtrl-Methode SortGroups die Parameter vertauscht [...]]]></description>
			<content:encoded><![CDATA[<p>Die MFC-Unterstützung für die ComCtl32.dll von Windows XP war ja lange ziemlich mager, und so habe ich mir damals meine eigenen Wrapper-Funktionen geschrieben. Die MFC9 von Visual Studio 2008 ist mittlerweile auf dem aktuellen Stand, und so habe ich meine Wrapper-Funktionen zugunsten der MFC-Funktionen entfernt.</p>
<p>Dabei ist mir aufgefallen, dass in der <a href="http://msdn2.microsoft.com/en-us/library/hfshke78(VS.80).aspx">CListCtrl</a>-Methode <a href="http://msdn2.microsoft.com/en-us/library/f676ws8a(VS.80).aspx">SortGroups</a> die Parameter vertauscht sind. Die Implementation schaut so aus:</p>
<pre class="brush: cpp; title: ; notranslate">
AFX_INLINE BOOL CListCtrl::SortGroups(PFNLVGROUPCOMPARE _pfnGroupCompare, LPVOID _plv)
{
    ASSERT(::IsWindow(m_hWnd));
    return (BOOL)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)(LPARAM)_plv, (LPARAM)_pfnGroupCompare );
}
</pre>
<p>während das API-Makro <a href="http://msdn2.microsoft.com/en-us/library/bb775130(VS.85).aspx">ListView_SortGroups</a> aus der <strong>commctrl.h</strong> so lautet:</p>
<pre class="brush: cpp; title: ; notranslate">
#define ListView_SortGroups(hwnd, _pfnGroupCompate, _plv) \
    SNDMSG((hwnd), LVM_SORTGROUPS, (WPARAM)(_pfnGroupCompate), (LPARAM)(_plv))
</pre>
<p>Beim Aufruf von <strong>SortGroups</strong> bekommt die Listenansicht also vertauschte WPARAM und LPARAM-Parameter und macht entweder gar nichts oder stürzt ab.</p>
<p>Damit <strong>SortGroups</strong> richtig funktioniert, muss es in <strong>afxcmn3.inl</strong> wie folgt geändert werden:</p>
<pre class="brush: cpp; title: ; notranslate">
AFX_INLINE BOOL CListCtrl::SortGroups(PFNLVGROUPCOMPARE _pfnGroupCompare, LPVOID _plv)
{
    ASSERT(::IsWindow(m_hWnd));
    return (BOOL)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)_pfnGroupCompare, (LPARAM)_plv );
}
</pre>
<p>Zu diesem Problem gibt es übrigens auch einen <a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=330520">Connect-Eintrag</a>. In diesem wird das Problem der vertauschten Parameter klar erläutert, aber Microsoft kann es ohne Demoprojekt oder Minidump nicht nachvollziehen&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2008/04/28/fehler-in-clistctrlsortgroups/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2008 Feature Pack Beta</title>
		<link>http://blog.speedproject.de/2008/01/08/visual-c-2008-feature-pack-beta/</link>
		<comments>http://blog.speedproject.de/2008/01/08/visual-c-2008-feature-pack-beta/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 09:09:45 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2008/01/08/visual-c-2008-feature-pack-beta/</guid>
		<description><![CDATA[Gestern abend hat Microsoft die erste Beta vom Visual C++ 2008 Feature Pack veröffentlicht. Das Paket ist 303 MiB groß und erfordert zur Installation ein englisches Visual Studio 2008. Die dazugehörige Dokumentation ist etwas kleiner (3.40 MiB) und lässt sich auch ohne Installation betrachten. Mit der Installation des Feature Packs werden die CRT- und MFC-Verzeichnisse [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern abend hat Microsoft die erste Beta vom <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&amp;displaylang=en">Visual C++ 2008 Feature Pack</a> veröffentlicht. Das Paket ist 303 MiB groß und erfordert zur Installation ein englisches Visual Studio 2008. Die <a href="http://www.microsoft.com/downloads/info.aspx?na=40&amp;p=2&amp;SrcDisplayLang=en&amp;SrcCategoryId=&amp;SrcFamilyId=d466226b-8dab-445f-a7b4-448b326c48e7&amp;u=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyId%3d0D805D4E-2DC2-47C7-8818-A9F59DE4CD9B%26displaylang%3den">dazugehörige Dokumentation</a> ist etwas kleiner (3.40 MiB) und lässt sich auch ohne Installation betrachten.</p>
<p>Mit der Installation des Feature Packs werden die CRT- und MFC-Verzeichnisse aktualisiert. Es empfiehlt sich daher, vor der Installation eine Kopie des aktuellen VS 2008-Installationsverzeichnisses anzulegen, damit man nach der Installation bei Bedarf zwischen beiden Versionen hin- und herschalten kann. Wer nach der Installation einen schwerwiegenden Fehler mit der Meldung bekommt, dass keine VS 2008-Installation gefunden werden konnte, der sollte vor der Installation des Patches die Installations-DVD von VS 2008 einlegen. Eine Aufforderung dazu gibt es nämlich nicht.</p>
<p>Mit dem Visual C++ 2008 Feature Pack verwandelt sich die MFC zu einem Monstrum. Das <strong>atlmfc\include</strong>-Verzeichnis wächst von 152 Dateien auf 334 Dateien an und im <strong>atlmfc\mfc\src</strong>-Verzeichnis befinden sich nach dem Update 437 Dateien (vorher 261). Die zu verteilende <strong>mfc90(u).dll</strong> wächst von 1.10 MiB auf 3.57 MiB an, was die Größe des Redistributionspakets mal eben locker verdreifacht.</p>
<p>Nun zu den guten Nachrichten. Die normalen MFC-Dateien sind bisher (noch?) nicht von den neuen BCG-Dateien abhängig. Wenn man in <strong>atlmfc\mfc\src\makefile</strong> die Sektion <strong>CONTROLBARS</strong> entfernt und die neuen Exporte in den <strong>mfc90(ud).def</strong>-Dateien löscht, dann kann die MFC immer noch ohne die BCG-Dateien erstellt werden. Zudem muss aus der <strong>atlmfc\mfc\src\mfcdll.rc</strong> noch die Zeile <strong>#include &#8220;afxribbon.rc&#8221;</strong> auskommentiert werden, damit die Office 2007-Grafiken nicht eingebunden werden. Wenn das auch in Zukunft so bleibt, dann kann ich damit leben.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2008/01/08/visual-c-2008-feature-pack-beta/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>VS 2008: MFC selbst kompilieren</title>
		<link>http://blog.speedproject.de/2007/12/01/vs-2008-mfc-selbst-kompilieren/</link>
		<comments>http://blog.speedproject.de/2007/12/01/vs-2008-mfc-selbst-kompilieren/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 10:02:41 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2007/12/01/vs-2008-mfc-selbst-kompilieren/</guid>
		<description><![CDATA[Gestern hatte ich darüber berichtet, wie man der WinSxS-Hölle entkommt und eine eigene Version der C/C++-Laufzeit kompiliert. Nun kompilieren wir uns noch eine MFC ohne Manifest und können in Zukunft die C/C++-Laufzeit sowie die MFC unseren Anwendungen beilegen, ohne uns mit Manifestproblemen herumquälen zu müssen. 1. Anpassen der Dateien Die nötigen Änderungen an den MFC-Dateien halten [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern hatte ich <a href="http://blog.speedproject.de/2007/11/30/vs-2008-cc-laufzeit-selbst-kompilieren/">darüber berichtet</a>, wie man der WinSxS-Hölle entkommt und eine eigene Version der C/C++-Laufzeit kompiliert. Nun kompilieren wir uns noch eine MFC ohne Manifest und können in Zukunft die C/C++-Laufzeit sowie die MFC unseren Anwendungen beilegen, ohne uns mit Manifestproblemen herumquälen zu müssen.</p>
<p><strong>1. Anpassen der Dateien</strong></p>
<p>Die nötigen Änderungen an den MFC-Dateien halten sich in Grenzen. Zuerst schnappen wir uns die Datei <strong>atlmfc\include\MFCassem.h</strong> und kommentieren das Manifest ab Zeile 25 bis zum Ende aus. In <strong>atlmfc\include\afx.h</strong> ersetzen wir die Zeilen 81 bis 97 durch folgende:</p>
<blockquote><p>#ifndef _UNICODE<br />
#ifdef _DEBUG<br />
#pragma comment(lib, &#8220;MyMfc90d.lib&#8221;)<br />
#pragma comment(lib, &#8220;MyMfc90sd.lib&#8221;)<br />
#else<br />
#pragma comment(lib, &#8220;MyMfc90.lib&#8221;)<br />
#pragma comment(lib, &#8220;MyMfc90s.lib&#8221;)<br />
#endif<br />
#else<br />
#ifdef _DEBUG<br />
#pragma comment(lib, &#8220;MyMfc90ud.lib&#8221;)<br />
#pragma comment(lib, &#8220;MyMfc90sud.lib&#8221;)<br />
#else<br />
#pragma comment(lib, &#8220;MyMfc90u.lib&#8221;)<br />
#pragma comment(lib, &#8220;MyMfc90su.lib&#8221;)<br />
#endif<br />
#endif</p></blockquote>
<p>Damit legen wir fest, dass unsere Anwendungen dynamisch gegen die <strong>MyMfc90(u).dll</strong> gelinkt werden.</p>
<p><strong>2. Vorbereitung der .DEF-Dateien</strong></p>
<p>In <strong>atlmfc\src\mfc\intel</strong> und <strong>atlmfc\src\mfc\intel</strong> befinden sich jeweils vier .DEF-Dateien, deren Modulnamen ebenfalls angepasst werden müssen:</p>
<blockquote><p>mfc90.def -&gt; MyMfc90<br />
mfc90d.def -&gt; MyMfc90d<br />
mfc90u.def -&gt; MyMfc90u<br />
mfc90ud.def -&gt; MyMfc90ud</p></blockquote>
<p>Im Gegensatz zur C/C++-Laufzeit werden aber nur die Modulnamen <strong>in</strong> den .def-Dateien angepasst, die Dateinamen selbst dürfen <strong>nicht</strong> geändert werden.</p>
<p><strong>3. Anpassung des Makefiles</strong></p>
<p>Die Änderung in der Datei <strong>atlmfc\src\atlmfc.mak</strong> beschränkt sich darauf, die Erstellung der statischen MFC sowie der WinForms-Komponenten auszuklammern. Dazu löschen wir in Zeile 123 die Einträge <strong>MFC_STATIC</strong> und <strong>MFCM_DLL</strong>.</p>
<p><strong>4. Kompilieren</strong></p>
<p>Nun kopieren wir unsere bereits erstellten Batchdateien mit den Umgebungsvariablen aus dem Ordner <strong>crt</strong> in den Ordner <strong>atlmfc\src</strong>. Zusätzlich erstellen wir in diesem Verzeichnis eine Datei <strong>makemfc_x86.bat</strong> mit dem Inhalt</p>
<blockquote><p>nmake -f atlmfc.mak MFC LIBNAME=MyMfc90 PLATFORM=INTEL MP_BUILD=1</p></blockquote>
<p>sowie <strong>makemfc_amd64.bat</strong> mit</p>
<blockquote><p>nmake -f atlmfc.mak MFC LIBNAME=MyMfc90 PLATFORM=AMD64 MP_BUILD=1</p></blockquote>
<p>Anschließend öffnen wir eine Eingabeaufforderung und starten</p>
<blockquote><p>vcvars_x86.bat<br />
makemfc_x86.bat</p></blockquote>
<p>sowie anschließend</p>
<blockquote><p>vcvars_amd64.bat<br />
makemfc_amd64.bat</p></blockquote>
<p>Nach ein paar Minuten sollte der Compiler seine Arbeit erledigt haben und wieder das Befehlsprompt erscheinen.</p>
<p><strong>5. Kopieren der Lib-Dateien</strong></p>
<p>Der letzte Schritt ist das Kopieren der lib-Dateien nach <strong>atlmfc\lib</strong>, damit der Linker diese später auch findet. Die Lib-Dateien für die 32-bit Version werden bei der MFC-Erstellung in <strong>atlmfc\lib\Intel</strong> abgelegt und müssen deshalb manuell nach <strong>atlmfc\lib</strong> kopiert werden. Die Lib-Dateien für die x64-Version landen dagegen direkt im richtigen Verzeichnis (<strong>atlmfc\lib\amd64</strong>).</p>
<p>Die MFC-Dlls finden wir in <strong>atlmfc\src\mfc\intel</strong> bzw. <strong>atlmfc\src\mfc\amd64</strong>. Zusammen mit den Dlls der C/C++-Laufzeit sowie den jeweiligen PDB-Dateien kopieren wir sie in einen Ordner, der in die PATH-Umgebungsvariable eingetragen wird. Somit ist sichergestellt, dass Visual Studio 2008 beim Debuggen auch alle nötigen Dateien findet.</p>
<p><strong>6. Kontrolle</strong></p>
<p>Zur Kontrolle erstellen wir uns ein Testprojekt und prüfen, ob gegen die richtigen Dateien gelinkt wird. Dazu lassen wir uns vom AppWizard eine einfache MFC-Anwendung erstellen und kompilieren diese. Mit Hilfe der Schnellansicht von SpeedCommander lässt sich leicht ermitteln, ob die Programmdatei an die richtigen Module gebunden wurden. Wenn es so ausschaut, dann ist alles in bester Ordnung:</p>
<blockquote><p><img title="Importe von Test.exe" src="http://blog.speedproject.de/wp-content/uploads/2007/12/imports.png" alt="Importe von Test.exe" width="525" height="321" /></p></blockquote>
<p>Die gleiche Aktion führen wir noch einmal für die <strong>MyMfc90(ud).dll</strong> durch, diese sollten ebenfalls gegen die <strong>MyVcr90(d).dll</strong> gelinkt sein.</p>
<p><strong>7. Letzte Worte</strong></p>
<p>Zum Abschluss sei nochmals erwähnt, dass sich diese beiden Artikel wirklich nur an den <strong>nativen Entwickler</strong> richten, der vollständigen Einfluss auf die von ihm verwendeten Komponenten hat. Dazu gehört, dass alle Fremdkomponenten im Quellcode vorliegen und somit gegen die angepasste C/C++-Laufzeit bzw. die MFC kompiliert werden können. Verwendet man dagegen zusätzliche Managed Code-Erweiterungen oder fertige Libs/Dlls, die bereits gegen die originale <strong>MsVcr90.dll</strong> gelinkt sind, dann sollte man um die manifestlose Lösung einen großen Bogen machen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2007/12/01/vs-2008-mfc-selbst-kompilieren/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>2.7 MiB mehr für nichts</title>
		<link>http://blog.speedproject.de/2007/11/12/27-mib-mehr-fuer-nichts/</link>
		<comments>http://blog.speedproject.de/2007/11/12/27-mib-mehr-fuer-nichts/#comments</comments>
		<pubDate>Mon, 12 Nov 2007 17:52:04 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2007/11/12/27-mib-mehr-fuer-nichts/</guid>
		<description><![CDATA[Pat Brenner hat im VC-Blog meine schlimmsten Befürchtungen bestätigt: Die Erweiterungen von MFCnext werden komplett in die MFCxx.dll gepackt, was deren Größe mal eben von 1.1 MiB auf 3.8 MiB ansteigen lässt. Einer der Vorteile der MFCxx.dll war immer, dass sie über die Jahre hinweg relativ schlank geblieben ist. All das ist Geschichte, stattdessen wird die MFC [...]]]></description>
			<content:encoded><![CDATA[<p>Pat Brenner hat im <a href="http://blogs.msdn.com/vcblog/">VC-Blog</a> meine schlimmsten Befürchtungen bestätigt: Die Erweiterungen von MFCnext werden komplett in die MFCxx.dll gepackt, was deren Größe mal eben von 1.1 MiB auf 3.8 MiB ansteigen lässt. Einer der Vorteile der MFCxx.dll war immer, dass sie über die Jahre hinweg relativ schlank geblieben ist. All das ist Geschichte, stattdessen wird die MFC jetzt mit Klassen vollgestopft, welche wohl die wenigsten benötigen. Und am allerwenigsten diejenigen, die schon eine eigene UI-Bibliothek einsetzen.</p>
<p>Ich hoffe immer noch inständig, dass sich das unnützte Zeug beim Erstellen einer angepassten MFC-Version recht einfach ausblenden lassen wird. Sollte Microsoft es aber schaffen, MFC und MFCnext untrennbar miteinander zu verquicken, dann wird die MFC 9.0 meine letzte MFC-Version sein. Ich hatte eigentlich gedacht, dass ich mit dem Umstieg von VC6 auf VS 2008 nun längere Zeit nichts mehr mit MFC-Anpassungen zu tun haben und automatisch immer in den Genuss der neuesten Version kommen werde. Aber so kann man sich täuschen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2007/11/12/27-mib-mehr-fuer-nichts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weitere Infos zum MFC UI-Update</title>
		<link>http://blog.speedproject.de/2007/11/08/weitere-infos-zum-mfc-ui-update/</link>
		<comments>http://blog.speedproject.de/2007/11/08/weitere-infos-zum-mfc-ui-update/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 19:14:25 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2007/11/08/weitere-infos-zum-mfc-ui-update/</guid>
		<description><![CDATA[Im Codejock-Forum hat Kirk Stowell (der Chef von Codejock) ein paar interessante Infos zur ganzen Geschichte veröffentlicht, die ich euch nicht vorenthalten möchte. Demnach hat Microsoft schon vor einigen Jahren Codejock kontaktiert, um die MFC für Visual Studio 2005 etwas aufzupeppen. Es gab ein paar Gespräche, zu mehr führte es aber nicht. Im März dieses Jahres ist Microsoft [...]]]></description>
			<content:encoded><![CDATA[<p>Im Codejock-Forum hat Kirk Stowell (der Chef von <a href="http://www.codejock.com/">Codejock</a>) ein paar interessante Infos zur ganzen Geschichte <a href="https://forum.codejock.com/forum_posts.asp?TID=8232&amp;PID=28265#28265">veröffentlicht</a>, die ich euch nicht vorenthalten möchte. Demnach hat Microsoft schon vor einigen Jahren Codejock kontaktiert, um die MFC für Visual Studio 2005 etwas aufzupeppen. Es gab ein paar Gespräche, zu mehr führte es aber nicht.</p>
<p>Im März dieses Jahres ist Microsoft erneut mit Codejock in Kontakt getreten und hat Interesse daran geäußert, Codejocks MFC-Komponenten in die MFC von Visual Studio 2008 aufzunehmen. Das Budget für mögliche Lizenzgebühren sei aber nicht gerade hoch.</p>
<p>Im August ließ Microsoft wieder von sich hören. Man wollte mit Codejock über Erweiterungspläne der MFC diskutieren, als auch über die möglichen Auswirkungen auf die MFC-Produkte von Codejock. In diesen Gesprächen kam herüber, dass Microsoft für wenig Geld die MFC-Komponenten von <a href="http://www.bcgsoft.com/">BCGSoft</a> lizenzieren wird und diese somit Teil der MFC werden sollen.</p>
<p>Kirk gab zu bedenken, dass sich diese Entscheidung als großer Fehler herausstellen könnte. Aus Erfahrung gäbe es einige Probleme mit den BCG-Komponenten, angefangen von der Stabilität bis hin zur recht schwachen Performance. Er wies Microsoft auch darauf hin, dass sich gerade deshalb viele BCG-Anwender für einen Wechsel zu den Produkten von Codejock entschieden hätten und schlug vor, dass Microsoft doch die Meinung einiger dieser Kunden einholen könnte. Der Vertrag mit BCGSoft war aber schon unterschrieben und Microsoft sah keine Notwendigkeit mehr, diese Sache weiter zu verfolgen.</p>
<p>Genau wie Kirk glaube ich auch, dass Microsoft eine ziemlich unglückliche Entscheidung getroffen hat. Die Performance-Probleme waren damals auch einer der Gründe für mich, vor vier Jahren zu Codejock zu wechseln. Ich kann mich noch gut daran erinnern, dass die Einbindung der BCGControlBar in FileSearch (SpeedCommander 9) den Start der Anwendung um knapp zwei Sekunden verzögerte. Also verzichtete ich damals in FileSearch auf die anpassbaren Menüs, stattdessen zeigte sich FileSearch nur mit normalen Menüs.</p>
<p>Gemeinsam mit Rainer haben wir damals auch die Aufrufgeschwindigkeit der frei downloadbaren Beispieldateien von Codejock und BCGSoft miteinander verglichen. Die von BCGSoft starteten alle merklich langsamer. Auf Rainers Rechner, der damals auch nicht gerade der schnellste war, wurde dies besonders deutlich.</p>
<p>Microsoft wird also einiges an Mühe aufwenden müssen, damit die MFCnext ein stabiles und performantes Produkt wird. Es ist als Entwickler immer schwer, sich in eine so umfangreiche Bibliothek einzuarbeiten. Mal schauen, wie Microsoft das meistern wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2007/11/08/weitere-infos-zum-mfc-ui-update/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>The Next Generation</title>
		<link>http://blog.speedproject.de/2007/11/08/the-next-generation/</link>
		<comments>http://blog.speedproject.de/2007/11/08/the-next-generation/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 00:49:09 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2007/11/08/the-next-generation/</guid>
		<description><![CDATA[In Barcelona findet in dieser Woche die TechEd Developers 2007 statt, also der richtige Zeitpunkt, um Großes zu verkünden. Die erste wichtige Info ist, dass Visual Studio 2008 bis zum Ende dieses Monats verfügbar sein wird und damit wohl allen MSDN-Abonnenten zur Verfügung gestellt wird. Schon seit einiger Zeit laufen einem im Web Hinweise über [...]]]></description>
			<content:encoded><![CDATA[<p>In Barcelona findet in dieser Woche die <a href="http://www.mseventseurope.com/teched/07/developers/content/Pages/Default.aspx">TechEd Developers 2007</a> statt, also der richtige Zeitpunkt, um Großes zu verkünden. Die erste wichtige Info ist, dass <a href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx">Visual Studio 2008</a> bis zum <a href="http://www.microsoft.com/presspass/press/2007/nov07/11-05TechEdDevelopersPR.mspx">Ende dieses Monats verfügbar</a> sein wird und damit wohl allen MSDN-Abonnenten zur Verfügung gestellt wird.</p>
<p>Schon seit einiger Zeit laufen einem im Web Hinweise über den Weg, dass auch für die MFC einige Überraschungen zu erwarten sind. Microsoft hat nun die Katze aus dem Sack gelassen, und diese Katze ist wirklich fett. Die MFC bekommt ein <a href="http://blog.m-ri.de/index.php/2007/11/07/mfc-updates-for-visual-studio-2008-and-beyond-mfcnext/">vollständiges UI-Toolkit spendiert</a> (genannt MFCnext), unter anderem mit</p>
<ul>
<li>Office 2007-Ribbon</li>
<li>Erweiterte Docking-Funktionen</li>
<li>Verschiedene Styles (Office 2003, Office 2007, &#8230;)</li>
<li>Etliche neue UI-Elemente (Eigenschaftsseiten, Maskierbares Editierfeld, Farbpicker, &#8230;)</li>
</ul>
<p>Der erste Release Candidate soll schon im Dezember veröffentlicht werden, die endgültige Freigabe ist für März 2008 geplant.</p>
<p>Auf den ersten Blick sieht das auch alles Klasse aus, mit dem zweiten sieht man aber bekanntlich besser. Und man stellt fest, dass dies alles ja schon seit Jahren zur Verfügung steht. Zwar nicht mit der MFC selbst, wohl aber mit den Toolkits anderer Hersteller (<a href="http://www.codejock.com/">Codejock</a> oder <a href="http://www.bcgsoft.com/">BCGSoft</a>). Hier stellt sich nun die Frage, wie der Vergleich zwischen den neuen MFC-Erweiterungen und den etablierten Bibliotheken ausschauen wird, sowohl vom Umfang als auch von der Performance und der Codequalität. Auch wird interessant, wie die beiden Hersteller mit der Situation klarkommen, dass die von ihnen verkauften Funktionen nun plötzlich Bestandteil von Visual Studio sind und damit für jeden MFC-Anwender auch kostenfrei zur Verfügung stehen. Wenn sich Microsoft einmal entschließen sollte, jedem Windows einen vernünftigen Dateimanager beizulegen, dann hätte ich wohl ein ähnliches Problem.</p>
<p>Dank <a href="http://blog.kalmbach-software.de/">Jochen Kalmbach</a> brauchen wir mit der Beantwortung dieser Fragen aber wohl nicht bis zum Dezember warten. In seiner <a href="http://blog.kalmbach-software.de/2007/11/07/mfcupdate-mfc-now-has-a-visual-manager-and-will-add-office-2007-ribbon-controls-and-many-more-features/">Information zum geplanten MFC-Update</a> verrät er nämlich, dass die meisten Controls von <a href="http://www.bcgsoft.com/">BCGSoft</a> &#8220;portiert&#8221; wurden. Wenn man sich mal die von ihm gemachten Fotos der Session anschaut und diese mal mit den Headerdateien der <a href="http://www.bcgsoft.com/bcgcontrolbarpro.htm">BCGControlBar Professional Edition</a> vergleicht, dann entdeckt man auch erstaunlich viele Gemeinsamkeiten mit den BCG-Klassen. &#8220;Portiert&#8221; heißt dann vermutlich eher &#8220;aufgekauft und umbenannt&#8221;. Aus Raider wird also Twix, sonst ändert sich nichts.</p>
<p>Und genau das ist für mich der Punkt, auch in Zukunft weiter auf Codejock zu setzen. Bis einschließlich SpeedCommander 9 habe ich ja bereits mit der BCGControlBar gearbeitet, mit SpeedCommander 10 erfolgte der Wechsel auf das <a href="http://www.codejock.com/products/toolkitpro/">Xtreme Toolkit Pro</a>. Und diesen Wechsel habe ich bisher keine einzige Sekunde bereut. Nach meiner Erfahrung ist die Codejock-Bibliothek nämlich um einiges performanter und auch übersichtlicher und moderner aufgebaut. Das Klassenlayout der aktuellen BCGControlBar-Version hat dagegen noch erstaunlich viel Gemeinsamkeiten mit den ganz frühen Versionen, die ich noch verwendet habe. Das mag gut für die Abwärtskompatibilität sein, so ein altes Fundament hat aber leider auch Nachteile. Neue Sachen werden nämlich immer nur angebaut und irgendwann schwindet die Übersichtlichkeit.</p>
<p>Wer also schon mal schauen will, wie sich die neuen UI-Elemente in der Praxis anfühlen, der muss sich einfach nur die Testversion der BCGControlBar Professional Edition <a href="http://www.bcgsoft.com/download.htm">herunterladen</a>. Auf der gleichen Seite gibt es auch bereits kompilierte Beispielanwendungen. Spannend wird sicher sein, wie die Zukunft der BCGControlBar ausschaut. Ich glaube kaum, dass BCGSoft damit noch viel Umsatz machen wird. Aber vermutlich wird der Scheck von Microsoft groß genug gewesen sein, um die Schmerzen einigermaßen in Grenzen zu halten. Weitaus schwieriger wird es dagegen für Codejock werden. Ich hoffe wirklich, dass sich die Jungs durch diese Ankündigung nicht entmutigen lassen und auch in Zukunft gute Umsätze haben. Es wäre nämlich äußerst schade, wenn Codejock dadurch auf der Strecke bleiben würde.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2007/11/08/the-next-generation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Erster Ausblick auf die MFC 9</title>
		<link>http://blog.speedproject.de/2007/03/09/erster-ausblick-auf-die-mfc-9/</link>
		<comments>http://blog.speedproject.de/2007/03/09/erster-ausblick-auf-die-mfc-9/#comments</comments>
		<pubDate>Fri, 09 Mar 2007 08:41:19 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2007/03/09/erster-ausblick-auf-die-mfc-9/</guid>
		<description><![CDATA[Auf Channel 9 ist ein Video erschienen, in dem Bill Dunlap und Steve Teixeira über die zukünftige Strategie von Visual C++ erzählen. Im letzten Sommer gab es im Team intensive Überlegungen, ob die schon länger anhaltende Bevorzugung von Managed Code gegenüber nativen Code in Visual C++ richtig ist. Mit der Befragung verschiedener Anwender (Systemintegratoren, ISV) stellte sich heraus, dass [...]]]></description>
			<content:encoded><![CDATA[<p>Auf <a href="http://channel9.msdn.com/">Channel 9</a> ist ein <a href="http://channel9.msdn.com/ShowPost.aspx?PostID=281987">Video</a> erschienen, in dem Bill Dunlap und Steve Teixeira über die zukünftige Strategie von Visual C++ erzählen. Im letzten Sommer gab es im Team intensive Überlegungen, ob die schon länger anhaltende Bevorzugung von Managed Code gegenüber nativen Code in Visual C++ richtig ist. Mit der Befragung verschiedener Anwender (Systemintegratoren, ISV) stellte sich heraus, dass trotz der .NET-Hysterie immer noch die meisten Anwendungen in nativem C++ programmiert werden. Die Entwicklung basiert auf riesengroßen Quellcodearchiven in C++, die nicht mal eben auf .NET angepasst werden können. Stattdessen muss der Code gepflegt werden, nicht selten enthält er auch einiges an geistigem Eigentum.</p>
<p>Mit dem kommenden Visual Studio 9 (Orcas) soll nun für die C++-Sparte wieder mehr Wert auf die Unterstützung von nativem Code gelegt werden. Dazu wird die Interoperabilität zwischen nativem Code und Managed Code weiter verbessert, speziell die Konvertierung von einzelnen Dateitypen. Zudem wird Orcas auch eine STL in Managed Code für die CLR enthalten. Die MFC wird endlich wieder auf einen aktuellen Stand gebracht und soll viele Neuerungen in Vista unterstützen.</p>
<p>Die ersten Ergebnisse lassen sich bereits in der neuen <a href="http://www.microsoft.com/downloads/details.aspx?familyid=cf76fcba-07af-47ac-8822-4ad346210670&#038;displaylang=en">Orcas-CTP vom März</a> begutachten. Spielten sich die Änderungen in der MFC in der Orcas-CTP vom Januar im Vergleich zu VS 2005 nur im namenstechnischen Bereich ab, so enthält die Orcas-CTP vom März viele Änderungen, die wichtigsten möchte ich hier kurz skizzieren.</p>
<p>Entwickler, die mit ihren Anwendungen noch Windows 9x und NT4 unterstützen, müssen sich vor dem Umstieg auf Orcas samt MFC 9 die Frage stellen, ob sie dies auch weiterhin tun möchten. Mit der MFC 9 werden nämlich alle Brücken zu Windows 9x/NT4 abgerissen, die Mindestvoraussetzung für eine MFC 9-Anwendung ist Windows 2000. Auch die ISAPI-Unterstützung wurde entfernt.</p>
<p><strong>CWnd</strong> enthält Nachrichtenhandler für neuere Systemnachrichten, für diese wurden auch neue Message-Cracker eingeführt. <strong>CFrameWnd</strong> bietet Unterstützung für die aus Vista bekannten ausblendbaren Menüs, die erst beim Drücken der Alt-Taste eingeblendet werden. <strong>CPropertySheet</strong> unterstützt nun auch die neuen <a href="http://weblogs.asp.net/kennykerr/archive/2006/07/12/Windows-Vista-for-Developers-_1320_-Part-1-_1320_-Aero-Wizards.aspx">Aero-Assistenten</a>.</p>
<p>Die UI-Elemente <strong>CListCtrl</strong>, <strong>CTreeCtrl</strong>, <strong>CHeaderCtrl</strong>, <strong>CProgressCtrl</strong> und <strong>CToolTipCtrl</strong> aus der ComCtl32.dll unterstützen nun alle bis einschließlich Vista vorhandene Nachrichten und Stile. Das bereits mit der Version 4.71 eingeführte Pager-Control wird nun auch endlich gekapselt.</p>
<p>Neu ist auch <strong>CNetAddressCtrl</strong>, welches ein Editierfeld für Netzwerkadressen inkl. ihrer Verifizierung kapselt. Die Registrierung der Fensterklasse erfolgt mit der Funktion <a href="http://msdn2.microsoft.com/en-us/library/ms647416.aspx">InitNetworkAddressControl</a>, welche erstaunlicherweise zur Shell32.dll gehört und nicht zur ComCtl32.dll. Daher findet man im Windows SDK für Vista auch keinen Verweis innerhalb der Windows Controls, stattdessen werden die entsprechenden Macros unter Windows Shell &#8211; Shell Reference &#8211; Shell Macros aufgeführt.</p>
<p>Die Klasse <strong>CFileDialog</strong> zum Anzeigen eines &#8220;Datei öffnen/speichern&#8221;-Dialogs kann nun auch die neuen Dateidialoge von Windows Vista anzeigen. Vista zeigt zwar unter Umständen die neuen Dialoge selbstständig, allerdings auch nur, wenn die Anwendung keine Hookfunktion für diese Dialoge einsetzt. Da die MFC für die Implementation von CFileDialog aber zwingend auf die Hookfunktion angewiesen ist, zeigen MFC-Anwendungen unter Vista immer nur die alten Dialoge. In der MFC 9 nutzt CFileDialog unter Vista die COM-Schnittstellen für die neuen Dateidialoge. Der Entwickler verwendet CFileDialog wie bisher, der Rest geschieht automatisch unter der Haube.</p>
<p>Es ist sehr erfreulich, dass man bei Microsoft wohl eingesehen hat, dass die meisten C++-Entwickler ihre Sprache und ihre Anwendungen in nativem Code nicht einfach aufgeben wollen und können. Wenn sich jetzt auch noch Orcas in VC6-Performance ohne ständiges Geflicker präsentieren und der ClassWizard ein Comeback erleben würde, dann könnte ich guten Gewissens auf Orcas umsteigen und den VC6 in seinen wohlverdienten Ruhestand schicken. Aber ich fürchte, dass dies trotz der guten Aussichten so schnell wohl nicht passieren wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2007/03/09/erster-ausblick-auf-die-mfc-9/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Kein Fehler aufgetreten</title>
		<link>http://blog.speedproject.de/2006/05/19/kein-fehler-aufgetreten/</link>
		<comments>http://blog.speedproject.de/2006/05/19/kein-fehler-aufgetreten/#comments</comments>
		<pubDate>Fri, 19 May 2006 11:46:32 +0000</pubDate>
		<dc:creator>Sven</dc:creator>
				<category><![CDATA[MFC]]></category>

		<guid isPermaLink="false">http://blog.speedproject.de/2006/05/19/kein-fehler-aufgetreten/</guid>
		<description><![CDATA[Henrik hat festgestellt, dass SpeedEdit beim Öffnen einer leeren Datei mit der Erweiterung .url die Meldung &#8220;Kein Fehler aufgetreten.&#8221; ausgibt. Beim Debuggen habe ich dann auch recht schnell den Grund dafür gefunden. In der Funktion OpenDocumentFile des CDocManager-Objektes wird die Funktion AfxResolveShortcut aufgerufen, mit deren Hilfe Verknüpfungen aufgelöst werden sollen. AfxResolveShortcut verwendet dafür die Schnittstelle [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://henrik.heimbuerger.de/">Henrik</a> hat festgestellt, dass SpeedEdit beim Öffnen einer leeren Datei mit der Erweiterung .url die Meldung &#8220;Kein Fehler aufgetreten.&#8221; ausgibt. Beim Debuggen habe ich dann auch recht schnell den Grund dafür gefunden.</p>
<p>In der Funktion <strong>OpenDocumentFile</strong> des <strong>CDocManager</strong>-Objektes wird die Funktion <strong>AfxResolveShortcut</strong> aufgerufen, mit deren Hilfe Verknüpfungen aufgelöst werden sollen. <strong>AfxResolveShortcut</strong> verwendet dafür die Schnittstelle <strong><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/ishelllink/ishelllink.asp">IShellLink</a></strong> und gibt im Erfolgsfall den aufgelösten Pfadnamen zurück. Bei einer leeren .url-Datei vermeldet <strong><a href="http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/ifaces/ishelllink/Resolve.asp">IShellLink::Resolve</a></strong> zwar Erfolg, <strong><a href="http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/ifaces/ishelllink/GetPath.asp">IShellLink::GetPath</a></strong> gibt aber einen leeren String zurück. <strong>AfxResolveShortcut</strong> meldet den Erfolg weiter und die MFC verwendet nun statt des Dateinamens für die .url-Datei den leeren String, um die Datei zu öffnen.</p>
<p>Abhilfe schafft die zusätzliche Prüfung auf einen leeren aufgelösten Pfadnamen in der Datei <strong>docmgr.cpp</strong> (Zeile 928):</p>
<blockquote><p><code>if (AfxResolveShortcut(AfxGetMainWnd(), szPath, szLinkName, _MAX_PATH) <strong>&#038;&#038; szLinkName[0]</strong>)<br />
{<br />
   Checked::tcscpy_s(szPath, _countof(szPath), szLinkName);<br />
} </code></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.speedproject.de/2006/05/19/kein-fehler-aufgetreten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

