Returns Ruby object wrapping OLE
variant. The first argument specifies Ruby object to convert OLE variant
variable. The second argument specifies VARIANT type. In some situation,
you need the WIN32OLE_VARIANT object
to pass OLE method
shell=WIN32OLE.new("Shell.Application")folder=shell.NameSpace("C:\\Windows")item=folder.ParseName("tmp.txt")# You can't use Ruby String object to call FolderItem.InvokeVerb.# Instead, you have to use WIN32OLE_VARIANT object to call the method.shortcut=WIN32OLE_VARIANT.new("Create Shortcut(\&S)")item.invokeVerb(shortcut)
static VALUE
folevariant_initialize(VALUE self, VALUE args)
{
int len = 0;
VARIANT var;
VALUE val;
VALUE vvt;
VARTYPE vt;
struct olevariantdata *pvar;
len = RARRAY_LEN(args);
if (len < 1 || len > 3) {
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", len);
}
VariantInit(&var);
val = rb_ary_entry(args, 0);
if(!rb_obj_is_kind_of(val, cWIN32OLE) &&
!rb_obj_is_kind_of(val, cWIN32OLE_VARIANT) &&
!rb_obj_is_kind_of(val, rb_cTime)) {
switch (TYPE(val)) {
case T_ARRAY:
case T_STRING:
case T_FIXNUM:
case T_BIGNUM:
case T_FLOAT:
case T_TRUE:
case T_FALSE:
case T_NIL:
break;
default:
rb_raise(rb_eTypeError, "can not convert WIN32OLE_VARIANT from type %s",
rb_obj_classname(val));
}
}
Data_Get_Struct(self, struct olevariantdata, pvar);
if (len == 1) {
ole_val2variant(val, &(pvar->var));
} else {
vvt = rb_ary_entry(args, 1);
vt = NUM2INT(vvt);
ole_val2olevariantdata(val, vt, pvar);
}
vt = V_VT(&pvar->var);
return self;
}