From 5482b745d8f2991b8ab621571cea0873199692c2 Mon Sep 17 00:00:00 2001 From: clay_shooter Date: Mon, 13 Feb 2006 04:43:04 +0000 Subject: [PATCH] 1224219 added unicode support to SafeArray.fromStringArray. Closed memory leak in SafeArray.getString --- docs/ReleaseNotes.html | 8 ++++++++ jni/Dispatch.cpp | 5 +++++ jni/DispatchEvents.cpp | 9 +++++++-- jni/SafeArray.cpp | 16 ++++++++++++---- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/docs/ReleaseNotes.html b/docs/ReleaseNotes.html index 5e1192c..d2e8cfa 100644 --- a/docs/ReleaseNotes.html +++ b/docs/ReleaseNotes.html @@ -52,6 +52,14 @@ Removed Variant serializable interface because it is not actually serializable on 2000/xp(pre1) + + 1224219 + Memory leak in SafeArray.GetString()(pre3) + + + 1224219 + Change from UTF to UNICODE SafeArray.fromStringArray()(pre3) +     diff --git a/jni/Dispatch.cpp b/jni/Dispatch.cpp index bceee72..40b9766 100644 --- a/jni/Dispatch.cpp +++ b/jni/Dispatch.cpp @@ -55,6 +55,7 @@ JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface // get the current IDispatch IDispatch *pIDispatch = extractDispatch(env, _this); if (!pIDispatch) return NULL; + // if we used env->GetStringChars() would that let us drop the conversion? const char *siid = env->GetStringUTFChars(_iid, NULL); USES_CONVERSION; LPOLESTR bsIID = A2W(siid); @@ -95,6 +96,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstanceNative jclass clazz = env->GetObjectClass(_this); jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); + // if we used env->GetStringChars() would that let us drop the conversion? const char *progid = env->GetStringUTFChars(_progid, NULL); CLSID clsid; HRESULT hr; @@ -161,6 +163,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_getActiveInstanceNative jclass clazz = env->GetObjectClass(_this); jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); + // if we used env->GetStringChars() would that let us drop the conversion? const char *progid = env->GetStringUTFChars(_progid, NULL); CLSID clsid; HRESULT hr; @@ -203,6 +206,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_coCreateInstanceNative jclass clazz = env->GetObjectClass(_this); jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); + // if we used env->GetStringChars() would that let us drop the conversion? const char *progid = env->GetStringUTFChars(_progid, NULL); CLSID clsid; HRESULT hr; @@ -275,6 +279,7 @@ JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames { USES_CONVERSION; jstring s = (jstring)env->GetObjectArrayElement(names, i); + // if we used env->GetStringChars() would that let us drop the conversion? const char *nm = env->GetStringUTFChars(s, NULL); LPOLESTR nmos = A2W(nm); env->ReleaseStringUTFChars(s, nm); diff --git a/jni/DispatchEvents.cpp b/jni/DispatchEvents.cpp index 54ad882..0605b02 100644 --- a/jni/DispatchEvents.cpp +++ b/jni/DispatchEvents.cpp @@ -81,16 +81,21 @@ JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init3 BSTR typeLib = NULL; if (_typelib != NULL){ + // why is this UTF instead of unicode? Then we could probably drop the A2W const char *typelib = env->GetStringUTFChars(_typelib, NULL); typeLib = A2W(typelib); + // should we call env->ReleaseStringUTFChars(,) to free the memory like we do everywhere lese? + //printf("we have a type lib %ls\n",typeLib); } // find progid if any LPOLESTR bsProgId = NULL; - if (_progid!=NULL) { - const char *progid = env->GetStringUTFChars(_progid, NULL); + if (_progid!=NULL) { + // why is this UTF instead of unicode? Then we could probably drop the A2W + const char *progid = env->GetStringUTFChars(_progid, NULL); bsProgId = A2W(progid); + // should we call env->ReleaseStringUTFChars(,) to free the memory like we do everywhere lese? //printf("we have an applicaton %ls\n",bsProgId); } diff --git a/jni/SafeArray.cpp b/jni/SafeArray.cpp index 050290f..661df53 100644 --- a/jni/SafeArray.cpp +++ b/jni/SafeArray.cpp @@ -558,24 +558,26 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray V_VT(&v) = VT_BSTR; for(int i=0;iGetObjectArrayElement(a, i); - const char *str = env->GetStringUTFChars(s, NULL); + // jacob report 1224219 should use unicode and not UTF-8 (Variant modified in previous report + const jchar *str = env->GetStringChars(s, NULL); CComBSTR bs(str); V_VT(&v) = VT_BSTR; V_BSTR(&v) = bs.Copy(); long x = i; SafeArrayPutElement(psa,&x,&v); - env->ReleaseStringUTFChars(s, str); + env->ReleaseStringChars(s, str); VariantClear(&v); } } else if (vt == VT_BSTR) { for(int i=0;iGetObjectArrayElement(a, i); - const char *str = env->GetStringUTFChars(s, NULL); + // jacob report 1224219 should use unicode and not UTF-8 (Variant modified in previous report + const jchar *str = env->GetStringChars(s, NULL); CComBSTR bs(str); BSTR bstr = bs.Detach(); long x = i; SafeArrayPutElement(psa,&x,bstr); - env->ReleaseStringUTFChars(s, str); + env->ReleaseStringChars(s, str); } } else { ThrowComFail(env, "safearray cannot be assigned from string\n", 0); @@ -1613,11 +1615,17 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I } BSTR bs = V_BSTR(&v); jstring js = env->NewString(bs, SysStringLen(bs)); + // jacob report 1224219 + // SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm + VariantClear(&v); return js; } else if (vt == VT_BSTR) { BSTR bs = NULL; SafeArrayGetElement(psa, &idx, &bs); jstring js = env->NewString(bs, SysStringLen(bs)); + // jacob report 1224219 + // SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm + if (bs) free(bs); return js; } ThrowComFail(env, "safearray cannot get string", 0);