diff options
author | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-10 01:15:41 +0000 |
---|---|---|
committer | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-10 01:15:41 +0000 |
commit | 9e3f4f591faf603e6de8bb2d2afafb0b4a75d58e (patch) | |
tree | 6f975f31dcfcccd9b6255746f3749639e0376ec8 /ext/win32ole | |
parent | 69ee9c2cd1b0d967a59d54fd3c0e4b5fe66b4d3a (diff) |
* ext/win32ole/win32ole.c(ole_invoke): retry after converting Qnil
to VT_EMPTY.
* ext/win32ole/win32ole/tests/testWIN32OLE.rb: correct error
message string "Unknown" => "unknown".
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8295 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/win32ole')
-rw-r--r-- | ext/win32ole/tests/testWIN32OLE.rb | 2 | ||||
-rw-r--r-- | ext/win32ole/win32ole.c | 44 |
2 files changed, 42 insertions, 4 deletions
diff --git a/ext/win32ole/tests/testWIN32OLE.rb b/ext/win32ole/tests/testWIN32OLE.rb index d8c3b6e6ba..3603475d22 100644 --- a/ext/win32ole/tests/testWIN32OLE.rb +++ b/ext/win32ole/tests/testWIN32OLE.rb @@ -40,7 +40,7 @@ class TestWin32OLE < RUNIT::TestCase exc = assert_exception(WIN32OLERuntimeError) { WIN32OLE.new("{000}") } - assert_match(/Unknown OLE server: `\{000\}'/, exc.message) + assert_match(/unknown OLE server: `\{000\}'/, exc.message) end def test_s_connect excel2 = WIN32OLE.connect('Excel.Application') diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 5f07799785..a652c54915 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -78,7 +78,7 @@ #define WC2VSTR(x) ole_wc2vstr((x), TRUE) -#define WIN32OLE_VERSION "0.5.9" +#define WIN32OLE_VERSION "0.6.0" typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); @@ -154,6 +154,8 @@ static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL; static VALUE com_hash; static IDispatchVtbl com_vtbl; +static VARTYPE g_nil_to = VT_ERROR; + struct oledata { IDispatch *pDispatch; }; @@ -831,8 +833,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; @@ -841,6 +847,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; @@ -1087,6 +1103,7 @@ ole_variant2val(pvar) return obj; } + static LONG reg_open_key(hkey, name, phkey) HKEY hkey; const char *name; @@ -1986,6 +2003,27 @@ 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 |