From: nobu.nakada@... Date: 2004-01-26T09:05:07+09:00 Subject: [ruby-list:39080] Re: Ruby1.8のWIN32OLEで-wのとき なかだです。 At Mon, 26 Jan 2004 01:58:08 +0900, Takashi Kanai wrote: > 残る問題は、何でワーニングが出るか、です。 WIN32OLE::ARGVをクラス変数としてアクセスしているのが、そもそも の間違いです。現在の実装では定数とクラス変数とクラスのインスタ ンス変数の三つは同じところにあるので、たまたま見えているだけで す。 Index: ext/win32ole/win32ole.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/win32ole/win32ole.c,v retrieving revision 1.16 diff -u -2 -p -d -r1.16 win32ole.c --- ext/win32ole/win32ole.c 24 Sep 2003 22:55:33 -0000 1.16 +++ ext/win32ole/win32ole.c 26 Jan 2004 00:01:16 -0000 @@ -1687,4 +1687,20 @@ hash2named_arg(pair, pOp) static VALUE +set_argv(realargs, beg, end) + VARIANTARG* realargs; + unsigned int beg, end; +{ + VALUE argv = rb_const_get(cWIN32OLE, rb_intern("ARGV")); + + Check_Type(argv, T_ARRAY); + rb_ary_clear(argv); + while (--end >= beg) { + rb_ary_push(argv, ole_variant2val(&realargs[end])); + VariantClear(&realargs[end]); + } + return argv; +} + +static VALUE ole_invoke(argc, argv, self, wFlags) int argc; @@ -1708,5 +1724,4 @@ ole_invoke(argc, argv, self, wFlags) EXCEPINFO excepinfo; VARIANT result; - VALUE args; VARIANTARG* realargs = NULL; unsigned int argErr = 0; @@ -1848,11 +1863,5 @@ ole_invoke(argc, argv, self, wFlags) /* clear dispatch parameter */ if(op.dp.cArgs > cNamedArgs) { - args = rb_cvar_get(cWIN32OLE, rb_intern("ARGV")); - rb_funcall(args, rb_intern("clear"), 0); - for(i = cNamedArgs; i < op.dp.cArgs; i++) { - n = op.dp.cArgs - i + cNamedArgs - 1; - rb_ary_push(args, ole_variant2val(&realargs[n])); - VariantClear(&realargs[n]); - } + set_argv(realargs, cNamedArgs, op.dp.cArgs); } else { @@ -2067,10 +2076,5 @@ ole_invoke2(self, dispid, args, types, d /* clear dispatch parameter */ if(dispParams.cArgs > 0) { - VALUE argv = rb_cvar_get(cWIN32OLE, rb_intern("ARGV")); - rb_funcall(argv, rb_intern("clear"), 0); - for(i = dispParams.cArgs - 1; i >= 0; i--) { - rb_ary_push(argv, ole_variant2val(&realargs[i])); - VariantClear(&realargs[i]); - } + set_argv(realargs, 0, dispParams.cArgs); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦