mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/win32ole/win32ole.c(ole_val2olevariantdata): support VT_VARIANT in
WIN32OLE_VARIANT.new(). * ext/win32ole/tests/testOLEVARIANT.rb: ditto. * ext/win32ole/tests/testOLEPARAM.rb: test method name should not be duplicated. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10032 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7e69ffb1b6
commit
88ea87db21
4 changed files with 221 additions and 23 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
Sun Mar 12 17:02:10 2006 Masaki Suketa <masaki.suketa@nifty.ne.jp>
|
||||||
|
|
||||||
|
* ext/win32ole/win32ole.c(ole_val2olevariantdata): support VT_VARIANT in
|
||||||
|
WIN32OLE_VARIANT.new().
|
||||||
|
|
||||||
|
* ext/win32ole/tests/testOLEVARIANT.rb: ditto.
|
||||||
|
|
||||||
|
* ext/win32ole/tests/testOLEPARAM.rb: test method name should not be
|
||||||
|
duplicated.
|
||||||
|
|
||||||
Sun Mar 5 18:40:58 2006 Minero Aoki <aamine@loveruby.net>
|
Sun Mar 5 18:40:58 2006 Minero Aoki <aamine@loveruby.net>
|
||||||
|
|
||||||
* lib/fileutils.rb: do not repeat command options.
|
* lib/fileutils.rb: do not repeat command options.
|
||||||
|
|
|
@ -62,7 +62,7 @@ class TestOLEPARAM < RUNIT::TestCase
|
||||||
f = methods.find {|m| m.name == 'SaveAs'}
|
f = methods.find {|m| m.name == 'SaveAs'}
|
||||||
assert(f.params[0].optional?)
|
assert(f.params[0].optional?)
|
||||||
end
|
end
|
||||||
def test_ole_type_detail
|
def test_ole_type_detail2
|
||||||
classes = WIN32OLE_TYPE.ole_classes(MS_EXCEL_TYPELIB)
|
classes = WIN32OLE_TYPE.ole_classes(MS_EXCEL_TYPELIB)
|
||||||
methods = classes.find {|c| c.name == 'Worksheet'}.ole_methods
|
methods = classes.find {|c| c.name == 'Worksheet'}.ole_methods
|
||||||
f = methods.find {|m| m.name == 'SaveAs'}
|
f = methods.find {|m| m.name == 'SaveAs'}
|
||||||
|
|
|
@ -71,4 +71,9 @@ class TestWIN32OLE_VARIANT < Test::Unit::TestCase
|
||||||
assert_equal("10000", obj.value)
|
assert_equal("10000", obj.value)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_create_vt_array
|
||||||
|
obj = WIN32OLE_VARIANT.new([1.2, 2.3], WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_R8)
|
||||||
|
assert_equal([1.2, 2.3], obj.value)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
|
|
||||||
#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
|
#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
|
||||||
|
|
||||||
#define WIN32OLE_VERSION "0.7.0"
|
#define WIN32OLE_VERSION "0.7.1"
|
||||||
|
|
||||||
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
|
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
|
||||||
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
|
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
|
||||||
|
@ -743,12 +743,127 @@ ole_set_safe_array(n, psa, pid, pub, val, dim)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void * get_ptr_of_variant(pvar)
|
||||||
|
VARIANT *pvar;
|
||||||
|
{
|
||||||
|
switch(V_VT(pvar)) {
|
||||||
|
case VT_UI1:
|
||||||
|
return &V_UI1(pvar);
|
||||||
|
break;
|
||||||
|
case VT_I2:
|
||||||
|
return &V_I2(pvar);
|
||||||
|
break;
|
||||||
|
case VT_I4:
|
||||||
|
return &V_I4(pvar);
|
||||||
|
break;
|
||||||
|
case VT_UI4:
|
||||||
|
return &V_UI4(pvar);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case VT_I8:
|
||||||
|
return &V_I8(pvar);
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
case VT_R4:
|
||||||
|
return &V_R4(pvar);
|
||||||
|
break;
|
||||||
|
case VT_R8:
|
||||||
|
return &V_R8(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_VARIANT:
|
||||||
|
return &V_VARIANT(pvar);
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
case VT_UNKNOWN:
|
||||||
|
return &V_UNKNOWN(pvar);
|
||||||
|
break;
|
||||||
|
case VT_ARRAY:
|
||||||
|
return &V_ARRAY(pvar);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ole_set_safe_array_with_type(n, psa, pid, pub, val, dim, vtype)
|
||||||
|
long n;
|
||||||
|
SAFEARRAY *psa;
|
||||||
|
long *pid;
|
||||||
|
long *pub;
|
||||||
|
VALUE val;
|
||||||
|
long dim;
|
||||||
|
VARTYPE vtype;
|
||||||
|
|
||||||
|
{
|
||||||
|
VALUE val1;
|
||||||
|
HRESULT hr;
|
||||||
|
VARIANT var;
|
||||||
|
VARIANT vart;
|
||||||
|
VOID *p = NULL;
|
||||||
|
VariantInit(&var);
|
||||||
|
VariantInit(&vart);
|
||||||
|
if(n < 0) return;
|
||||||
|
if(n == dim) {
|
||||||
|
val1 = ole_ary_m_entry(val, pid);
|
||||||
|
ole_val2variant(val1, &var);
|
||||||
|
VariantInit(&vart);
|
||||||
|
if (vtype != V_VT(&var)) {
|
||||||
|
hr = VariantChangeTypeEx(&vart, &var,
|
||||||
|
LOCALE_SYSTEM_DEFAULT, 0, (VARTYPE)(vtype & ~VT_BYREF));
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
ole_raise(hr, rb_eRuntimeError, "failed to change type");
|
||||||
|
}
|
||||||
|
p = get_ptr_of_variant(&vart);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
p = get_ptr_of_variant(&var);
|
||||||
|
}
|
||||||
|
if (p == NULL) {
|
||||||
|
rb_raise(rb_eRuntimeError, "failed to get ponter of variant");
|
||||||
|
}
|
||||||
|
hr = SafeArrayPutElement(psa, pid, p);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
ole_raise(hr, rb_eRuntimeError, "failed to SafeArrayPutElement");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pid[n] += 1;
|
||||||
|
if (pid[n] < pub[n]) {
|
||||||
|
ole_set_safe_array_with_type(dim, psa, pid, pub, val, dim, vtype);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pid[n] = 0;
|
||||||
|
ole_set_safe_array_with_type(n-1, psa, pid, pub, val, dim, vtype);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ole_val2variant(val, var)
|
ole_val2variant(val, var)
|
||||||
VALUE val;
|
VALUE val;
|
||||||
VARIANT *var;
|
VARIANT *var;
|
||||||
{
|
{
|
||||||
struct oledata *pole;
|
struct oledata *pole;
|
||||||
|
struct olevariantdata *pvar;
|
||||||
if(rb_obj_is_kind_of(val, cWIN32OLE)) {
|
if(rb_obj_is_kind_of(val, cWIN32OLE)) {
|
||||||
Data_Get_Struct(val, struct oledata, pole);
|
Data_Get_Struct(val, struct oledata, pole);
|
||||||
OLE_ADDREF(pole->pDispatch);
|
OLE_ADDREF(pole->pDispatch);
|
||||||
|
@ -756,6 +871,13 @@ ole_val2variant(val, var)
|
||||||
V_DISPATCH(var) = pole->pDispatch;
|
V_DISPATCH(var) = pole->pDispatch;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rb_obj_is_kind_of(val, cWIN32OLE_VARIANT)) {
|
||||||
|
Data_Get_Struct(val, struct olevariantdata, pvar);
|
||||||
|
VariantCopy(var, &(pvar->var));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (rb_obj_is_kind_of(val, rb_cTime)) {
|
if (rb_obj_is_kind_of(val, rb_cTime)) {
|
||||||
V_VT(var) = VT_DATE;
|
V_VT(var) = VT_DATE;
|
||||||
V_DATE(var) = time_object2date(val);
|
V_DATE(var) = time_object2date(val);
|
||||||
|
@ -1002,6 +1124,65 @@ ole_val2olevariantdata(val, vtype, pvar)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
VARIANT var;
|
VARIANT var;
|
||||||
|
if (vtype & VT_ARRAY) {
|
||||||
|
VALUE val1;
|
||||||
|
long dim = 0;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
HRESULT hr;
|
||||||
|
SAFEARRAYBOUND *psab = NULL;
|
||||||
|
SAFEARRAY *psa = NULL;
|
||||||
|
long *pub, *pid;
|
||||||
|
|
||||||
|
val1 = val;
|
||||||
|
while(TYPE(val1) == T_ARRAY) {
|
||||||
|
val1 = rb_ary_entry(val1, 0);
|
||||||
|
dim += 1;
|
||||||
|
}
|
||||||
|
psab = ALLOC_N(SAFEARRAYBOUND, dim);
|
||||||
|
pub = ALLOC_N(long, dim);
|
||||||
|
pid = ALLOC_N(long, dim);
|
||||||
|
|
||||||
|
if(!psab || !pub || !pid) {
|
||||||
|
if(pub) free(pub);
|
||||||
|
if(psab) free(psab);
|
||||||
|
if(pid) free(pid);
|
||||||
|
rb_raise(rb_eRuntimeError, "memory allocation error");
|
||||||
|
}
|
||||||
|
val1 = val;
|
||||||
|
i = 0;
|
||||||
|
while(TYPE(val1) == T_ARRAY) {
|
||||||
|
psab[i].cElements = RARRAY(val1)->len;
|
||||||
|
psab[i].lLbound = 0;
|
||||||
|
pub[i] = psab[i].cElements;
|
||||||
|
pid[i] = 0;
|
||||||
|
i ++;
|
||||||
|
val1 = rb_ary_entry(val1, 0);
|
||||||
|
}
|
||||||
|
/* Create and fill VARIANT array */
|
||||||
|
psa = SafeArrayCreate(vtype & VT_TYPEMASK, dim, psab);
|
||||||
|
if (psa == NULL)
|
||||||
|
hr = E_OUTOFMEMORY;
|
||||||
|
else
|
||||||
|
hr = SafeArrayLock(psa);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
ole_set_safe_array_with_type(dim-1, psa, pid, pub, val, dim-1, vtype& VT_TYPEMASK);
|
||||||
|
hr = SafeArrayUnlock(psa);
|
||||||
|
}
|
||||||
|
if(pub) free(pub);
|
||||||
|
if(psab) free(psab);
|
||||||
|
if(pid) free(pid);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
V_VT(&(pvar->realvar)) = vtype;
|
||||||
|
V_ARRAY(&(pvar->realvar)) = psa;
|
||||||
|
hr = VariantCopy(&(pvar->var), &(pvar->realvar));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (psa != NULL)
|
||||||
|
SafeArrayDestroy(psa);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
ole_val2variant(val, &(pvar->realvar));
|
ole_val2variant(val, &(pvar->realvar));
|
||||||
if (vtype & VT_BYREF) {
|
if (vtype & VT_BYREF) {
|
||||||
if ( (vtype & ~VT_BYREF) == V_VT(&(pvar->realvar))) {
|
if ( (vtype & ~VT_BYREF) == V_VT(&(pvar->realvar))) {
|
||||||
|
@ -1025,12 +1206,12 @@ ole_val2olevariantdata(val, vtype, pvar)
|
||||||
LOCALE_SYSTEM_DEFAULT, 0, vtype);
|
LOCALE_SYSTEM_DEFAULT, 0, vtype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ole_raise(hr, rb_eRuntimeError, "failed to change type");
|
ole_raise(hr, rb_eRuntimeError, "failed to change type");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ole_val2variant2(val, var)
|
ole_val2variant2(val, var)
|
||||||
VALUE val;
|
VALUE val;
|
||||||
|
@ -1120,7 +1301,6 @@ ole_variant2val(pvar)
|
||||||
SafeArrayGetLBound(psa, i+1, &pID[i]);
|
SafeArrayGetLBound(psa, i+1, &pID[i]);
|
||||||
SafeArrayGetUBound(psa, i+1, &pUB[i]);
|
SafeArrayGetUBound(psa, i+1, &pUB[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = SafeArrayLock(psa);
|
hr = SafeArrayLock(psa);
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
val2 = rb_ary_new();
|
val2 = rb_ary_new();
|
||||||
|
@ -1128,7 +1308,6 @@ ole_variant2val(pvar)
|
||||||
hr = SafeArrayPtrOfIndex(psa, pID, &V_BYREF(&variant));
|
hr = SafeArrayPtrOfIndex(psa, pID, &V_BYREF(&variant));
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
val = ole_variant2val(&variant);
|
val = ole_variant2val(&variant);
|
||||||
rb_ary_push(val2, val);
|
rb_ary_push(val2, val);
|
||||||
for (i = dim-1 ; i >= 0 ; --i) {
|
for (i = dim-1 ; i >= 0 ; --i) {
|
||||||
|
@ -6713,6 +6892,7 @@ fev_initialize(argc, argv, self)
|
||||||
IEVENTSINKOBJ *pIEV;
|
IEVENTSINKOBJ *pIEV;
|
||||||
DWORD dwCookie;
|
DWORD dwCookie;
|
||||||
struct oleeventdata *poleev;
|
struct oleeventdata *poleev;
|
||||||
|
VALUE events = Qnil;
|
||||||
|
|
||||||
rb_secure(4);
|
rb_secure(4);
|
||||||
rb_scan_args(argc, argv, "11", &ole, &itf);
|
rb_scan_args(argc, argv, "11", &ole, &itf);
|
||||||
|
@ -6775,6 +6955,9 @@ fev_initialize(argc, argv, self)
|
||||||
poleev->freed = 0;
|
poleev->freed = 0;
|
||||||
poleev->pEvent->ptr_freed = &(poleev->freed);
|
poleev->pEvent->ptr_freed = &(poleev->freed);
|
||||||
rb_ary_push(ary_ole_event, self);
|
rb_ary_push(ary_ole_event, self);
|
||||||
|
|
||||||
|
events = rb_ary_new();
|
||||||
|
rb_ivar_set(self, id_events, events);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue