From: arton Date: 2008-07-02T22:32:22+09:00 Subject: [ruby-dev:35317] Re: [BUG] test_win32ole_event.rb in trunk artonです。 > CygwinとVC2005EE は、trunkの17818にした状態だとBUGが再現できなくて > パッチなしでも運悪く動いてしまいました。 再現させるには、以下のようにするだけで十分です(Cygwinだと違うのかな)。 def test_on_event ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') ev.on_event {|*args| default_handler(*args)} @ie.navigate("file:///#{@f}") while @ie.busy WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') # 作るだけ GC.start # 即回収 sleep 0.1 end assert_match(/BeforeNavigate/, @event) assert_match(/NavigateComplete/, @event) end > ですが、パッチありでも動作することは確認できました。 > (OSは、Windows XPです。) IMessageFilter::MessagePendingがバカなコードになっていますが、最新のMSDN を読んだら、PENDINGMSG_WAITNOPROCESS以外の返送がまずいようなことが書いて あったので、あのようにしています。無駄といえば無駄なので、if (rb_during_gc) {... } は削除しても良いと思います。 ただ、確か以前、外部プロセスサーバーの待ち状態のときにMessageFilterを使 う話題があったと思いますが、この関数はそれ(ってどうしろっていう話でしたっ け?)を実装するためのテンプレートだと思ってください。 > > + hr = CoRegisterMessageFilter(&imessage_filter, &previous_filter); > > これって、後始末で、CoRegisterMessageFilter(NULL, &previous_filter); > を呼ばなくても大丈夫なんでしょうか? > (呼ぶタイミングがあるのかどうか怪しいですが...。) 呼ぶとすれば、OleUninitializeの直前(ole_uninitialize関数の中)ですが、 ・ole_uninitializeが呼ばれないデッドコードになっている(と思う) ・直後にOLEメッセージの受信をできなくするのだから、呼ぶ意味がない というわけで、呼びません。が、コードの対称性からはole_uninitizlieの中で 呼ぶのはありなので、助田さんの好みで変えてください。 解除はある特定の処理(たとえばモーダルダイアログでクリティカルなUIメッセー ジ処理をしたいとか、あるいはサーバーからの応答が来るまでUIメッセージを無 視したいとか)の範囲に限定してフィルタをかける場合に利用するという認識で すが、たぶん、はずしていないと思います。 > win32ole.cのパッチはありがたく取り込ませていただくつもりですが、 > まずは、その前に gc.cのパッチを取り込んでもらうようにします。 よろしくお願いします。 多分、これは他の拡張ライブラリでも必要なことがあるのではないかと思います。 -------------------------------------- Stop! Global Warming ~ Yahoo! JAPAN Earth Project http://pr.mail.yahoo.co.jp/earthproject/