artonです。

> > [2 patch.txt <application/octet-stream (base64)>]
> > +     VALUE* parg = ALLOC_N(VALUE, args);
> > +     for (i = 0; i < args; i++) {
> > + 	*(parg + i) = ole_variant2val(&pDispParams->rgvarg[args - i - 1]);
> > +     }
> 
> pargはALLOCA_N()を使えば解放する必要がなくなると思います。
というか、解放を忘れてました。
> 
> +     pdisp = ALLOC(Win32OLEIDispatch);
> +     pdisp->dispatch.lpVtbl = p;
> +     pdisp->refcount = 1;
> +     pdisp->obj = val;
> 
> このobjはmark不要?
このあたりが今ひとつわからないのですが
> +     pdisp->refcount = 1;
        rb_gc_register_address(val);
> +     pdisp->obj = val;
としておいて、COMのリファレンスカウンタが0になった時の自己解放処理での
+     if (u == 0) {
+ 	free(p->dispatch.lpVtbl);
+ 	free(p);
+     }
を
+     if (u == 0) {
+ 	free(p->dispatch.lpVtbl);
        rb_gc_unregister_address(val);
+ 	free(p);
+     }
とすれば良い?

-- 
arton <artonx / yahoo.co.jp>

__________________________________________________
Do You Yahoo!?
http://bb.yahoo.co.jp/