{"id":897,"date":"2012-04-02T21:46:44","date_gmt":"2012-04-02T19:46:44","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=897"},"modified":"2012-04-02T21:46:44","modified_gmt":"2012-04-02T19:46:44","slug":"registeractiveobject-und-colockobjectexternal","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2012\/04\/02\/registeractiveobject-und-colockobjectexternal\/","title":{"rendered":"RegisterActiveObject und CoLockObjectExternal"},"content":{"rendered":"<p>Wenn man ein COM Objekt erzeugt und dieses im System \u00fcber die ROT (Running Object Table) sichtbar, dann sollte man normalerweise Weak-Locks benutzen. Das kann man auch in der Doku zu <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms221551(v=vs.85).aspx\">RegisterActiveObject\u00a0 <\/a>nachlesen. Ansonsten wird es schwierig zu entscheinden, wann man seine Objekte zerst\u00f6ren kann.<\/p>\n<p>Wenn aber nun eine Anwendung sichtbar gemacht wird, also das Objekt vom Benutzer \u00fcbernommen wird, dann darf es ja nicht beendet werden, wenn der externe Erzeugende Prozess beendet wird und die letzte Referenz zu dem Objekt beendet wird.<\/p>\n<p>Wie verhindert man das?<\/p>\n<p>Die L\u00f6sung ist relativ simpel. Solange die Anwendung sichtbar ist, oder besser, wenn sie sichtbar wird ruft man einmalig <em><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms680592(v=vs.85).aspx\">CoLockObjectExternal<\/a><\/em> auf! Dadurch wird ein weitere Lock auf das Objekt ausgef\u00fchrt.<br \/>\n<strong>Aber Achtung<\/strong> \u2757 Hier wird keine Referenzz\u00e4hlung verwendet. Egal wie oft man <em>CoLockObjectExternal<\/em> aufruft, der Referenzz\u00e4hler wird nur einmal erh\u00f6ht.<\/p>\n<p>Beendet der User das Programm entsperrt man das Objekt wieder. Sollten keine weiteren Objekte in der Anwendung benutzt werden, dann terminiert die Anwendung wenn man alles richtig gemacht hat \ud83d\ude09<br \/>\nMan ruft <em>CoLockObjectExternal<\/em> am Besten entweder auf, wenn die Anwendung sichtbar wird (<em>WM_SHOWWINDOW<\/em>) und erneut wenn <em>WM_CLOSE<\/em> aufgerufen wird. Die MFC macht alles fast automatisch richtig, bis eben auf die Aufrufe von <em>CoLockObjectExternal<\/em>, die man selbst im Code unterbringen muss, wie auch die Registrierung der Objekte in der ROT.<br \/>\nIst noch eine externe Referenz vorhanden wird die Anwendung nicht terminiert, weil der interne Objektz\u00e4hler der MFC dies verhindert (Code in CFrameWnd::OnClose). Ist kein externer Lock mehr vorhanden sperrt <em>CoLockObjectExternal<\/em>\u00a0die Anwendung vom terminieren weil damit exakt eine Referenz aufrecht erhalten wird. Wird durch den Benutzer das Schlie\u00dfen der Anwednung angefordert wird dann im WM_CLOSE diese letzte Refrenz aufgel\u00f6st und die Anwednung kann terminieren auch wnen noch ein Eintrag in der ROT vorhanden ist. Dieser wird dann beim Beenden der Applikation auch entfernt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man ein COM Objekt erzeugt und dieses im System \u00fcber die ROT (Running Object Table) sichtbar, dann sollte man normalerweise Weak-Locks benutzen. Das kann man auch in der Doku zu RegisterActiveObject\u00a0 nachlesen. Ansonsten wird es schwierig zu entscheinden, wann man seine Objekte zerst\u00f6ren kann. Wenn aber nun eine Anwendung sichtbar gemacht wird, also das &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2012\/04\/02\/registeractiveobject-und-colockobjectexternal\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eRegisterActiveObject und CoLockObjectExternal\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,4,3,2],"tags":[370,92,352,324,61],"class_list":["post-897","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-windows-api","tag-c","tag-com","tag-mfc","tag-ole","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\/897","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=897"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/897\/revisions"}],"predecessor-version":[{"id":962,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/897\/revisions\/962"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=897"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}