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);