{"id":445,"date":"2009-04-30T20:50:14","date_gmt":"2009-04-30T18:50:14","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=445"},"modified":"2009-04-26T13:50:50","modified_gmt":"2009-04-26T11:50:50","slug":"afxoleinit-versus-coinitializeex-in-mfc-programmen","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/04\/30\/afxoleinit-versus-coinitializeex-in-mfc-programmen\/","title":{"rendered":"AfxOleInit versus CoInitializeEx in MFC Programmen"},"content":{"rendered":"<p>Immer wieder mal, taucht <em>MFC <\/em>Code auf und es wird <em>CoInitializeEx <\/em>verwendet.<br \/>\nNicht unbedingt ein Fehler, aber ich denke man sollte auch hier die MFC-Art-und-Weise verwenden: <em>AfxOleInit<\/em>. Und man sollte sich klar sein, welche Apartment Modes man verwenden darf!<\/p>\n<p><em>AfxOleInit selbst <\/em>ist ein per Thread Wrapper f\u00fcr <em><a href=\"http:\/\/msdn.microsoft.com\/de-de\/library\/e91aseaz(VS.80).aspx\">::OleInitialize(NULL);<\/a><\/em>.<br \/>\nZudem sorgt <em>AfxOleInit <\/em>daf\u00fcr, dass bei Beenden des Threads automatisch <em>AfxOleTerm <\/em>aufgerufen wird.<\/p>\n<p><em>::OleInitialize(NULL)<\/em> wiederum ist ein Wrapper f\u00fcr den Aufruf von <em>CoInitializeEx<\/em> im STA Kontext:<br \/>\nSiehe MSDN <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms690134(VS.85).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/ms690134(VS.85).aspx<\/a>\u00a0<\/p>\n<blockquote><p>OleInitialize calls CoInitializeEx internally to initialize the COM library on the current apartment. Because OLE operations are not thread-safe, OleInitialize specifies the concurrency model as single-thread apartment.<\/p><\/blockquote>\n<p>Die <em>MFC <\/em>benutzt und verlangt genau diesen <em>STA <\/em>Modus. Sofern man also nicht wirklich wei\u00df was man mit <em>CoInitializeEx <\/em>macht, sollte man es in der <em>MFC <\/em>vermeiden. Zudem man sich eben auch nicht mehr um den Cleanup k\u00fcmmern muss, da die MFC dies selber macht.<\/p>\n<p>Siehe auch MSDN Doku zu <em>AfxOleInit<\/em><br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/de-de\/library\/e91aseaz(VS.80).aspx\">http:\/\/msdn.microsoft.com\/de-de\/library\/e91aseaz(VS.80).aspx<\/a><\/p>\n<blockquote><p>MFC applications must be initialized as single threaded apartment (STA). If you call CoInitializeEx in your InitInstance override, specify COINIT_APARTMENTTHREADED (rather than COINIT_MULTITHREADED). For more information, see PRB: MFC Application Stops Responding When You Initialize the Application as a Multithreaded Apartment (828643) at <a href=\"http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;828643\">http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;828643<\/a>.<\/p><\/blockquote>\n<p>Aber auch hier sei erw\u00e4hnt, dass man sicherlich auch andere Apartment Modes verwenden kann. Allerdings muss man dann wirklich wissen was man macht und darf sich nicht auf die <em>MFC<\/em> Funktionen st\u00fctzen. F\u00fcr solche F\u00e4lle verwende ich hier komplett ATL in meinen <em>MFC<\/em> Programmen.<br \/>\nMan sollte aber in diesen F\u00e4llen wirklich wissen was man macht \ud83d\ude09<\/p>\n<p>BTW: Automatisch aufger\u00e4umt bei einem gestarteten Thread wird nur dann, wenn auch AfxBeginThread verwendet wird. Siehe auch: <a class=\"l\" onmousedown=\"return clk(this.href,'','','res','1','&amp;sig2=AjTmup5MlQdIipqqmGcT-Q')\" href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/28\/afxbeginthread-versus-_beginthreadex\/\" target=\"_blank\">AfxBeginThread versus _beginthreadex<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Immer wieder mal, taucht MFC Code auf und es wird CoInitializeEx verwendet. Nicht unbedingt ein Fehler, aber ich denke man sollte auch hier die MFC-Art-und-Weise verwenden: AfxOleInit. Und man sollte sich klar sein, welche Apartment Modes man verwenden darf! AfxOleInit selbst ist ein per Thread Wrapper f\u00fcr ::OleInitialize(NULL);. Zudem sorgt AfxOleInit daf\u00fcr, dass bei Beenden &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/04\/30\/afxoleinit-versus-coinitializeex-in-mfc-programmen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eAfxOleInit versus CoInitializeEx in MFC Programmen\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":[25,4,3],"tags":[366,92,352],"class_list":["post-445","post","type-post","status-publish","format-standard","hentry","category-atl","category-mfc","category-programmieren","tag-atl","tag-com","tag-mfc"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/445","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=445"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/445\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=445"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}