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/