From: arton Date: 2008-07-01T23:25:30+09:00 Subject: [ruby-dev:35297] Re: [BUG] test_win32ole_event.rb in trunk artonです こちらのメールには気付きませんでした。 > > スタックトレースの上のほうはどうなっていますか? > > *1 msvcr80-ruby190.dll!rb_newobj() > 2 msvcr80-ruby190.dll!str_alloc(unsigned long klass=12338520) > 3 msvcr80-ruby190.dll!str_new(unsigned long klass=12338520, > const char * ptr=0x00000000, long len=0) > 4 msvcr80-ruby190.dll!rb_enc_str_new(const char * ptr=0x012fc7d0, > long len=16, OnigEncodingTypeST * enc=0x00c330f0) > 5 win32ole.so!ole_wc2vstr(unsigned short * pw=0x00000000, int > isfree=1) > 6 win32ole.so!EVENTSINK_Invoke(IEventSink * > pEventSink=0x013bb4d0, long dispid=104, const _GUID * const _DWebBrowserEventsのDownloadCompleteイベントですね。なんで今頃…… > riid=0x002677a4, unsigned long lcid=0, unsigned short wFlags=1, > tagDISPPARAMS * pdispparams=0x00269d68, > tagVARIANT * pvarResult=Empty, > tagEXCEPINFO * pexcepinfo=0x00000000, unsigned int * > puArgErr=0x00000000) > 7 oleaut32.dll!7714c351() > 8 [下のフレームは間違っているか、または見つかりません。 > oleaut32.dll に対して読み込まれたシンボルはありません。] > 9 oleaut32.dll!770ddb25() > 10 rpcrt4.dll!77eb658c() markなのが不思議。 finalizeを呼ぶのって、gc_sweepじゃないの? ただ、oleaut32とかrpcrt4あたりがスタックフレームをいじるなどの理由から、 ここから(または8あたりから)下がゴミを拾っている可能性はあると思います。 > 11 msvcr80-ruby190.dll!rb_gc_mark(unsigned long ptr=269465784) > 12 msvcr80-ruby190.dll!gc_mark_children(rb_objspace * > objspace=0x00000000, unsigned long ptr=0, int lev=2287464) > コンセプトコードですが、こんな感じでしょうか? fole_free(VALUE self) { struct oledata *pole; rb_secure(4); OLEData_Get_Struct(self, pole); pole->freeing = TRUE; // 新設 OLE_FREE(pole->pDispatch); pole->pDispatch = NULL; return Qnil; } STDMETHODIMP EVENTSINK_Invoke( PEVENTSINK pEventSink, -- snip --- UINT *puArgErr ) { -- snip --- PIEVENTSINKOBJ pEV = (PIEVENTSINKOBJ)pEventSink; pTypeInfo = pEV->pTypeInfo; obj = evs_entry(pEV->m_event_id); if (obj->freeing) { --- 解放中なら無視 return NOERROR; } if (!rb_obj_is_kind_of(obj, cWIN32OLE_EVENT)) { return NOERROR; } -------------------------------------- Stop! Global Warming ~ Yahoo! JAPAN Earth Project http://pr.mail.yahoo.co.jp/earthproject/