diff options
author | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-15 13:05:01 +0000 |
---|---|---|
committer | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-15 13:05:01 +0000 |
commit | adc2c7ae753cf54715a64dda36398ea6c06b9e80 (patch) | |
tree | 52a58a2ee92fea1f2c7061e5a54fd73fabed69b0 /ext/win32ole | |
parent | d91c2f1d7199c6f7eb9bd523cfb2f5f9f7eea7a2 (diff) | |
download | ruby-adc2c7ae753cf54715a64dda36398ea6c06b9e80.tar.gz ruby-adc2c7ae753cf54715a64dda36398ea6c06b9e80.tar.xz ruby-adc2c7ae753cf54715a64dda36398ea6c06b9e80.zip |
ext/win32ole/win32ole.c(ole_invoke): retry after converting Qnil
to VT_EMPTY.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@8333 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/win32ole')
-rw-r--r-- | ext/win32ole/win32ole.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 6f44ea894..8202d92e6 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -79,7 +79,7 @@ #define WC2VSTR(x) ole_wc2vstr((x), TRUE) -#define WIN32OLE_VERSION "0.6.3" +#define WIN32OLE_VERSION "0.6.4" typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); @@ -156,6 +156,7 @@ static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL; static VALUE com_hash; static IDispatchVtbl com_vtbl; static UINT cWIN32OLE_cp = CP_ACP; +static VARTYPE g_nil_to = VT_ERROR; struct oledata { IDispatch *pDispatch; @@ -834,8 +835,12 @@ ole_val2variant(val, var) V_BOOL(var) = VARIANT_FALSE; break; case T_NIL: - V_VT(var) = VT_ERROR; - V_ERROR(var) = DISP_E_PARAMNOTFOUND; + if (g_nil_to == VT_ERROR) { + V_VT(var) = VT_ERROR; + V_ERROR(var) = DISP_E_PARAMNOTFOUND; + }else { + V_VT(var) = VT_EMPTY; + } break; default: V_VT(var) = VT_DISPATCH; @@ -844,6 +849,16 @@ ole_val2variant(val, var) } } +static void +ole_val2variant2(val, var) + VALUE val; + VARIANT *var; +{ + g_nil_to = VT_EMPTY; + ole_val2variant(val, var); + g_nil_to = VT_ERROR; +} + static VALUE ole_set_member(self, dispatch) VALUE self; @@ -2103,6 +2118,28 @@ ole_invoke(argc, argv, self, wFlags) VariantClear(&op.dp.rgvarg[n]); } } + + if (FAILED(hr)) { + /* retry after converting nil to VT_EMPTY */ + if (op.dp.cArgs > cNamedArgs) { + for(i = cNamedArgs; i < op.dp.cArgs; i++) { + n = op.dp.cArgs - i + cNamedArgs - 1; + param = rb_ary_entry(paramS, i-cNamedArgs); + ole_val2variant2(param, &op.dp.rgvarg[n]); + } + memset(&excepinfo, 0, sizeof(EXCEPINFO)); + VariantInit(&result); + hr = pole->pDispatch->lpVtbl->Invoke(pole->pDispatch, DispID, + &IID_NULL, lcid, wFlags, + &op.dp, &result, + &excepinfo, &argErr); + for(i = cNamedArgs; i < op.dp.cArgs; i++) { + n = op.dp.cArgs - i + cNamedArgs - 1; + VariantClear(&op.dp.rgvarg[n]); + } + } + } + /* mega kludge. if a method in WORD is called and we ask * for a result when one is not returned then * hResult == DISP_E_EXCEPTION. this only happens on |