summaryrefslogtreecommitdiff
path: root/ext/win32ole/win32ole.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-26 02:35:30 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-26 02:35:30 +0000
commit6e0b3ca606ce09558ff6f5e6549230b254665da0 (patch)
treeeb5f4793c093877cb3109aeca073305a997558d5 /ext/win32ole/win32ole.c
parentc88e3627cfdf1ab2c7f1a558f3010f60bf7120ba (diff)
* ext/extmk.rb: Makefiles should depend on also rbconfig.rb.
(ruby-bugs:PR#1256) * ext/win32ole/win32ole.c (set_argv): set real arguments to WIN32OLE::ARGV. [ruby-list:39073] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5553 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/win32ole/win32ole.c')
-rw-r--r--ext/win32ole/win32ole.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c
index 3b143ebd07..e96c37a559 100644
--- a/ext/win32ole/win32ole.c
+++ b/ext/win32ole/win32ole.c
@@ -1686,6 +1686,22 @@ 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;
VALUE *argv;
@@ -1707,7 +1723,6 @@ ole_invoke(argc, argv, self, wFlags)
DISPID* pDispID;
EXCEPINFO excepinfo;
VARIANT result;
- VALUE args;
VARIANTARG* realargs = NULL;
unsigned int argErr = 0;
unsigned int i;
@@ -1847,13 +1862,7 @@ 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 {
for(i = 0; i < op.dp.cArgs; i++) {
@@ -2066,12 +2075,7 @@ ole_invoke2(self, dispid, args, types, dispkind)
/* 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);
}
obj = ole_variant2val(&result);