From ebb1eddb69dac47753a921fa7b7295b5719f32e7 Mon Sep 17 00:00:00 2001 From: schmidlinf Date: Thu, 3 Feb 2005 10:27:39 +0000 Subject: [PATCH] [ 1053870 ] jacob-msg 2019 - SafeArray + jni 1.4. Fixed a few problems with safe array manipulation that caused memory leaks. Also applied patch required to build against JMI newer than v1.2 --- jni/EventProxy.cpp | 13 +++++++++++-- jni/SafeArray.cpp | 9 +++++++-- jni/Variant.cpp | 2 +- jni/util.h | 2 ++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/jni/EventProxy.cpp b/jni/EventProxy.cpp index bc75b7b..147b0dd 100644 --- a/jni/EventProxy.cpp +++ b/jni/EventProxy.cpp @@ -80,7 +80,12 @@ EventProxy::~EventProxy() pCP->Unadvise(dwEventCookie); JNIEnv *env; // attach to the current running thread - jvm->AttachCurrentThread((void **)&env, jvm); + #ifdef JNI_VERSION_1_2 + jvm->AttachCurrentThread((void **)&env, jvm); + #else + jvm->AttachCurrentThread((void**)&env, NULL); + #endif + env->DeleteGlobalRef(javaSinkObj); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); } @@ -140,7 +145,11 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid, if (DISPATCH_METHOD & wFlags) { // attach to the current running thread - jvm->AttachCurrentThread((void**)&env, jvm); + #ifdef JNI_VERSION_1_2 + jvm->AttachCurrentThread((void **)&env, jvm); + #else + jvm->AttachCurrentThread((void**)&env, NULL); + #endif // get variant class diff --git a/jni/SafeArray.cpp b/jni/SafeArray.cpp index cea8516..552dccc 100644 --- a/jni/SafeArray.cpp +++ b/jni/SafeArray.cpp @@ -98,13 +98,18 @@ SAFEARRAY *copySA(SAFEARRAY *psa) SafeArrayGetVartype(psa, &vt); VARIANT v1, v2; - VariantClear(&v1); - VariantClear(&v2); + VariantInit(&v1); + VariantInit(&v2); V_VT(&v1) = VT_ARRAY | vt; V_ARRAY(&v1) = psa; VariantCopy(&v2, &v1); SAFEARRAY *sa = V_ARRAY(&v2); VariantInit(&v2); // make sure it's not owned by this variant + + VariantClear(&v2); + VariantInit(&v1); + VariantClear(&v1); + return sa; } diff --git a/jni/Variant.cpp b/jni/Variant.cpp index 4a7d7cd..73d143e 100644 --- a/jni/Variant.cpp +++ b/jni/Variant.cpp @@ -1028,7 +1028,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArray VARTYPE vt; SafeArrayGetVartype(psa, &vt); V_VT(v) = VT_ARRAY | vt; - V_ARRAY(v) = psa; + V_ARRAY(v) = copySA(psa); return; } ThrowComFail(env, "Can't get variant pointer", -1); diff --git a/jni/util.h b/jni/util.h index 2ef9170..e704bca 100644 --- a/jni/util.h +++ b/jni/util.h @@ -5,4 +5,6 @@ extern "C" { IDispatch *extractDispatch(JNIEnv *env, jobject arg); SAFEARRAY *extractSA(JNIEnv *env, jobject arg); void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy); + + SAFEARRAY *copySA(SAFEARRAY *psa) }