artonです。

> > よくわかってないんですが、EVENTSINK_Invoke()などは非同期にWindows
> > から呼び出されているんでしょうか?
> 
> EVENTSINK_Invokeは、COMサーバー側で何らかのイベントが
> 発生したときにCOMサーバー側から呼ばれます。
> なので、非同期に呼び出されています。
> WIN32OLE_EVENTの中核になります。
これは、違います(非同期の意味にもよりますが)。
Win32OLEの場合、STAで動作しているので、サーバーからの呼び出しにはメッセー
ジポンプからのメッセージくみ上げが必要となります。GCのSweepフェーズでメッ
セージポンプの組み上げが行われる可能性は、Win32OLEの介入(SWinなどを使っ
ていれば別問題)しかありません。
> 上のWC2VSTRだけなら何とかなるでしょうけど、rubyオブジェクト操作
> 一切禁止で実装する方法は、今のところ思いつかないです。
> GC中だったらGCが終わるまで待つための仕組みって提供されて
> いるんでしょうか?
> よくわかってないのですが、RUBY_CRITICALとかは使えるんでしょうか?
使えません。というのは、同一スレッドだからです。

> 
> > それとも、単にfree処理の結果としてEVENTSINK_Invoke()がコール
> > バックされるだけなんでしょうか?
> 
> こっちの可能性は低い気がします。
上から、これが原因でしょう。
Win32OLEが、freeの結果、server->Release()を呼び出します。
これがアウトプロセスサーバであれば、LRPCとなり、応答を待つためにメッセー
ジポンプの汲みだしが開始されます。
Releaseの結果、他にテンポラリに作成したオブジェクトのReleaseがコールバッ
クされます(たとえば、EventSinkですが、それ以外にもあり得るはずです。特
にIEであればDOM関係の細かなオブジェクトが生成されていると思います)。

ぱっと思いつく解決案は、Win32OLEの中に廃棄インタフェイスのキューを持ち、
ole_freeの呼び出しではそのキューにRelease待ちのインタフェイスを付けるだ
けにしておき、他のタイミング(これがとれるかどうかは良くわからないですが、
次のWin32OLEに対する呼び出しとか?)でReleaseをかけるとかではないでしょ
うか。


--------------------------------------
Stop! Global Warming ~ Yahoo! JAPAN Earth Project
http://pr.mail.yahoo.co.jp/earthproject/