diff options
author | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-09-01 08:14:11 +0000 |
---|---|---|
committer | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-09-01 08:14:11 +0000 |
commit | 69f1862e953e20e7b477478012d50b88c8fdd048 (patch) | |
tree | 306884d62fd77076d903d8f6be610d6377ba8791 /ext | |
parent | d0bdd598b3104bbad7b16fccd9c47d1c50a47bed (diff) | |
download | ruby-69f1862e953e20e7b477478012d50b88c8fdd048.tar.gz ruby-69f1862e953e20e7b477478012d50b88c8fdd048.tar.xz ruby-69f1862e953e20e7b477478012d50b88c8fdd048.zip |
win32ole.c(fole_each) : ensure to release IEnumVARIANT interface.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@2776 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/win32ole/win32ole.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 5d6e96e32..d34cf854e 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -2208,6 +2208,32 @@ fole_free(self) return Qnil; } +static VALUE +ole_each_sub(pEnumV) + VALUE pEnumV; +{ + VARIANT variant; + VALUE obj = Qnil; + IEnumVARIANT *pEnum = (IEnumVARIANT *)pEnumV; + VariantInit(&variant); + while(pEnum->lpVtbl->Next(pEnum, 1, &variant, NULL) == S_OK) { + obj = ole_variant2val(&variant); + VariantClear(&variant); + VariantInit(&variant); + rb_yield(obj); + } + return Qnil; +} + +static VALUE +ole_ienum_free(pEnumV) + VALUE pEnumV; +{ + IEnumVARIANT *pEnum = (IEnumVARIANT *)pEnumV; + OLE_RELEASE(pEnum); + return Qnil; +} + /* * WIN32OLE#each {|i|...} * ----- @@ -2224,12 +2250,10 @@ fole_each(self) unsigned int argErr; EXCEPINFO excepinfo; DISPPARAMS dispParams; - VARIANT result, variant; + VARIANT result; HRESULT hr; IEnumVARIANT *pEnum = NULL; - VALUE obj; - VariantInit(&result); dispParams.rgvarg = NULL; dispParams.rgdispidNamedArgs = NULL; @@ -2262,15 +2286,8 @@ fole_each(self) ole_raise(hr, rb_eRuntimeError, "Fail to get IEnum Interface"); } - VariantInit(&variant); - while(pEnum->lpVtbl->Next(pEnum, 1, &variant, NULL) == S_OK) { - obj = ole_variant2val(&variant); - rb_yield(obj); - VariantClear(&variant); - VariantInit(&variant); - } VariantClear(&result); - OLE_RELEASE(pEnum); + rb_ensure(ole_each_sub, (VALUE)pEnum, ole_ienum_free, (VALUE)pEnum); return Qnil; } |