{"id":56,"date":"2007-04-19T08:54:30","date_gmt":"2007-04-19T06:54:30","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/04\/19\/probleme-bei-der-ctime-serialisierung-mit-mfc-71-und-mfc-80\/"},"modified":"2007-04-19T08:54:30","modified_gmt":"2007-04-19T06:54:30","slug":"probleme-bei-der-ctime-serialisierung-mit-mfc-71-und-mfc-80","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/04\/19\/probleme-bei-der-ctime-serialisierung-mit-mfc-71-und-mfc-80\/","title":{"rendered":"Probleme bei der CTime Serialisierung mit MFC 7.1 und MFC 8.0"},"content":{"rendered":"<p>Der operator&lt;&lt; und operator&gt;&gt; in MFC 7.1 serialisiert grunds\u00e4tzlich nur 32bit Werte des CTime. Das wurde offensichtlich gemacht um r\u00fcckw\u00e4rtskompatibel zu sein zu time_t obwohl mittlerweile ja intern __time64_t verwendet wird.<br \/>\nGleichzeitig wurde Serialize64 eingef\u00fchrt.<br \/>\nMan muss also in VS2003 mit MFC 7.1 Serialize64 verwenden um alle 64bit zu speichern, also den komplettem Wertebereich von CTime.<\/p>\n<p>In VS2005 mit der MFC 8.0 ging man jetzt einen Schritt weiter. Die Operatoren operator&lt;&lt; und operator&gt;&gt; sollten auch 64bit verarbeiten k\u00f6nnen. Man wollte 64bit speichern und 32bit Daten beim Einlesen erkennen wenn es eben aus alten Dateien stammt und nicht mit der neuen MFC geschrieben wurde.<\/p>\n<p>Dazu wird bei Speicherung von 64bit CTime \u00fcber den operator&lt;&lt; zuerst ein DWORD gespeichert mit dem Wert cTime64Mark (der Wert ist INT_MIN+10). Danach der 64bit Wert.<br \/>\nBeim Lesen wird zuerst ein DWORD gelesen. Ist dieses nicht cTime64Mark (also INT_MIN+10), dann wird dieser Wert als 32bit CTime Wert gelesen.<br \/>\nAnsonsten werden die 64bit in den CTime Wert gelesen.<\/p>\n<p>operator&gt;&gt; bl\u00e4ht also auch die Ausgabe um weitere 32bit auf. Ein 64bit CTime Wert wird in der MFC 8.0 als 32+64bit Wert gespeichert, also 4Bytes mehr.<\/p>\n<p>Speicherst man mit MFC 7.1 und dem operator&lt;&lt;, dann kannst man die Daten in MFC 7.1 und MFC 8.0 mit dem operator&gt;&gt; lesen, denn der Wert wird wegen des fehlenden Leadin-Bytes als 32bit Wert in der MFC 8.0 erkannt.<br \/>\nSpeicherst man aber mit MFC 8.0 und dem operator&lt;&lt; dann ist das f\u00fcr MFC 8.0 kompatibel. Und kannst es in MFC 8.0 mit dem operator&gt;&gt; lesen. Allerdings speichert &#8211; wie schon gesagt &#8211; MFC 8.0 zuerst ein DWORD (das Leadin f\u00fcr 64bit) und dann den 64bit Wert.<br \/>\nDas versteht nun MFC 7.1 gar nicht, denn das liest immer nur ein DWORD mit dem operator&gt;&gt;.<\/p>\n<p>\u2757 Ein Problem liegt also im Schreiben unter MFC 8.0 mit dem operator&lt;&lt; und im Lesen der Daten mit einem Programm das die MFC 7.1 verwendet und den operator&gt;&gt;!<\/p>\n<p>\u2753 Was kann man machen um\u00a0komplett kompatibel zu sein?<\/p>\n<ul>\n<li>W\u00fcrde in beiden Programmen Serialize64 verwendet gibt es kein Problem!<br \/>\nWichtig Serialize64 verwendet kein Leadin weder unter MFC 7.1 noch unter MFC 8.0!<\/li>\n<li>Kompatibel zu beiden Versionen von MFC 7.1 und MFC 8.0 ist man auch wenn in der MFC 7.1 und in der MFC 8.0 immer nur ein DWORD gespeichert wird (das kann ich aber wirklich nicht mehr empfehelen). Unter MFC 8.0 muss das manuell gemacht werden.<\/li>\n<li>Wenn man also Code-kompatibel\u00a0(nicht bin\u00e4rkomaptibel) f\u00fcr alle MFC Versionen ab 7.0 bleiben will sollte man immer Serialize64 verwenden was einem auch ein kompakteres Format beim Speichern der Daten garantiert.<\/li>\n<\/ul>\n<p><strong>Eigent\u00fcmlich ist, dass dies nicht als Breaking Change dokumentiert ist.<br \/>\n<\/strong>Oder ich habe es (wie so manches) einfach \u00fcberlesen, aber hier steht es nicht:<br \/>\n<a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/9s5zwk1e(VS.80).aspx\">ATL and MFC Changes: ATL 7.1 and MFC 7.1<\/a><br \/>\n<a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/w1sc4t4k(VS.80).aspx\">ATL and MFC Changes: ATL 7.0 and MFC 7.0<\/a><\/p>\n<p>PS: Ich habe CTime Aufgrund der vielen Unzul\u00e4nglichkeiten nie verwendet. Mein Favorit ist seit eh und je COleDateTime bzw. DATE und die dazugeh\u00f6rige COleDateTimeSpan Klasse. Diese ist wirklich einfach in der Kalkulation und war durch das Design nie von einem begrenzten Wertebereich betroffen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der operator&lt;&lt; und operator&gt;&gt; in MFC 7.1 serialisiert grunds\u00e4tzlich nur 32bit Werte des CTime. Das wurde offensichtlich gemacht um r\u00fcckw\u00e4rtskompatibel zu sein zu time_t obwohl mittlerweile ja intern __time64_t verwendet wird. Gleichzeitig wurde Serialize64 eingef\u00fchrt. Man muss also in VS2003 mit MFC 7.1 Serialize64 verwenden um alle 64bit zu speichern, also den komplettem Wertebereich von &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/04\/19\/probleme-bei-der-ctime-serialisierung-mit-mfc-71-und-mfc-80\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eProbleme bei der CTime Serialisierung mit MFC 7.1 und MFC 8.0\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,3],"tags":[352,153,36],"class_list":["post-56","post","type-post","status-publish","format-standard","hentry","category-mfc","category-programmieren","tag-mfc","tag-vs-2003","tag-vs-2005"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}