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 | 49d22df5bac49cef90757a9bb3acc387c82529b5 (patch) | |
| tree | 6f975f31dcfcccd9b6255746f3749639e0376ec8 | |
| parent | 21005de8af73d7aa6100f13d80d26958a44c754a (diff) | |
| download | ruby-49d22df5bac49cef90757a9bb3acc387c82529b5.tar.gz ruby-49d22df5bac49cef90757a9bb3acc387c82529b5.tar.xz ruby-49d22df5bac49cef90757a9bb3acc387c82529b5.zip | |
* 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: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@8295 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
| -rw-r--r-- | ChangeLog | 8 | ||||
| -rw-r--r-- | ext/win32ole/tests/testWIN32OLE.rb | 2 | ||||
| -rw-r--r-- | ext/win32ole/win32ole.c | 44 |
3 files changed, 50 insertions, 4 deletions
@@ -1,3 +1,11 @@ +Sun Apr 10 10:12:42 2005 Masaki Suketa <masaki.suketa@nifty.ne.jp> + + * 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". + Sat Apr 9 18:20:31 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp> * ext/tk/lib/tk/image.rb: support to create TkImage object without diff --git a/ext/win32ole/tests/testWIN32OLE.rb b/ext/win32ole/tests/testWIN32OLE.rb index d8c3b6e6b..3603475d2 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 5f0779978..a652c5491 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 |
