37 VariantClear(&(pvar->
var));
56 SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, len);
60 hr = SafeArrayAccessData(psa, &pdest);
63 SafeArrayUnaccessData(psa);
64 V_VT(&(pvar->realvar)) = (vt & ~VT_BYREF);
65 p = V_ARRAY(&(pvar->realvar));
69 V_ARRAY(&(pvar->realvar)) = psa;
71 V_VT(&(pvar->var)) = vt;
72 V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
74 hr = VariantCopy(&(pvar->var), &(pvar->realvar));
78 SafeArrayDestroy(psa);
80 }
else if (vt & VT_ARRAY) {
82 V_VT(&(pvar->var)) = vt;
84 V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
90 V_VT(&(pvar->var)) = vt;
91 V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
93 hr = VariantCopy(&(pvar->var), &(pvar->realvar));
97 #if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__) 98 }
else if ( (vt & ~VT_BYREF) == VT_I8 || (vt & ~VT_BYREF) == VT_UI8) {
101 V_VT(&(pvar->var)) = vt;
106 }
else if ( (vt & ~VT_BYREF) == VT_ERROR) {
111 hr = VariantCopy(&(pvar->var), &(pvar->realvar));
115 V_VT(&(pvar->var)) = vt;
116 if (vt == (VT_BYREF | VT_VARIANT)) {
119 V_VT(&(pvar->realvar)) = vt & ~VT_BYREF;
126 if (vt == (VT_BYREF | VT_VARIANT)) {
128 }
else if (vt & VT_BYREF) {
129 if ( (vt & ~VT_BYREF) != V_VT(&(pvar->realvar))) {
130 hr = VariantChangeTypeEx(&(pvar->realvar), &(pvar->realvar),
137 if (vt == V_VT(&(pvar->realvar))) {
138 hr = VariantCopy(&(pvar->var), &(pvar->realvar));
140 hr = VariantChangeTypeEx(&(pvar->var), &(pvar->realvar),
161 V_VT(var) = VT_ERROR;
173 if (vt == (VT_VARIANT|VT_BYREF)) {
176 if (V_VT(realvar) != (vt & ~VT_BYREF)) {
179 switch(vt & ~VT_BYREF) {
184 V_UI1REF(var) = &V_UI1(realvar);
187 V_I2REF(var) = &V_I2(realvar);
193 V_I4REF(var) = &V_I4(realvar);
196 V_UI4REF(var) = &V_UI4(realvar);
199 V_R4REF(var) = &V_R4(realvar);
202 V_R8REF(var) = &V_R8(realvar);
205 #if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__) 208 V_I8REF(var) = &V_I8(realvar);
213 V_UI8REF(var) = &V_UI8(realvar);
226 V_CYREF(var) = &V_CY(realvar);
229 V_DATEREF(var) = &V_DATE(realvar);
232 V_BSTRREF(var) = &V_BSTR(realvar);
235 V_DISPATCHREF(var) = &V_DISPATCH(realvar);
238 V_ERRORREF(var) = &V_ERROR(realvar);
241 V_BOOLREF(var) = &V_BOOL(realvar);
244 V_UNKNOWNREF(var) = &V_UNKNOWN(realvar);
247 V_ARRAYREF(var) = &V_ARRAY(realvar);
263 VariantInit(&(pvar->
var));
290 SAFEARRAYBOUND *psab =
NULL;
291 SAFEARRAY *psa =
NULL;
298 vt = (vt | VT_ARRAY);
305 psab =
ALLOC_N(SAFEARRAYBOUND, dim);
311 for (i = 0; i < dim; i++) {
316 psa = SafeArrayCreate((VARTYPE)(vt & VT_TYPEMASK), dim, psab);
318 if (psab)
free(psab);
322 V_VT(&(pvar->
var)) = vt;
324 V_VT(&(pvar->
realvar)) = (vt & ~VT_BYREF);
325 V_ARRAY(&(pvar->
realvar)) = psa;
326 V_ARRAYREF(&(pvar->
var)) = &(V_ARRAY(&(pvar->
realvar)));
328 V_ARRAY(&(pvar->
var)) = psa;
330 if (psab)
free(psab);
346 for(i = 0; i <
len; i++) {
424 if ((vt & VT_TYPEMASK) == VT_RECORD) {
436 SAFEARRAY *psa =
NULL;
439 if (!(V_VT(&(pvar->
var)) & VT_ARRAY)) {
442 psa = V_ISBYREF(&(pvar->
var)) ? *V_ARRAYREF(&(pvar->
var)) : V_ARRAY(&(pvar->
var));
446 hr = SafeArrayLock(psa);
459 dim = SafeArrayGetDim(psa);
460 if (dim != ary_size) {
467 for (i = 0; i < dim; i++) {
477 hr = SafeArrayUnlock(psa);
514 if (!V_ISARRAY(&(pvar->
var))) {
516 "`[]' is not available for this variant type object");
525 VariantInit(&variant);
526 V_VT(&variant) = (V_VT(&(pvar->
var)) & ~VT_ARRAY) | VT_BYREF;
527 hr = SafeArrayPtrOfIndex(psa, pid, &V_BYREF(&variant));
571 if (!V_ISARRAY(&(pvar->
var))) {
573 "`[]' is not available for this variant type object");
583 vt = (V_VT(&(pvar->
var)) & ~VT_ARRAY);
585 if ((V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) ==
NULL) ||
586 (V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) ==
NULL)) {
589 hr = SafeArrayPutElement(psa, pid, p);
619 vt = V_VT(&(pvar->
var));
621 if ((vt & ~VT_BYREF) == (VT_UI1|VT_ARRAY)) {
623 psa = *V_ARRAYREF(&(pvar->
var));
625 psa = V_ARRAY(&(pvar->
var));
630 dim = SafeArrayGetDim(psa);
675 vt = V_VT(&(pvar->
var));
676 if (V_ISARRAY(&(pvar->
var)) && ((vt & ~VT_BYREF) != (VT_UI1|VT_ARRAY) || !
RB_TYPE_P(val,
T_STRING))) {
678 "`value=' is not available for this variant type object");
689 VariantCopy(var, &(pvar->
var));
VALUE eWIN32OLERuntimeError
VALUE rb_ary_entry(VALUE ary, long offset)
#define RUBY_TYPED_FREE_IMMEDIATELY
VOID * val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
static VALUE folevariant_value(VALUE self)
static void ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar)
void ole_variant2variant(VALUE val, VARIANT *var)
#define TypedData_Get_Struct(obj, type, data_type, sval)
static VALUE folevariant_vartype(VALUE self)
static const rb_data_type_t olevariant_datatype
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
void rb_raise(VALUE exc, const char *fmt,...)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
VALUE rb_obj_is_kind_of(VALUE, VALUE)
void ole_initialize(void)
static void check_type_val2variant(VALUE val)
static SAFEARRAY * get_locked_safe_array(VALUE val)
void Init_win32ole_variant(void)
static VALUE folevariant_s_allocate(VALUE klass)
const char * rb_obj_classname(VALUE)
#define RB_TYPE_P(obj, type)
static VALUE folevariant_set_value(VALUE self, VALUE val)
void ole_raise(HRESULT hr, VALUE ecs, const char *fmt,...)
static void ole_val2variant_err(VALUE val, VARIANT *var)
RUBY_EXTERN VALUE rb_cObject
static size_t olevariant_size(const void *ptr)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
void rb_define_const(VALUE, const char *, VALUE)
static VALUE folevariant_ary_aset(int argc, VALUE *argv, VALUE self)
static VALUE folevariant_s_array(VALUE klass, VALUE dims, VALUE vvt)
void ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt)
VALUE ole_variant2val(VARIANT *pvar)
static void ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt)
static VALUE folevariant_initialize(VALUE self, VALUE args)
static LONG * ary2safe_array_index(int ary_size, VALUE *ary, SAFEARRAY *psa)
register unsigned int len
typedef HRESULT(STDAPICALLTYPE FNCOCREATEINSTANCEEX)(REFCLSID
static VALUE folevariant_ary_aref(int argc, VALUE *argv, VALUE self)
#define TypedData_Make_Struct(klass, type, data_type, sval)
HRESULT ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt)
RUBY_EXTERN VALUE rb_cTime
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
static void olevariant_free(void *ptr)
static void unlock_safe_array(SAFEARRAY *psa)
void ole_val2variant(VALUE val, VARIANT *var)