/ext/win32ole/win32ole.c
C | 9286 lines | 9080 code | 172 blank | 34 comment | 364 complexity | 028bd14eb46730c2a57351be02ccded8 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-3.0, GPL-2.0, BSD-3-Clause
Large files files are truncated, but you can click here to view the full file
- /*
- * (c) 1995 Microsoft Corporation. All rights reserved.
- * Developed by ActiveWare Internet Corp., http://www.ActiveWare.com
- *
- * Other modifications Copyright (c) 1997, 1998 by Gurusamy Sarathy
- * <gsar@umich.edu> and Jan Dubois <jan.dubois@ibm.net>
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file
- * of the Perl distribution.
- *
- */
- /*
- modified for win32ole (ruby) by Masaki.Suketa <masaki.suketa@nifty.ne.jp>
- */
- #include "ruby/ruby.h"
- #include "ruby/st.h"
- #include "ruby/encoding.h"
- #include <ctype.h>
- #include <windows.h>
- #include <ocidl.h>
- #include <olectl.h>
- #include <ole2.h>
- #if defined(HAVE_TYPE_IMULTILANGUAGE2) || defined(HAVE_TYPE_IMULTILANGUAGE)
- #include <mlang.h>
- #endif
- #include <stdlib.h>
- #include <math.h>
- #ifdef HAVE_STDARG_PROTOTYPES
- #include <stdarg.h>
- #define va_init_list(a,b) va_start(a,b)
- #else
- #include <varargs.h>
- #define va_init_list(a,b) va_start(a)
- #endif
- #include <objidl.h>
- #define DOUT fprintf(stderr,"[%d]\n",__LINE__)
- #define DOUTS(x) fprintf(stderr,"[%d]:" #x "=%s\n",__LINE__,x)
- #define DOUTMSG(x) fprintf(stderr, "[%d]:" #x "\n",__LINE__)
- #define DOUTI(x) fprintf(stderr, "[%ld]:" #x "=%d\n",__LINE__,x)
- #define DOUTD(x) fprintf(stderr, "[%d]:" #x "=%f\n",__LINE__,x)
- #if defined NONAMELESSUNION && __GNUC__
- #define V_UNION1(X, Y) ((X)->u.Y)
- #else
- #define V_UNION1(X, Y) ((X)->Y)
- #endif
- #if defined NONAMELESSUNION && __GNUC__
- #undef V_UNION
- #define V_UNION(X,Y) ((X)->n1.n2.n3.Y)
- #undef V_VT
- #define V_VT(X) ((X)->n1.n2.vt)
- #undef V_BOOL
- #define V_BOOL(X) V_UNION(X,boolVal)
- #endif
- #ifndef V_I1REF
- #define V_I1REF(X) V_UNION(X, pcVal)
- #endif
- #ifndef U_UI2REF
- #define V_UI2REF(X) V_UNION(X, puiVal)
- #endif
- #ifndef V_INT
- #define V_INT(X) V_UNION(X, intVal)
- #endif
- #ifndef V_INTREF
- #define V_INTREF(X) V_UNION(X, pintVal)
- #endif
- #ifndef V_UINT
- #define V_UINT(X) V_UNION(X, uintVal)
- #endif
- #ifndef V_UINTREF
- #define V_UINTREF(X) V_UNION(X, puintVal)
- #endif
- /*
- * unfortunately IID_IMultiLanguage2 is not included in any libXXX.a
- * in Cygwin(mingw32).
- */
- #if defined(__CYGWIN__) || defined(__MINGW32__)
- #undef IID_IMultiLanguage2
- const IID IID_IMultiLanguage2 = {0xDCCFC164, 0x2B38, 0x11d2, {0xB7, 0xEC, 0x00, 0xC0, 0x4F, 0x8F, 0x5D, 0x9A}};
- #endif
- #define OLE_RELEASE(X) (X) ? ((X)->lpVtbl->Release(X)) : 0
- #define OLE_ADDREF(X) (X) ? ((X)->lpVtbl->AddRef(X)) : 0
- #define OLE_GET_TYPEATTR(X, Y) ((X)->lpVtbl->GetTypeAttr((X), (Y)))
- #define OLE_RELEASE_TYPEATTR(X, Y) ((X)->lpVtbl->ReleaseTypeAttr((X), (Y)))
- #define OLE_FREE(x) {\
- if(g_ole_initialized == TRUE) {\
- if(x) {\
- OLE_RELEASE(x);\
- (x) = 0;\
- }\
- }\
- }
- #define OLEData_Get_Struct(obj, pole) {\
- Data_Get_Struct(obj, struct oledata, pole);\
- if(!pole->pDispatch) {\
- rb_raise(rb_eRuntimeError, "failed to get Dispatch Interface");\
- }\
- }
- #ifdef HAVE_LONG_LONG
- #define I8_2_NUM LL2NUM
- #define UI8_2_NUM ULL2NUM
- #define NUM2I8 NUM2LL
- #define NUM2UI8 NUM2ULL
- #else
- #define I8_2_NUM INT2NUM
- #define UI8_2_NUM UINT2NUM
- #define NUM2I8 NUM2INT
- #define NUM2UI8 NUM2UINT
- #endif
- #define WC2VSTR(x) ole_wc2vstr((x), TRUE)
- #define WIN32OLE_VERSION "1.4.7"
- typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
- (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
- typedef HWND (WINAPI FNHTMLHELP)(HWND hwndCaller, LPCSTR pszFile,
- UINT uCommand, DWORD dwData);
- typedef BOOL (FNENUMSYSEMCODEPAGES) (CODEPAGE_ENUMPROC, DWORD);
- typedef struct {
- struct IEventSinkVtbl * lpVtbl;
- } IEventSink, *PEVENTSINK;
- typedef struct IEventSinkVtbl IEventSinkVtbl;
- struct IEventSinkVtbl {
- STDMETHOD(QueryInterface)(
- PEVENTSINK,
- REFIID,
- LPVOID *);
- STDMETHOD_(ULONG, AddRef)(PEVENTSINK);
- STDMETHOD_(ULONG, Release)(PEVENTSINK);
- STDMETHOD(GetTypeInfoCount)(
- PEVENTSINK,
- UINT *);
- STDMETHOD(GetTypeInfo)(
- PEVENTSINK,
- UINT,
- LCID,
- ITypeInfo **);
- STDMETHOD(GetIDsOfNames)(
- PEVENTSINK,
- REFIID,
- OLECHAR **,
- UINT,
- LCID,
- DISPID *);
- STDMETHOD(Invoke)(
- PEVENTSINK,
- DISPID,
- REFIID,
- LCID,
- WORD,
- DISPPARAMS *,
- VARIANT *,
- EXCEPINFO *,
- UINT *);
- };
- typedef struct tagIEVENTSINKOBJ {
- IEventSinkVtbl *lpVtbl;
- DWORD m_cRef;
- IID m_iid;
- int m_event_id;
- ITypeInfo *pTypeInfo;
- }IEVENTSINKOBJ, *PIEVENTSINKOBJ;
- VALUE cWIN32OLE;
- VALUE cWIN32OLE_TYPELIB;
- VALUE cWIN32OLE_TYPE;
- VALUE cWIN32OLE_VARIABLE;
- VALUE cWIN32OLE_METHOD;
- VALUE cWIN32OLE_PARAM;
- VALUE cWIN32OLE_EVENT;
- VALUE cWIN32OLE_VARIANT;
- VALUE eWIN32OLERuntimeError;
- VALUE mWIN32OLE_VARIANT;
- VALUE cWIN32OLE_PROPERTY;
- static VALUE ary_ole_event;
- static ID id_events;
- static BOOL g_ole_initialized = FALSE;
- static BOOL g_cp_installed = FALSE;
- static BOOL g_lcid_installed = FALSE;
- static HINSTANCE ghhctrl = NULL;
- static HINSTANCE gole32 = NULL;
- static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL;
- static VALUE com_hash;
- static IDispatchVtbl com_vtbl;
- static UINT cWIN32OLE_cp = CP_ACP;
- static LCID cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT;
- static rb_encoding *cWIN32OLE_enc;
- static UINT g_cp_to_check = CP_ACP;
- static char g_lcid_to_check[8 + 1];
- static VARTYPE g_nil_to = VT_ERROR;
- static st_table *enc2cp_table;
- static IMessageFilterVtbl message_filter;
- static IMessageFilter imessage_filter = { &message_filter };
- static IMessageFilter* previous_filter;
- #if defined(HAVE_TYPE_IMULTILANGUAGE2)
- static IMultiLanguage2 *pIMultiLanguage = NULL;
- #elif defined(HAVE_TYPE_IMULTILANGUAGE)
- static IMultiLanguage *pIMultiLanguage = NULL;
- #else
- #define pIMultiLanguage NULL /* dummy */
- #endif
- struct oledata {
- IDispatch *pDispatch;
- };
- struct oletypelibdata {
- ITypeLib *pTypeLib;
- };
- struct oletypedata {
- ITypeInfo *pTypeInfo;
- };
- struct olemethoddata {
- ITypeInfo *pOwnerTypeInfo;
- ITypeInfo *pTypeInfo;
- UINT index;
- };
- struct olevariabledata {
- ITypeInfo *pTypeInfo;
- UINT index;
- };
- struct oleparamdata {
- ITypeInfo *pTypeInfo;
- UINT method_index;
- UINT index;
- };
- struct oleeventdata {
- DWORD dwCookie;
- IConnectionPoint *pConnectionPoint;
- long event_id;
- };
- struct oleparam {
- DISPPARAMS dp;
- OLECHAR** pNamedArgs;
- };
- struct olevariantdata {
- VARIANT realvar;
- VARIANT var;
- };
- static HRESULT ( STDMETHODCALLTYPE QueryInterface )(IDispatch __RPC_FAR *, REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
- static ULONG ( STDMETHODCALLTYPE AddRef )(IDispatch __RPC_FAR * This);
- static ULONG ( STDMETHODCALLTYPE Release )(IDispatch __RPC_FAR * This);
- static HRESULT ( STDMETHODCALLTYPE GetTypeInfoCount )(IDispatch __RPC_FAR * This, UINT __RPC_FAR *pctinfo);
- static HRESULT ( STDMETHODCALLTYPE GetTypeInfo )(IDispatch __RPC_FAR * This, UINT iTInfo, LCID lcid, ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);
- static HRESULT ( STDMETHODCALLTYPE GetIDsOfNames )(IDispatch __RPC_FAR * This, REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId);
- static HRESULT ( STDMETHODCALLTYPE Invoke )( IDispatch __RPC_FAR * This, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr);
- static IDispatch* val2dispatch(VALUE val);
- static double rbtime2vtdate(VALUE tmobj);
- static VALUE vtdate2rbtime(double date);
- static rb_encoding *ole_cp2encoding(UINT cp);
- static UINT ole_encoding2cp(rb_encoding *enc);
- NORETURN(static void failed_load_conv51932(void));
- #ifndef pIMultiLanguage
- static void load_conv_function51932(void);
- #endif
- static UINT ole_init_cp(void);
- static char *ole_wc2mb(LPWSTR pw);
- static VALUE ole_hresult2msg(HRESULT hr);
- static void ole_freeexceptinfo(EXCEPINFO *pExInfo);
- static VALUE ole_excepinfo2msg(EXCEPINFO *pExInfo);
- static void ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...);
- static void ole_initialize();
- static void ole_msg_loop();
- static void ole_free(struct oledata *pole);
- static void oletypelib_free(struct oletypelibdata *poletypelib);
- static void oletype_free(struct oletypedata *poletype);
- static void olemethod_free(struct olemethoddata *polemethod);
- static void olevariable_free(struct olevariabledata *polevar);
- static void oleparam_free(struct oleparamdata *pole);
- static LPWSTR ole_vstr2wc(VALUE vstr);
- static LPWSTR ole_mb2wc(char *pm, int len);
- static VALUE ole_wc2vstr(LPWSTR pw, BOOL isfree);
- static VALUE ole_ary_m_entry(VALUE val, long *pid);
- static void * get_ptr_of_variant(VARIANT *pvar);
- static VALUE is_all_index_under(long *pid, long *pub, long dim);
- static void ole_set_safe_array(long n, SAFEARRAY *psa, long *pid, long *pub, VALUE val, long dim, VARTYPE vt);
- static long dimension(VALUE val);
- static long ary_len_of_dim(VALUE ary, long dim);
- static HRESULT ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt);
- static void ole_val2variant(VALUE val, VARIANT *var);
- static void ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt);
- static void ole_val2ptr_variant(VALUE val, VARIANT *var);
- static void ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt);
- static void ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar);
- static void ole_val2variant2(VALUE val, VARIANT *var);
- static VALUE make_inspect(const char *class_name, VALUE detail);
- static VALUE default_inspect(VALUE self, const char *class_name);
- static VALUE ole_set_member(VALUE self, IDispatch *dispatch);
- static VALUE fole_s_allocate(VALUE klass);
- static VALUE create_win32ole_object(VALUE klass, IDispatch *pDispatch, int argc, VALUE *argv);
- static VALUE ary_new_dim(VALUE myary, long *pid, long *plb, long dim);
- static void ary_store_dim(VALUE myary, long *pid, long *plb, long dim, VALUE val);
- static VALUE ole_variant2val(VARIANT *pvar);
- static LONG reg_open_key(HKEY hkey, const char *name, HKEY *phkey);
- static LONG reg_open_vkey(HKEY hkey, VALUE key, HKEY *phkey);
- static VALUE reg_enum_key(HKEY hkey, DWORD i);
- static VALUE reg_get_val(HKEY hkey, const char *subkey);
- static VALUE reg_get_typelib_file_path(HKEY hkey);
- static VALUE typelib_file_from_clsid(VALUE ole);
- static VALUE typelib_file_from_typelib(VALUE ole);
- static VALUE typelib_file(VALUE ole);
- static void ole_const_load(ITypeLib *pTypeLib, VALUE klass, VALUE self);
- static HRESULT clsid_from_remote(VALUE host, VALUE com, CLSID *pclsid);
- static VALUE ole_create_dcom(int argc, VALUE *argv, VALUE self);
- static VALUE ole_bind_obj(VALUE moniker, int argc, VALUE *argv, VALUE self);
- static VALUE fole_s_connect(int argc, VALUE *argv, VALUE self);
- static VALUE fole_s_const_load(int argc, VALUE *argv, VALUE self);
- static VALUE ole_types_from_typelib(ITypeLib *pTypeLib, VALUE classes);
- static ULONG reference_count(struct oledata * pole);
- static VALUE fole_s_reference_count(VALUE self, VALUE obj);
- static VALUE fole_s_free(VALUE self, VALUE obj);
- static HWND ole_show_help(VALUE helpfile, VALUE helpcontext);
- static VALUE fole_s_show_help(int argc, VALUE *argv, VALUE self);
- static VALUE fole_s_get_code_page(VALUE self);
- static BOOL CALLBACK installed_code_page_proc(LPTSTR str);
- static BOOL code_page_installed(UINT cp);
- static VALUE fole_s_set_code_page(VALUE self, VALUE vcp);
- static VALUE fole_s_get_locale(VALUE self);
- static BOOL CALLBACK installed_lcid_proc(LPTSTR str);
- static BOOL lcid_installed(LCID lcid);
- static VALUE fole_s_set_locale(VALUE self, VALUE vlcid);
- static VALUE fole_s_create_guid(VALUE self);
- static void ole_pure_initialize();
- static VALUE fole_s_ole_initialize(VALUE self);
- static void ole_pure_uninitialize();
- static VALUE fole_s_ole_uninitialize(VALUE self);
- static VALUE fole_initialize(int argc, VALUE *argv, VALUE self);
- static VALUE hash2named_arg(VALUE pair, struct oleparam* pOp);
- static VALUE set_argv(VARIANTARG* realargs, unsigned int beg, unsigned int end);
- static VALUE ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket);
- static VALUE fole_invoke(int argc, VALUE *argv, VALUE self);
- static VALUE ole_invoke2(VALUE self, VALUE dispid, VALUE args, VALUE types, USHORT dispkind);
- static VALUE fole_invoke2(VALUE self, VALUE dispid, VALUE args, VALUE types);
- static VALUE fole_getproperty2(VALUE self, VALUE dispid, VALUE args, VALUE types);
- static VALUE fole_setproperty2(VALUE self, VALUE dispid, VALUE args, VALUE types);
- static VALUE fole_setproperty_with_bracket(int argc, VALUE *argv, VALUE self);
- static VALUE fole_setproperty(int argc, VALUE *argv, VALUE self);
- static VALUE fole_getproperty_with_bracket(int argc, VALUE *argv, VALUE self);
- static VALUE ole_propertyput(VALUE self, VALUE property, VALUE value);
- static VALUE fole_free(VALUE self);
- static VALUE ole_each_sub(VALUE pEnumV);
- static VALUE ole_ienum_free(VALUE pEnumV);
- static VALUE fole_each(VALUE self);
- static VALUE fole_missing(int argc, VALUE *argv, VALUE self);
- static VALUE ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE name);
- static VALUE olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name);
- static VALUE ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask);
- static VALUE ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask);
- static HRESULT typeinfo_from_ole(struct oledata *pole, ITypeInfo **ppti);
- static VALUE ole_methods(VALUE self, int mask);
- static VALUE fole_methods(VALUE self);
- static VALUE fole_get_methods(VALUE self);
- static VALUE fole_put_methods(VALUE self);
- static VALUE fole_func_methods(VALUE self);
- static VALUE ole_type_from_itypeinfo(ITypeInfo *pTypeInfo);
- static VALUE fole_type(VALUE self);
- static VALUE ole_typelib_from_itypeinfo(ITypeInfo *pTypeInfo);
- static VALUE fole_typelib(VALUE self);
- static VALUE fole_query_interface(VALUE self, VALUE str_iid);
- static VALUE fole_respond_to(VALUE self, VALUE method);
- static HRESULT ole_docinfo_from_type(ITypeInfo *pTypeInfo, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
- static VALUE ole_usertype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
- static VALUE ole_ptrtype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
- static VALUE ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
- static VALUE fole_method_help(VALUE self, VALUE cmdname);
- static VALUE fole_activex_initialize(VALUE self);
- static VALUE foletype_s_ole_classes(VALUE self, VALUE typelib);
- static VALUE foletype_s_typelibs(VALUE self);
- static VALUE foletype_s_progids(VALUE self);
- static VALUE foletype_s_allocate(VALUE klass);
- static VALUE oletype_set_member(VALUE self, ITypeInfo *pTypeInfo, VALUE name);
- static VALUE oleclass_from_typelib(VALUE self, ITypeLib *pTypeLib, VALUE oleclass);
- static VALUE oletypelib_set_member(VALUE self, ITypeLib *pTypeLib);
- static ITypeLib * oletypelib_get_typelib(VALUE self);
- static void oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr);
- static VALUE foletypelib_s_typelibs(VALUE self);
- static VALUE make_version_str(VALUE major, VALUE minor);
- static VALUE oletypelib_search_registry2(VALUE self, VALUE args);
- static VALUE oletypelib_search_registry(VALUE self, VALUE typelib);
- static VALUE foletypelib_s_allocate(VALUE klass);
- static VALUE foletypelib_initialize(VALUE self, VALUE args);
- static VALUE foletypelib_guid(VALUE self);
- static VALUE foletypelib_name(VALUE self);
- static VALUE foletypelib_version(VALUE self);
- static VALUE foletypelib_major_version(VALUE self);
- static VALUE foletypelib_minor_version(VALUE self);
- static VALUE oletypelib_path(VALUE guid, VALUE version);
- static HRESULT oletypelib_from_guid(VALUE guid, VALUE version, ITypeLib **ppTypeLib);
- static VALUE foletypelib_path(VALUE self);
- static VALUE foletypelib_visible(VALUE self);
- static VALUE foletypelib_library_name(VALUE self);
- static VALUE foletypelib_ole_types(VALUE self);
- static VALUE foletypelib_inspect(VALUE self);
- static VALUE foletype_initialize(VALUE self, VALUE typelib, VALUE oleclass);
- static VALUE foletype_name(VALUE self);
- static VALUE ole_ole_type(ITypeInfo *pTypeInfo);
- static VALUE foletype_ole_type(VALUE self);
- static VALUE ole_type_guid(ITypeInfo *pTypeInfo);
- static VALUE foletype_guid(VALUE self);
- static VALUE ole_type_progid(ITypeInfo *pTypeInfo);
- static VALUE foletype_progid(VALUE self);
- static VALUE ole_type_visible(ITypeInfo *pTypeInfo);
- static VALUE foletype_visible(VALUE self);
- static VALUE ole_type_major_version(ITypeInfo *pTypeInfo);
- static VALUE foletype_major_version(VALUE self);
- static VALUE ole_type_minor_version(ITypeInfo *pTypeInfo);
- static VALUE foletype_minor_version(VALUE self);
- static VALUE ole_type_typekind(ITypeInfo *pTypeInfo);
- static VALUE foletype_typekind(VALUE self);
- static VALUE ole_type_helpstring(ITypeInfo *pTypeInfo);
- static VALUE foletype_helpstring(VALUE self);
- static VALUE ole_type_src_type(ITypeInfo *pTypeInfo);
- static VALUE foletype_src_type(VALUE self);
- static VALUE ole_type_helpfile(ITypeInfo *pTypeInfo);
- static VALUE foletype_helpfile(VALUE self);
- static VALUE ole_type_helpcontext(ITypeInfo *pTypeInfo);
- static VALUE foletype_helpcontext(VALUE self);
- static VALUE foletype_ole_typelib(VALUE self);
- static VALUE ole_type_impl_ole_types(ITypeInfo *pTypeInfo, int implflags);
- static VALUE foletype_impl_ole_types(VALUE self);
- static VALUE foletype_source_ole_types(VALUE self);
- static VALUE foletype_default_event_sources(VALUE self);
- static VALUE foletype_default_ole_types(VALUE self);
- static VALUE foletype_inspect(VALUE self);
- static VALUE ole_variables(ITypeInfo *pTypeInfo);
- static VALUE foletype_variables(VALUE self);
- static VALUE foletype_methods(VALUE self);
- static VALUE folevariable_name(VALUE self);
- static VALUE ole_variable_ole_type(ITypeInfo *pTypeInfo, UINT var_index);
- static VALUE folevariable_ole_type(VALUE self);
- static VALUE ole_variable_ole_type_detail(ITypeInfo *pTypeInfo, UINT var_index);
- static VALUE folevariable_ole_type_detail(VALUE self);
- static VALUE ole_variable_value(ITypeInfo *pTypeInfo, UINT var_index);
- static VALUE folevariable_value(VALUE self);
- static VALUE ole_variable_visible(ITypeInfo *pTypeInfo, UINT var_index);
- static VALUE folevariable_visible(VALUE self);
- static VALUE ole_variable_kind(ITypeInfo *pTypeInfo, UINT var_index);
- static VALUE folevariable_variable_kind(VALUE self);
- static VALUE ole_variable_varkind(ITypeInfo *pTypeInfo, UINT var_index);
- static VALUE folevariable_varkind(VALUE self);
- static VALUE folevariable_inspect(VALUE self);
- static VALUE olemethod_set_member(VALUE self, ITypeInfo *pTypeInfo, ITypeInfo *pOwnerTypeInfo, int index, VALUE name);
- static VALUE folemethod_s_allocate(VALUE klass);
- static VALUE folemethod_initialize(VALUE self, VALUE oletype, VALUE method);
- static VALUE folemethod_name(VALUE self);
- static VALUE ole_method_return_type(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_return_type(VALUE self);
- static VALUE ole_method_return_vtype(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_return_vtype(VALUE self);
- static VALUE ole_method_return_type_detail(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_return_type_detail(VALUE self);
- static VALUE ole_method_invkind(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE ole_method_invoke_kind(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_invkind(VALUE self);
- static VALUE folemethod_invoke_kind(VALUE self);
- static VALUE ole_method_visible(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_visible(VALUE self);
- static VALUE ole_method_event(ITypeInfo *pTypeInfo, UINT method_index, VALUE method_name);
- static VALUE folemethod_event(VALUE self);
- static VALUE folemethod_event_interface(VALUE self);
- static VALUE ole_method_docinfo_from_type(ITypeInfo *pTypeInfo, UINT method_index, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
- static VALUE ole_method_helpstring(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_helpstring(VALUE self);
- static VALUE ole_method_helpfile(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_helpfile(VALUE self);
- static VALUE ole_method_helpcontext(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_helpcontext(VALUE self);
- static VALUE ole_method_dispid(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_dispid(VALUE self);
- static VALUE ole_method_offset_vtbl(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_offset_vtbl(VALUE self);
- static VALUE ole_method_size_params(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_size_params(VALUE self);
- static VALUE ole_method_size_opt_params(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_size_opt_params(VALUE self);
- static VALUE ole_method_params(ITypeInfo *pTypeInfo, UINT method_index);
- static VALUE folemethod_params(VALUE self);
- static VALUE folemethod_inspect(VALUE self);
- static VALUE foleparam_s_allocate(VALUE klass);
- static VALUE oleparam_ole_param_from_index(VALUE self, ITypeInfo *pTypeInfo, UINT method_index, int param_index);
- static VALUE oleparam_ole_param(VALUE self, VALUE olemethod, int n);
- static VALUE foleparam_initialize(VALUE self, VALUE olemethod, VALUE n);
- static VALUE foleparam_name(VALUE self);
- static VALUE ole_param_ole_type(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
- static VALUE foleparam_ole_type(VALUE self);
- static VALUE ole_param_ole_type_detail(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
- static VALUE foleparam_ole_type_detail(VALUE self);
- static VALUE ole_param_flag_mask(ITypeInfo *pTypeInfo, UINT method_index, UINT index, USHORT mask);
- static VALUE foleparam_input(VALUE self);
- static VALUE foleparam_output(VALUE self);
- static VALUE foleparam_optional(VALUE self);
- static VALUE foleparam_retval(VALUE self);
- static VALUE ole_param_default(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
- static VALUE foleparam_default(VALUE self);
- static VALUE foleparam_inspect(VALUE self);
- static long ole_search_event_at(VALUE ary, VALUE ev);
- static VALUE ole_search_event(VALUE ary, VALUE ev, BOOL *is_default);
- static VALUE ole_search_handler_method(VALUE handler, VALUE ev, BOOL *is_default_handler);
- static void ole_delete_event(VALUE ary, VALUE ev);
- static void hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams);
- static VALUE hash2result(VALUE hash);
- static void ary2ptr_dispparams(VALUE ary, DISPPARAMS *pdispparams);
- static VALUE exec_callback(VALUE arg);
- static VALUE rescue_callback(VALUE arg);
- static HRESULT find_iid(VALUE ole, char *pitf, IID *piid, ITypeInfo **ppTypeInfo);
- static HRESULT find_coclass(ITypeInfo *pTypeInfo, TYPEATTR *pTypeAttr, ITypeInfo **pTypeInfo2, TYPEATTR **pTypeAttr2);
- static HRESULT find_default_source_from_typeinfo(ITypeInfo *pTypeInfo, TYPEATTR *pTypeAttr, ITypeInfo **ppTypeInfo);
- static HRESULT find_default_source(VALUE ole, IID *piid, ITypeInfo **ppTypeInfo);
- static void ole_event_free(struct oleeventdata *poleev);
- static VALUE fev_s_allocate(VALUE klass);
- static VALUE ev_advise(int argc, VALUE *argv, VALUE self);
- static VALUE fev_initialize(int argc, VALUE *argv, VALUE self);
- static VALUE fev_s_msg_loop(VALUE klass);
- static void add_event_call_back(VALUE obj, VALUE event, VALUE data);
- static VALUE ev_on_event(int argc, VALUE *argv, VALUE self, VALUE is_ary_arg);
- static VALUE fev_on_event(int argc, VALUE *argv, VALUE self);
- static VALUE fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self);
- static VALUE fev_off_event(int argc, VALUE *argv, VALUE self);
- static VALUE fev_unadvise(VALUE self);
- static VALUE fev_set_handler(VALUE self, VALUE val);
- static VALUE fev_get_handler(VALUE self);
- static VALUE evs_push(VALUE ev);
- static VALUE evs_delete(long i);
- static VALUE evs_entry(long i);
- static VALUE evs_length();
- static void olevariant_free(struct olevariantdata *pvar);
- static VALUE folevariant_s_allocate(VALUE klass);
- static VALUE folevariant_s_array(VALUE klass, VALUE dims, VALUE vvt);
- static VALUE folevariant_initialize(VALUE self, VALUE args);
- static long *ary2safe_array_index(int ary_size, VALUE *ary, SAFEARRAY *psa);
- static void unlock_safe_array(SAFEARRAY *psa);
- static SAFEARRAY *get_locked_safe_array(VALUE val);
- static VALUE folevariant_ary_aref(int argc, VALUE *argv, VALUE self);
- static VOID * val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt);
- static VALUE folevariant_ary_aset(int argc, VALUE *argv, VALUE self);
- static VALUE folevariant_value(VALUE self);
- static VALUE folevariant_vartype(VALUE self);
- static VALUE folevariant_set_value(VALUE self, VALUE val);
- static void init_enc2cp();
- static void free_enc2cp();
-
- static HRESULT (STDMETHODCALLTYPE mf_QueryInterface)(
- IMessageFilter __RPC_FAR * This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
- {
- if (MEMCMP(riid, &IID_IUnknown, GUID, 1) == 0
- || MEMCMP(riid, &IID_IMessageFilter, GUID, 1) == 0)
- {
- *ppvObject = &message_filter;
- return S_OK;
- }
- return E_NOINTERFACE;
- }
- static ULONG (STDMETHODCALLTYPE mf_AddRef)(
- IMessageFilter __RPC_FAR * This)
- {
- return 1;
- }
-
- static ULONG (STDMETHODCALLTYPE mf_Release)(
- IMessageFilter __RPC_FAR * This)
- {
- return 1;
- }
- static DWORD (STDMETHODCALLTYPE mf_HandleInComingCall)(
- IMessageFilter __RPC_FAR * pThis,
- DWORD dwCallType, //Type of incoming call
- HTASK threadIDCaller, //Task handle calling this task
- DWORD dwTickCount, //Elapsed tick count
- LPINTERFACEINFO lpInterfaceInfo //Pointer to INTERFACEINFO structure
- )
- {
- #ifdef DEBUG_MESSAGEFILTER
- printf("incoming %08X, %08X, %d\n", dwCallType, threadIDCaller, dwTickCount);
- fflush(stdout);
- #endif
- switch (dwCallType)
- {
- case CALLTYPE_ASYNC:
- case CALLTYPE_TOPLEVEL_CALLPENDING:
- case CALLTYPE_ASYNC_CALLPENDING:
- if (rb_during_gc()) {
- return SERVERCALL_RETRYLATER;
- }
- break;
- default:
- break;
- }
- if (previous_filter) {
- return previous_filter->lpVtbl->HandleInComingCall(previous_filter,
- dwCallType,
- threadIDCaller,
- dwTickCount,
- lpInterfaceInfo);
- }
- return SERVERCALL_ISHANDLED;
- }
- static DWORD (STDMETHODCALLTYPE mf_RetryRejectedCall)(
- IMessageFilter* pThis,
- HTASK threadIDCallee, //Server task handle
- DWORD dwTickCount, //Elapsed tick count
- DWORD dwRejectType //Returned rejection message
- )
- {
- if (previous_filter) {
- return previous_filter->lpVtbl->RetryRejectedCall(previous_filter,
- threadIDCallee,
- dwTickCount,
- dwRejectType);
- }
- return 1000;
- }
- static DWORD (STDMETHODCALLTYPE mf_MessagePending)(
- IMessageFilter* pThis,
- HTASK threadIDCallee, //Called applications task handle
- DWORD dwTickCount, //Elapsed tick count
- DWORD dwPendingType //Call type
- )
- {
- if (rb_during_gc()) {
- return PENDINGMSG_WAITNOPROCESS;
- }
- if (previous_filter) {
- return previous_filter->lpVtbl->MessagePending(previous_filter,
- threadIDCallee,
- dwTickCount,
- dwPendingType);
- }
- return PENDINGMSG_WAITNOPROCESS;
- }
-
- typedef struct _Win32OLEIDispatch
- {
- IDispatch dispatch;
- ULONG refcount;
- VALUE obj;
- } Win32OLEIDispatch;
- static HRESULT ( STDMETHODCALLTYPE QueryInterface )(
- IDispatch __RPC_FAR * This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
- {
- if (MEMCMP(riid, &IID_IUnknown, GUID, 1) == 0
- || MEMCMP(riid, &IID_IDispatch, GUID, 1) == 0)
- {
- Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
- p->refcount++;
- *ppvObject = This;
- return S_OK;
- }
- return E_NOINTERFACE;
- }
-
- static ULONG ( STDMETHODCALLTYPE AddRef )(
- IDispatch __RPC_FAR * This)
- {
- Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
- return ++(p->refcount);
- }
-
- static ULONG ( STDMETHODCALLTYPE Release )(
- IDispatch __RPC_FAR * This)
- {
- Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
- ULONG u = --(p->refcount);
- if (u == 0) {
- st_data_t key = p->obj;
- st_delete(DATA_PTR(com_hash), &key, 0);
- free(p);
- }
- return u;
- }
-
- static HRESULT ( STDMETHODCALLTYPE GetTypeInfoCount )(
- IDispatch __RPC_FAR * This,
- /* [out] */ UINT __RPC_FAR *pctinfo)
- {
- return E_NOTIMPL;
- }
-
- static HRESULT ( STDMETHODCALLTYPE GetTypeInfo )(
- IDispatch __RPC_FAR * This,
- /* [in] */ UINT iTInfo,
- /* [in] */ LCID lcid,
- /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)
- {
- return E_NOTIMPL;
- }
-
- static HRESULT ( STDMETHODCALLTYPE GetIDsOfNames )(
- IDispatch __RPC_FAR * This,
- /* [in] */ REFIID riid,
- /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
- /* [in] */ UINT cNames,
- /* [in] */ LCID lcid,
- /* [size_is][out] */ DISPID __RPC_FAR *rgDispId)
- {
- /*
- Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
- */
- char* psz = ole_wc2mb(*rgszNames); // support only one method
- *rgDispId = rb_intern(psz);
- free(psz);
- return S_OK;
- }
-
- static /* [local] */ HRESULT ( STDMETHODCALLTYPE Invoke )(
- IDispatch __RPC_FAR * This,
- /* [in] */ DISPID dispIdMember,
- /* [in] */ REFIID riid,
- /* [in] */ LCID lcid,
- /* [in] */ WORD wFlags,
- /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
- /* [out] */ VARIANT __RPC_FAR *pVarResult,
- /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
- /* [out] */ UINT __RPC_FAR *puArgErr)
- {
- VALUE v;
- int i;
- int args = pDispParams->cArgs;
- Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
- VALUE* parg = ALLOCA_N(VALUE, args);
- for (i = 0; i < args; i++) {
- *(parg + i) = ole_variant2val(&pDispParams->rgvarg[args - i - 1]);
- }
- if (dispIdMember == DISPID_VALUE) {
- if (wFlags == DISPATCH_METHOD) {
- dispIdMember = rb_intern("call");
- } else if (wFlags & DISPATCH_PROPERTYGET) {
- dispIdMember = rb_intern("value");
- }
- }
- v = rb_funcall2(p->obj, dispIdMember, args, parg);
- ole_val2variant(v, pVarResult);
- return S_OK;
- }
- static IDispatch*
- val2dispatch(VALUE val)
- {
- struct st_table *tbl = DATA_PTR(com_hash);
- Win32OLEIDispatch* pdisp;
- st_data_t data;
- if (st_lookup(tbl, val, &data)) {
- pdisp = (Win32OLEIDispatch *)(data & ~FIXNUM_FLAG);
- pdisp->refcount++;
- }
- else {
- pdisp = ALLOC(Win32OLEIDispatch);
- pdisp->dispatch.lpVtbl = &com_vtbl;
- pdisp->refcount = 1;
- pdisp->obj = val;
- st_insert(tbl, val, (VALUE)pdisp | FIXNUM_FLAG);
- }
- return &pdisp->dispatch;
- }
- static double
- rbtime2vtdate(VALUE tmobj)
- {
- SYSTEMTIME st;
- double t = 0;
- memset(&st, 0, sizeof(SYSTEMTIME));
- st.wYear = FIX2INT(rb_funcall(tmobj, rb_intern("year"), 0));
- st.wMonth = FIX2INT(rb_funcall(tmobj, rb_intern("month"), 0));
- st.wDay = FIX2INT(rb_funcall(tmobj, rb_intern("mday"), 0));
- st.wHour = FIX2INT(rb_funcall(tmobj, rb_intern("hour"), 0));
- st.wMinute = FIX2INT(rb_funcall(tmobj, rb_intern("min"), 0));
- st.wSecond = FIX2INT(rb_funcall(tmobj, rb_intern("sec"), 0));
- st.wMilliseconds = FIX2INT(rb_funcall(tmobj, rb_intern("nsec"), 0)) / 1000000;
- SystemTimeToVariantTime(&st, &t);
- return t;
- }
- static VALUE
- vtdate2rbtime(double date)
- {
- SYSTEMTIME st;
- VALUE v;
- VariantTimeToSystemTime(date, &st);
- v = rb_funcall(rb_cTime, rb_intern("new"), 6,
- INT2FIX(st.wYear),
- INT2FIX(st.wMonth),
- INT2FIX(st.wDay),
- INT2FIX(st.wHour),
- INT2FIX(st.wMinute),
- INT2FIX(st.wSecond));
- if (st.wMilliseconds > 0) {
- return rb_funcall(v, rb_intern("+"), 1, rb_float_new((double)(st.wMilliseconds / 1000.0)));
- }
- return v;
- }
- #define ENC_MACHING_CP(enc,encname,cp) if(strcasecmp(rb_enc_name((enc)),(encname)) == 0) return cp
- static UINT ole_encoding2cp(rb_encoding *enc)
- {
- /*
- * Is there any better solution to convert
- * Ruby encoding to Windows codepage???
- */
- ENC_MACHING_CP(enc, "Big5", 950);
- ENC_MACHING_CP(enc, "CP51932", 51932);
- ENC_MACHING_CP(enc, "CP850", 850);
- ENC_MACHING_CP(enc, "CP852", 852);
- ENC_MACHING_CP(enc, "CP855", 855);
- ENC_MACHING_CP(enc, "CP949", 949);
- ENC_MACHING_CP(enc, "EUC-JP", 20932);
- ENC_MACHING_CP(enc, "EUC-KR", 51949);
- ENC_MACHING_CP(enc, "EUC-TW", 51950);
- ENC_MACHING_CP(enc, "GB18030", 54936);
- ENC_MACHING_CP(enc, "GB2312", 51936);
- ENC_MACHING_CP(enc, "GBK", 936);
- ENC_MACHING_CP(enc, "IBM437", 437);
- ENC_MACHING_CP(enc, "IBM737", 737);
- ENC_MACHING_CP(enc, "IBM775", 775);
- ENC_MACHING_CP(enc, "IBM852", 852);
- ENC_MACHING_CP(enc, "IBM855", 855);
- ENC_MACHING_CP(enc, "IBM857", 857);
- ENC_MACHING_CP(enc, "IBM860", 860);
- ENC_MACHING_CP(enc, "IBM861", 861);
- ENC_MACHING_CP(enc, "IBM862", 862);
- ENC_MACHING_CP(enc, "IBM863", 863);
- ENC_MACHING_CP(enc, "IBM864", 864);
- ENC_MACHING_CP(enc, "IBM865", 865);
- ENC_MACHING_CP(enc, "IBM866", 866);
- ENC_MACHING_CP(enc, "IBM869", 869);
- ENC_MACHING_CP(enc, "ISO-2022-JP", 50220);
- ENC_MACHING_CP(enc, "ISO-8859-1", 28591);
- ENC_MACHING_CP(enc, "ISO-8859-15", 28605);
- ENC_MACHING_CP(enc, "ISO-8859-2", 28592);
- ENC_MACHING_CP(enc, "ISO-8859-3", 28593);
- ENC_MACHING_CP(enc, "ISO-8859-4", 28594);
- ENC_MACHING_CP(enc, "ISO-8859-5", 28595);
- ENC_MACHING_CP(enc, "ISO-8859-6", 28596);
- ENC_MACHING_CP(enc, "ISO-8859-7", 28597);
- ENC_MACHING_CP(enc, "ISO-8859-8", 28598);
- ENC_MACHING_CP(enc, "ISO-8859-9", 28599);
- ENC_MACHING_CP(enc, "KOI8-R", 20866);
- ENC_MACHING_CP(enc, "KOI8-U", 21866);
- ENC_MACHING_CP(enc, "Shift_JIS", 932);
- ENC_MACHING_CP(enc, "UTF-16BE", 1201);
- ENC_MACHING_CP(enc, "UTF-16LE", 1200);
- ENC_MACHING_CP(enc, "UTF-7", 65000);
- ENC_MACHING_CP(enc, "UTF-8", 65001);
- ENC_MACHING_CP(enc, "Windows-1250", 1250);
- ENC_MACHING_CP(enc, "Windows-1251", 1251);
- ENC_MACHING_CP(enc, "Windows-1252", 1252);
- ENC_MACHING_CP(enc, "Windows-1253", 1253);
- ENC_MACHING_CP(enc, "Windows-1254", 1254);
- ENC_MACHING_CP(enc, "Windows-1255", 1255);
- ENC_MACHING_CP(enc, "Windows-1256", 1256);
- ENC_MACHING_CP(enc, "Windows-1257", 1257);
- ENC_MACHING_CP(enc, "Windows-1258", 1258);
- ENC_MACHING_CP(enc, "Windows-31J", 932);
- ENC_MACHING_CP(enc, "Windows-874", 874);
- ENC_MACHING_CP(enc, "eucJP-ms", 20932);
- return CP_ACP;
- }
- static void
- failed_load_conv51932(void)
- {
- rb_raise(eWIN32OLERuntimeError, "fail to load convert function for CP51932");
- }
- #ifndef pIMultiLanguage
- static void
- load_conv_function51932(void)
- {
- HRESULT hr = E_NOINTERFACE;
- void *p;
- if (!pIMultiLanguage) {
- #if defined(HAVE_TYPE_IMULTILANGUAGE2)
- hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
- &IID_IMultiLanguage2, &p);
- #elif defined(HAVE_TYPE_IMULTILANGUAGE)
- hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
- &IID_IMultiLanguage, &p);
- #endif
- if (FAILED(hr)) {
- failed_load_conv51932();
- }
- pIMultiLanguage = p;
- }
- }
- #else
- #define load_conv_function51932() failed_load_conv51932()
- #endif
- #define conv_51932(cp) ((cp) == 51932 && (load_conv_function51932(), 1))
- static void
- set_ole_codepage(UINT cp)
- {
- if (code_page_installed(cp)) {
- cWIN32OLE_cp = cp;
- } else {
- switch(cp) {
- case CP_ACP:
- case CP_OEMCP:
- case CP_MACCP:
- case CP_THREAD_ACP:
- case CP_SYMBOL:
- case CP_UTF7:
- case CP_UTF8:
- cWIN32OLE_cp = cp;
- break;
- case 51932:
- cWIN32OLE_cp = cp;
- load_conv_function51932();
- break;
- default:
- rb_raise(eWIN32OLERuntimeError, "codepage should be WIN32OLE::CP_ACP, WIN32OLE::CP_OEMCP, WIN32OLE::CP_MACCP, WIN32OLE::CP_THREAD_ACP, WIN32OLE::CP_SYMBOL, WIN32OLE::CP_UTF7, WIN32OLE::CP_UTF8, or installed codepage.");
- break;
- }
- }
- cWIN32OLE_enc = ole_cp2encoding(cWIN32OLE_cp);
- }
- static UINT
- ole_init_cp(void)
- {
- UINT cp;
- rb_encoding *encdef;
- encdef = rb_default_internal_encoding();
- if (!encdef) {
- encdef = rb_default_external_encoding();
- }
- cp = ole_encoding2cp(encdef);
- set_ole_codepage(cp);
- return cp;
- }
- struct myCPINFOEX {
- UINT MaxCharSize;
- BYTE DefaultChar[2];
- BYTE LeadByte[12];
- WCHAR UnicodeDefaultChar;
- UINT CodePage;
- char CodePageName[MAX_PATH];
- };
- static rb_encoding *
- ole_cp2encoding(UINT cp)
- {
- static BOOL (*pGetCPInfoEx)(UINT, DWORD, struct myCPINFOEX *) = NULL;
- struct myCPINFOEX* buf;
- VALUE enc_name;
- char *enc_cstr;
- int idx;
- if (!code_page_installed(cp)) {
- switch(cp) {
- case CP_ACP:
- cp = GetACP();
- break;
- case CP_OEMCP:
- cp = GetOEMCP();
- break;
- case CP_MACCP:
- case CP_THREAD_ACP:
- if (!pGetCPInfoEx) {
- pGetCPInfoEx = (BOOL (*)(UINT, DWORD, struct myCPINFOEX *))
- GetProcAddress(GetModuleHandle("kernel32"), "GetCPInfoEx");
- if (!pGetCPInfoEx) {
- pGetCPInfoEx = (void*)-1;
- }
- }
- buf = ALLOCA_N(struct myCPINFOEX, 1);
- ZeroMemory(buf, sizeof(struct myCPINFOEX));
- if (pGetCPInfoEx == (void*)-1 || !pGetCPInfoEx(cp, 0, buf)) {
- rb_raise(eWIN32OLERuntimeError, "cannot map codepage to encoding.");
- break; /* never reach here */
- }
- cp = buf->CodePage;
- break;
- case CP_SYMBOL:
- case CP_UTF7:
- case CP_UTF8:
- break;
- case 51932:
- load_conv_function51932();
- break;
- default:
- rb_raise(eWIN32OLERuntimeError, "codepage should be WIN32OLE::CP_ACP, WIN32OLE::CP_OEMCP, WIN32OLE::CP_MACCP, WIN32OLE::CP_THREAD_ACP, WIN32OLE::CP_SYMBOL, WIN32OLE::CP_UTF7, WIN32OLE::CP_UTF8, or installed codepage.");
- break;
- }
- }
- enc_name = rb_sprintf("CP%d", cp);
- idx = rb_enc_find_index(enc_cstr = StringValueCStr(enc_name));
- if (idx < 0)
- idx = rb_define_dummy_encoding(enc_cstr);
- return rb_enc_from_index(idx);
- }
- static char *
- ole_wc2mb(LPWSTR pw)
- {
- LPSTR pm;
- int size = 0;
- if (conv_51932(cWIN32OLE_cp)) {
- #ifndef pIMultiLanguage
- DWORD dw = 0;
- HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringFromUnicode(pIMultiLanguage,
- &dw, cWIN32OLE_cp, pw, NULL, NULL, &size);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
- }
- pm = ALLOC_N(char, size + 1);
- hr = pIMultiLanguage->lpVtbl->ConvertStringFromUnicode(pIMultiLanguage,
- &dw, cWIN32OLE_cp, pw, NULL, pm, &size);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
- }
- pm[size] = '\0';
- #endif
- return pm;
- }
- size = WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, NULL, 0, NULL, NULL);
- if (size) {
- pm = ALLOC_N(char, size + 1);
- WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, pm, size, NULL, NULL);
- pm[size] = '\0';
- }
- else {
- pm = ALLOC_N(char, 1);
- *pm = '\0';
- }
- return pm;
- }
- static VALUE
- ole_hresult2msg(HRESULT hr)
- {
- VALUE msg = Qnil;
- char *p_msg = NULL;
- char *term = NULL;
- DWORD dwCount;
- char strhr[100];
- sprintf(strhr, " HRESULT error code:0x%08x\n ", (unsigned)hr);
- msg = rb_str_new2(strhr);
- dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, hr, cWIN32OLE_lcid,
- (LPTSTR)&p_msg, 0, NULL);
- if (dwCount > 0) {
- term = p_msg + strlen(p_msg);
- while (p_msg < term) {
- term--;
- if (*term == '\r' || *term == '\n')
- *term = '\0';
- else break;
- }
- if (p_msg[0] != '\0') {
- rb_str_cat2(msg, p_msg);
- }
- }
- LocalFree(p_msg);
- return msg;
- }
- static void
- ole_freeexceptinfo(EXCEPINFO *pExInfo)
- {
- SysFreeString(pExInfo->bstrDescription);
- SysFreeString(pExInfo->bstrSource);
- SysFreeString(pExInfo->bstrHelpFile);
- }
- static VALUE
- ole_excepinfo2msg(EXCEPINFO *pExInfo)
- {
- char error_code[40];
- char *pSource = NULL;
- char *pDescription = NULL;
- VALUE error_msg;
- if(pExInfo->pfnDeferredFillIn != NULL) {
- (*pExInfo->pfnDeferredFillIn)(pExInfo);
- }
- if (pExInfo->bstrSource != NULL) {
- pSource = ole_wc2mb(pExInfo->bstrSource);
- }
- if (pExInfo->bstrDescription != NULL) {
- pDescription = ole_wc2mb(pExInfo->bstrDescription);
- }
- if(pExInfo->wCode == 0) {
- sprintf(error_code, "\n OLE error code:%lX in ", pExInfo->scode);
- }
- else{
- sprintf(error_code, "\n OLE error code:%u in ", pExInfo->wCode);
- }
- error_msg = rb_str_new2(error_code);
- if(pSource != NULL) {
- rb_str_cat(error_msg, pSource, strlen(pSource));
- }
- else {
- rb_str_cat(error_msg, "<Unknown>", 9);
- }
- rb_str_cat2(error_msg, "\n ");
- if(pDescription != NULL) {
- rb_str_cat2(error_msg, pDescription);
- }
- else {
- rb_str_cat2(error_msg, "<No Description>");
- }
- if(pSource) free(pSource);
- if(pDescription) free(pDescription);
- ole_freeexceptinfo(pExInfo);
- return error_msg;
- }
- static void
- ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...)
- {
- va_list args;
- char buf[BUFSIZ];
- VALUE err_msg;
- va_init_list(args, fmt);
- vsnprintf(buf, BUFSIZ, fmt, args);
- va_end(args);
- err_msg = ole_hresult2msg(hr);
- if(err_msg != Qnil) {
- rb_raise(ecs, "%s\n%s", buf, StringValuePtr(err_msg));
- }
- else {
- rb_raise(ecs, "%s", buf);
- }
- }
- void
- ole_uninitialize()
- {
- OleUninitialize();
- g_ole_initialized = FALSE;
- }
- static void
- ole_initialize()
- {
- HRESULT hr;
-
- if(g_ole_initialized == FALSE) {
- hr = OleInitialize(NULL);
- if(FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "fail: OLE initialize");
- }
- g_ole_initialized = TRUE;
- /*
- * In some situation, OleUninitialize does not work fine. ;-<
- */
- /*
- atexit((void (*)(void))ole_uninitialize);
- */
- hr = CoRegisterMessageFilter(&imessage_filter, &previous_filter);
- if(FAILED(hr)) {
- previous_filter = NULL;
- ole_raise(hr, rb_eRuntimeError, "fail: install OLE MessageFilter");
- }
- }
- }
- static void
- ole_msg_loop() {
- MSG msg;
- while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- static void
- ole_free(struct oledata *pole)
- {
- OLE_FREE(pole->pDispatch);
- free(pole);
- }
- static void
- oletypelib_free(struct oletypelibdata *poletypelib)
- {
- OLE_FREE(poletypelib->pTypeLib);
- free(poletypelib);
- }
- static void
- oletype_free(struct oletypedata *poletype)
- {
- OLE_FREE(poletype->pTypeInfo);
- free(poletype);
- }
- static void
- olemethod_free(struct olemethoddata *polemethod)
- {
- OLE_FREE(polemethod->pTypeInfo);
- OLE_FREE(polemethod->pOwnerTypeInfo);
- free(polemethod);
- }
- static void
- olevariable_free(struct olevariabledata *polevar)
- {
- OLE_FREE(polevar->pTypeInfo);
- free(polevar);
- }
- static void
- oleparam_free(struct oleparamdata *pole)
- {
- OLE_FREE(pole->pTypeInfo);
- free(pole);
- }
- static LPWSTR
- ole_vstr2wc(VALUE vstr)
- {
- rb_encoding *enc;
- int cp;
- int size = 0;
- LPWSTR pw;
- st_data_t data;
- enc = rb_enc_get(vstr);
- if (st_lookup(enc2cp_table, (st_data_t)enc, &data)) {
- cp = data;
- } else {
- cp = ole_encoding2cp(enc);
- if (code_page_installed(cp) ||
- cp == CP_ACP ||
- cp == CP_OEMCP ||
- cp == CP_MACCP ||
- cp == CP_THREAD_ACP ||
- cp == CP_SYMBOL ||
- cp == CP_UTF7 ||
- cp == CP_UTF8 ||
- cp == 51932) {
- st_insert(enc2cp_table, (st_data_t)enc, (st_data_t)cp);
- } else {
- rb_raise(eWIN32OLERuntimeError, "not installed Windows codepage(%d) according to `%s'", cp, rb_enc_name(enc));
- }
- }
- if (conv_51932(cp)) {
- #ifndef pIMultiLanguage
- DWORD dw = 0;
- int len = RSTRING_LEN(vstr);
- HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
- &dw, cp, RSTRING_PTR(vstr), &len, NULL, &size);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
- }
- pw = SysAllocStringLen(NULL, size);
- len = RSTRING_LEN(vstr);
- hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
- &dw, cp, RSTRING_PTR(vstr), &len, pw, &size);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
- }
- #endif
- return pw;
- }
- size = MultiByteToWideChar(cp, 0, RSTRING_PTR(vstr), RSTRING_LEN(vstr), NULL, 0);
- pw = SysAllocStringLen(NULL, size);
- MultiByteToWideChar(cp, 0, RSTRING_PTR(vstr), RSTRING_LEN(vstr), pw, size);
- return pw;
- }
- static LPWSTR
- ole_mb2wc(char *pm, int len)
- {
- int size = 0;
- LPWSTR pw;
- if (conv_51932(cWIN32OLE_cp)) {
- #ifndef pIMultiLanguage
- DWORD dw = 0;
- int n = len;
- HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
- &dw, cWIN32OLE_cp, pm, &n, NULL, &size);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cWIN32OLE_cp);
- }
- pw = SysAllocStringLen(NULL, size);
- hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
- &dw, cWIN32OLE_cp, pm, &n, pw, &size);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cWIN32OLE_cp);
- }
- #endif
- return pw;
- }
- size = MultiByteToWideChar(cWIN32OLE_cp, 0, pm, len, NULL, 0);
- pw = SysAllocStringLen(NULL, size - 1);
- MultiByteToWideChar(cWIN32OLE_cp, 0, pm, len, pw, size);
- return pw;
- }
- static VALUE
- ole_wc2vstr(LPWSTR pw, BOOL isfree)
- {
- char *p = ole_wc2mb(pw);
- VALUE vstr = rb_enc_str_new(p, strlen(p), cWIN32OLE_enc);
- if(isfree)
- SysFreeString(pw);
- free(p);
- return vstr;
- }
- static VALUE
- ole_ary_m_entry(VALUE val, long *pid)
- {
- VALUE obj = Qnil;
- int i = 0;
- obj = val;
- while(TYPE(obj) == T_ARRAY) {
- obj = rb_ary_entry(obj, pid[i]);
- i++;
- }
- return obj;
- }
- static void *
- get_ptr_of_variant(VARIANT *pvar)
- {
- switch(V_VT(pvar)) {
- case VT_UI1:
- return &V_UI1(pvar);
- break;
- case VT_I2:
- return &V_I2(pvar);
- break;
- case VT_UI2:
- return &V_UI2(pvar);
- break;
- case VT_I4:
- return &V_I4(pvar);
- break;
- case VT_UI4:
- return &V_UI4(pvar);
- break;
- case VT_R4:
- return &V_R4(pvar);
- break;
- case VT_R8:
- return &V_R8(pvar);
- break;
- #if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
- case VT_I8:
- return &V_I8(pvar);
- break;
- case VT_UI8:
- return &V_UI8(pvar);
- break;
- #endif
- case VT_INT:
- return &V_INT(pvar);
- break;
- case VT_UINT:
- return &V_UINT(pvar);
- break;
- case VT_CY:
- return &V_CY(pvar);
- break;
- case VT_DATE:
- return &V_DATE(pvar);
- break;
- case VT_BSTR:
- return V_BSTR(pvar);
- break;
- case VT_DISPATCH:
- return V_DISPATCH(pvar);
- break;
- case VT_ERROR:
- return &V_ERROR(pvar);
- break;
- case VT_BOOL:
- return &V_BOOL(pvar);
- break;
- case VT_UNKNOWN:
- return V_UNKNOWN(pvar);
- break;
- case VT_ARRAY:
- return &V_ARRAY(pvar);
- break;
- default:
- return NULL;
- break;
- }
- }
- static VALUE
- is_all_index_under(long *pid, long *pub, long dim)
- {
- long i = 0;
- for (i = 0; i < dim; i++) {
- if (pid[i] > pub[i]) {
- return Qfalse;
- }
- }
- return Qtrue;
- }
- static void
- ole_set_safe_array(long n, SAFEARRAY *psa, long *pid, long *pub, VALUE val, long dim, VARTYPE vt)
- {
- VALUE val1;
- HRESULT hr = S_OK;
- VARIANT var;
- VOID *p = NULL;
- long i = n;
- while(i >= 0) {
- val1 = ole_ary_m_entry(val, pid);
- VariantInit(&var);
- p = val2variant_ptr(val1, &var, vt);
- if (is_all_index_under(pid, pub, dim) == Qtrue) {
- if ((V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL) ||
- (V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL)) {
- rb_raise(eWIN32OLERuntimeError, "element of array does not have IDispatch or IUnknown Interface");
- }
- hr = SafeArrayPutElement(psa, pid, p);
- }
- if (FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "failed to SafeArrayPutElement");
- }
- pid[i] += 1;
- if (pid[i] > pub[i]) {
- pid[i] = 0;
- i -= 1;
- } else {
- i = dim - 1;
- }
- }
- }
- static long
- dimension(VALUE val) {
- long dim = 0;
- long dim1 = 0;
- long len = 0;
- long i = 0;
- if (TYPE(val) == T_ARRAY) {
- len = RARRAY_LEN(val);
- for (i = 0; i < len; i++) {
- dim1 = dimension(rb_ary_entry(val, i));
- if (dim < dim1) {
- dim = dim1;
- }
- }
- dim += 1;
- }
- return dim;
- }
- static long
- ary_len_of_dim(VALUE ary, long dim) {
- long ary_len = 0;
- long ary_len1 = 0;
- long len = 0;
- long i = 0;
- VALUE val;
- if (dim == 0) {
- if (TYPE(ary) == T_ARRAY) {
- ary_len = RARRAY_LEN(ary);
- }
- } else {
- if (TYPE(ary) == T_ARRAY) {
- …
Large files files are truncated, but you can click here to view the full file