{"id":414,"date":"2009-03-05T20:14:45","date_gmt":"2009-03-05T19:14:45","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=414"},"modified":"2009-03-05T17:36:36","modified_gmt":"2009-03-05T16:36:36","slug":"selbst-reingelegt-beim-test-von-xp-oder-spaeter","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/03\/05\/selbst-reingelegt-beim-test-von-xp-oder-spaeter\/","title":{"rendered":"Selbst reingelegt beim Test von &#8222;XP oder sp\u00e4ter&#8220;"},"content":{"rendered":"<p>Manche Codezeilen schreibt man ja einfach im Schlaf so in etwa wie diesen hier<\/p>\n<pre lang=\"cpp\" line=\"1\">static const OSVERSIONINFO &amp;GetOSVersionInfo()\r\n{\r\n\u00a0static OSVERSIONINFO osVersionInfo;\r\n\u00a0if (osVersionInfo.dwOSVersionInfoSize==0)\r\n\u00a0{\r\n\u00a0\u00a0osVersionInfo.dwOSVersionInfoSize = sizeof(osVersionInfo);\r\n\u00a0\u00a0::GetVersionEx(&amp;osVersionInfo);\r\n\u00a0}\r\n\u00a0\/\/ return pointer to struct\r\n\u00a0return osVersionInfo;\r\n}\r\n\r\nbool OSIsWinXP()\r\n{\r\n \/\/ Check if OS is XP or later\r\n\u00a0const OSVERSIONINFO &amp;osvi= GetOSVersionInfo();\r\n\u00a0return (osvi.dwPlatformId &amp; VER_PLATFORM_WIN32_NT)!=0 &amp;&amp;\r\n\u00a0\u00a0\u00a0\u00a0 osvi.dwMajorVersion&gt;=5 &amp;&amp;\r\n\u00a0\u00a0\u00a0\u00a0 osvi.dwMinorVersion&gt;=1;\r\n}<\/pre>\n<p>Der Sinn und Zweck ist eindeutig. Ich ben\u00f6tige diese Funktion um zu Testen ob <em>Windows XP<\/em> oder ein sp\u00e4teres OS wie <em>Vista <\/em>oder <em>Windows 7 <\/em>installiert ist. Dumm nur das dieser Code d\u00e4mlich falsch ist.<br \/>\nDie Betriebssysteme haben die folgenden internen Versionsnummern<br \/>\n5.0 &#8211; Windows 2000<br \/>\n5.1 &#8211; Windows XP<br \/>\n5.2 &#8211; Windows Server 2003<br \/>\n6.0 &#8211; Windows Vista<br \/>\n6.1 &#8211; Windows 7 (Anmerkung: idotisch, dass hier nicht 7.0 verwendet wird)<\/p>\n<p>Als ich den Code schrieb war <em>Windows XP <\/em>gerade drau\u00dfen und selbst <em>Windows\u00a0Server 2003 <\/em>gerade am Horizont. D\u00e4mlicherweise schrieb ich in dem Test <em>osvi.dwMajorVersion&gt;=5\u00a0<strong>&amp;&amp;<\/strong> osvi.dwMinorVersion&gt;=1.<\/em><br \/>\nohne nat\u00fcrlich daran zu denken, dass ein sp\u00e4teres OS wieder mit einer 0 als minor Version kommen k\u00f6nnte.<br \/>\nDadurch ergibt sich nat\u00fcrlich das der Test f\u00fcr alle Betriebssysteme nach <em>Windows XP <\/em>funktioniert nur nicht f\u00fcr <em>Windows Vista\u00a0 <\/em>weil eben die Minor Version hier 0 ist. Ich war drauf und dran mal wieder einen Bug einzureichen bis mir schlagartig klar war, dass nicht <em>Vista <\/em>einen Fehler hat sondern mein eigener Code.<\/p>\n<p>Der korrekte Test muss nat\u00fcrlich so lauten:<\/p>\n<pre lang=\"cpp\" line=\"13\">bool OSIsWinXP()\r\n{\r\n \/\/ Check if OS is XP or later\r\n\u00a0const OSVERSIONINFO &amp;osvi= GetOSVersionInfo();\r\n\u00a0return (osvi.dwPlatformId &amp; VER_PLATFORM_WIN32_NT)!=0 &amp;&amp;\r\n\u00a0\u00a0\u00a0(osvi.dwMajorVersion&gt;5 ||\u00a0\u00a0\u00a0\u00a0\/\/ May be vista or later\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (osvi.dwMajorVersion==5 &amp;&amp;\u00a0\u00a0\u00a0\u00a0\/\/ that's XP\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 osvi.dwMinorVersion&gt;=1));\r\n}<\/pre>\n<p>Code wie im Schlaf zu schreiben bringt es manchmal eben nicht. \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manche Codezeilen schreibt man ja einfach im Schlaf so in etwa wie diesen hier static const OSVERSIONINFO &amp;GetOSVersionInfo() { \u00a0static OSVERSIONINFO osVersionInfo; \u00a0if (osVersionInfo.dwOSVersionInfoSize==0) \u00a0{ \u00a0\u00a0osVersionInfo.dwOSVersionInfoSize = sizeof(osVersionInfo); \u00a0\u00a0::GetVersionEx(&amp;osVersionInfo); \u00a0} \u00a0\/\/ return pointer to struct \u00a0return osVersionInfo; } bool OSIsWinXP() { \/\/ Check if OS is XP or later \u00a0const OSVERSIONINFO &amp;osvi= GetOSVersionInfo(); \u00a0return (osvi.dwPlatformId &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/03\/05\/selbst-reingelegt-beim-test-von-xp-oder-spaeter\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSelbst reingelegt beim Test von &#8222;XP oder sp\u00e4ter&#8220;\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":[30,11,3,2],"tags":[99,370,136,358,61],"class_list":["post-414","post","type-post","status-publish","format-standard","hentry","category-c","category-debugging","category-programmieren","category-windows-api","tag-bug","tag-c","tag-qualitaetssicherung","tag-vista","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/414","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=414"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/414\/revisions"}],"predecessor-version":[{"id":433,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/414\/revisions\/433"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=414"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}