Masaki Suketa schrieb: >I am not sure, but it seems to me because of GC behavior. >I tested your script using Foo class instead of WIN32OLE. >And I've got same result as WIN32OLE. > > I cannot confirm that. The last two outputs give the empty list on my system. Independent of the Ruby version (1.8.6 or 1.8.5). >--- code starts --- >class Foo > def initialize(arg) > @arg = arg > end > def Quit > end >end > >def puts_win32ole_objects > res = [] > ObjectSpace.each_object do |o| > res << o if o.is_a? Foo > end > puts res.inspect >end > >puts_win32ole_objects # --> empty >xl = Foo.new('Excel.Application') >puts_win32ole_objects # --> one object >xl.Quit >xl = nil >GC.start # anything else I could do??? >puts_win32ole_objects # --> the object is still there >sleep 5 >puts_win32ole_objects # --> the object is still there >--- code end --- > > >The Excel process is terminated when the WIN32OLE object is GCed. >But in this case, the WIN32OLE object is not GCed, so the Excel >process is not terminated. > > I see: it is all a matter of garbage collection. >But if you want to terminate the process before the WIN32OLE object GCed, >you can use WIN32OLE#ole_free. > > Thanks for telling me -- this worked indeed, contrary to WIN32OLE.ole_free. It would be a dirty solution. However, The point you made about GC, has inspired me towards further experiments. First, I created a second WIN32OLE.new('Excel Application'), just to see if the first object might get 'recycled'. What I found was, that two objects existed after the second object creation, but after the three terminating statements (quit -- nil -- GC), only the second object remained. (Lazy recycling, ... :-) ) Encouraged by this surprising result, I tried other things, and then this: xl = Foo.new('Excel.Application') puts_win32ole_objects xl = nil GC.start Just not calling xl.Quit anymore, and -- the object is gone! Simplest of all! This looks like an easy solution, but no no, too early to jump for joy: I encountered this behaviour for _any_ method I called on the xl object. OK, so, the easy destruction only works for "virgin" objects. Thus, so far, we have not yet found a gentle way to finish a WIN32OLE/Excel object. For the time being, I think I'll resort to (not-so-gentle) WIN32OLE#ole_free. Regards, Sven