summaryrefslogtreecommitdiff
path: root/ext/win32ole/win32ole.c
diff options
context:
space:
mode:
authorsuke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-09-01 08:14:11 +0000
committersuke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-09-01 08:14:11 +0000
commit674f0aa4782afec2748900c601f9288e56a91bae (patch)
tree306884d62fd77076d903d8f6be610d6377ba8791 /ext/win32ole/win32ole.c
parent4c3dc77fe6b53331dc4573d3d313fa9554a3155f (diff)
win32ole.c(fole_each) : ensure to release IEnumVARIANT interface.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2776 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/win32ole/win32ole.c')
-rw-r--r--ext/win32ole/win32ole.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c
index 5d6e96e32f..d34cf854ec 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;
}