8static void olevariant_free(
void *
ptr);
9static size_t olevariant_size(
const void *
ptr);
11static void ole_val2variant_err(
VALUE val, VARIANT *var);
12static void ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt);
15static void check_type_val2variant(
VALUE val);
17static LONG *ary2safe_array_index(
int ary_size,
VALUE *ary, SAFEARRAY *psa);
18static void unlock_safe_array(SAFEARRAY *psa);
19static SAFEARRAY *get_locked_safe_array(
VALUE val);
28 {
NULL, olevariant_free, olevariant_size,},
33olevariant_free(
void *
ptr)
37 VariantClear(&(pvar->
var));
42olevariant_size(
const void *
ptr)
48ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar)
56 SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0,
len);
60 hr = SafeArrayAccessData(psa, &pdest);
63 SafeArrayUnaccessData(psa);
64 V_VT(&(pvar->
realvar)) = (vt & ~VT_BYREF);
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;
103 ole_set_byref(&(pvar->
realvar), &(pvar->
var), vt);
106 }
else if ( (vt & ~VT_BYREF) == VT_ERROR) {
107 ole_val2variant_err(val, &(pvar->
realvar));
109 ole_set_byref(&(pvar->
realvar), &(pvar->
var), vt);
111 hr = VariantCopy(&(pvar->
var), &(pvar->
realvar));
115 V_VT(&(pvar->
var)) = vt;
116 if (vt == (VT_BYREF | VT_VARIANT)) {
117 ole_set_byref(&(pvar->
realvar), &(pvar->
var), vt);
119 V_VT(&(pvar->
realvar)) = vt & ~VT_BYREF;
121 ole_set_byref(&(pvar->
realvar), &(pvar->
var), vt);
126 if (vt == (VT_BYREF | VT_VARIANT)) {
127 ole_set_byref(&(pvar->
realvar), &(pvar->
var), vt);
128 }
else if (vt & VT_BYREF) {
129 if ( (vt & ~VT_BYREF) != V_VT(&(pvar->
realvar))) {
134 ole_set_byref(&(pvar->
realvar), &(pvar->
var), vt);
137 if (vt == V_VT(&(pvar->
realvar))) {
138 hr = VariantCopy(&(pvar->
var), &(pvar->
realvar));
140 hr = VariantChangeTypeEx(&(pvar->
var), &(pvar->
realvar),
152ole_val2variant_err(
VALUE val, VARIANT *var)
156 v = folevariant_value(
v);
161 V_VT(var) = VT_ERROR;
170ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt)
173 if (vt == (VT_VARIANT|VT_BYREF)) {
174 V_VARIANTREF(var) = realvar;
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);
300 obj = folevariant_s_allocate(
klass);
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);
335check_type_val2variant(
VALUE val)
346 for(
i = 0;
i <
len;
i++) {
348 check_type_val2variant(elem);
416 check_type_val2variant(val);
424 if ((vt & VT_TYPEMASK) == VT_RECORD) {
427 ole_val2olevariantdata(val, vt, pvar);
433get_locked_safe_array(
VALUE val)
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);
454ary2safe_array_index(
int ary_size,
VALUE *ary, SAFEARRAY *psa)
459 dim = SafeArrayGetDim(psa);
460 if (dim != ary_size) {
467 for (
i = 0;
i < dim;
i++) {
474unlock_safe_array(SAFEARRAY *psa)
477 hr = SafeArrayUnlock(psa);
514 if (!V_ISARRAY(&(pvar->
var))) {
516 "`[]' is not available for this variant type object");
518 psa = get_locked_safe_array(
self);
523 pid = ary2safe_array_index(
argc,
argv, psa);
525 VariantInit(&variant);
526 V_VT(&variant) = (V_VT(&(pvar->
var)) & ~VT_ARRAY) | VT_BYREF;
527 hr = SafeArrayPtrOfIndex(psa, pid, &V_BYREF(&variant));
533 unlock_safe_array(psa);
571 if (!V_ISARRAY(&(pvar->
var))) {
573 "`[]' is not available for this variant type object");
575 psa = get_locked_safe_array(
self);
580 pid = ary2safe_array_index(
argc-1,
argv, psa);
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);
594 unlock_safe_array(psa);
609folevariant_value(
VALUE self)
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);
648folevariant_vartype(
VALUE self)
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");
680 ole_val2olevariantdata(val, vt, pvar);
689 VariantCopy(
var, &(pvar->
var));
VALUE rb_define_class(const char *, VALUE)
Defines a top-level class.
VALUE rb_cObject
Object class.
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_inspect(VALUE)
Convenient wrapper of Object::inspect.
VALUE rb_obj_is_kind_of(VALUE, VALUE)
Determines if obj is a kind of c.
HRESULT ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt)
typedef HRESULT(STDAPICALLTYPE FNCOCREATEINSTANCEEX)(REFCLSID
void ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt)
VALUE ole_variant2val(VARIANT *pvar)
void ole_initialize(void)
VOID * val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt)
void ole_val2variant(VALUE val, VARIANT *var)
VALUE eWIN32OLERuntimeError
void ole_raise(HRESULT hr, VALUE ecs, const char *fmt,...)
void ole_variant2variant(VALUE val, VARIANT *var)
void Init_win32ole_variant(void)