8static HRESULT recordinfo_from_itypelib(ITypeLib *pTypeLib,
VALUE name, IRecordInfo **ppri);
10static void olerecord_free(
void *pvar);
11static size_t olerecord_size(
const void *
ptr);
12static VALUE folerecord_s_allocate(
VALUE klass);
25 {
NULL, olerecord_free, olerecord_size,},
30recordinfo_from_itypelib(ITypeLib *pTypeLib,
VALUE name, IRecordInfo **ppri)
39 count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
40 for (i = 0; i <
count; i++) {
41 hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, i,
46 hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo);
51 hr = GetRecordInfoFromTypeInfo(pTypeInfo, ppri);
76 hr =
pri->lpVtbl->PutField(
pri, INVOKE_PROPERTYPUT, prec->
pdata, pbuf, &var);
112 fields = folerecord_to_h(rec);
114 V_RECORDINFO(var) =
pri;
115 V_RECORD(var) = prec->
pdata;
116 V_VT(var) = VT_RECORD;
141 hr =
pri->lpVtbl->GetName(
pri, &bstr);
147 if (FAILED(hr) ||
count == 0)
150 hr =
pri->lpVtbl->GetFieldNames(
pri, &
count, bstrs);
157 for (i = 0; i <
count; i++) {
162 hr =
pri->lpVtbl->GetFieldNoCopy(
pri, prec, bstrs[i], &var, &
pdata);
216olerecord_free(
void *
ptr) {
226olerecord_size(
const void *
ptr)
235 hr = pvar->
pri->lpVtbl->GetSize(pvar->
pri, &
size);
245folerecord_s_allocate(
VALUE klass) {
284 ITypeLib *pTypeLib =
NULL;
290 if (RB_TYPE_P(
typename,
T_SYMBOL)) {
313 hr = recordinfo_from_itypelib(pTypeLib,
typename, &
pri);
358folerecord_to_h(
VALUE self)
395folerecord_typename(
VALUE self)
416 if (p[
len-1] ==
'=') {
457#if SIZEOF_SIZE_T > SIZEOF_LONG
467 return olerecord_ivar_get(self,
name);
468 }
else if (
argc == 2) {
469 return olerecord_ivar_set(self,
name,
argv[1]);
513 return olerecord_ivar_get(self, sname);
552 return olerecord_ivar_set(self, sname, val);
578folerecord_inspect(
VALUE self)
582 tname = folerecord_typename(self);
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define RSTRING_LEN(string)
#define RSTRING_PTR(string)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_cObject
Object class.
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.
void rb_hash_foreach(VALUE hash, rb_foreach_func *func, VALUE farg)
VALUE rb_hash_fetch(VALUE hash, VALUE key)
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
int rb_str_cmp(VALUE, VALUE)
VALUE rb_str_subseq(VALUE, long, long)
VALUE rb_ivar_get(VALUE, ID)
VALUE rb_ivar_set(VALUE, ID, VALUE)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
ID rb_intern(const char *)
#define ALLOCA_N(type, n)
#define StringValuePtr(v)
#define StringValueCStr(v)
#define TypedData_Get_Struct(obj, type, data_type, sval)
@ RUBY_TYPED_FREE_IMMEDIATELY
#define TypedData_Make_Struct(klass, type, data_type, sval)
VALUE rb_sprintf(const char *,...)
size_t strlen(const char *)
LPWSTR ole_vstr2wc(VALUE vstr)
typedef HRESULT(STDAPICALLTYPE FNCOCREATEINSTANCEEX)(REFCLSID
VALUE ole_variant2val(VARIANT *pvar)
void ole_val2variant(VALUE val, VARIANT *var)
HRESULT typelib_from_val(VALUE obj, ITypeLib **pTypeLib)
VALUE eWIN32OLERuntimeError
void ole_raise(HRESULT hr, VALUE ecs, const char *fmt,...)
void Init_win32ole_record(void)
void ole_rec2variant(VALUE rec, VARIANT *var)
void olerecord_set_ivar(VALUE obj, IRecordInfo *pri, void *prec)
VALUE create_win32ole_record(IRecordInfo *pri, void *prec)
ITypeLib * itypelib(VALUE self)