SF 1689061 compiler changes to support later versions of VCC and also a big memcpy fix in Variants for currency

This commit is contained in:
clay_shooter
2007-03-29 02:52:08 +00:00
parent 2d08b9e43a
commit fcbae0a84f
5 changed files with 59 additions and 45 deletions

View File

@@ -51,6 +51,10 @@
<td width="13%" valign="top">1687419</td> <td width="13%" valign="top">1687419</td>
<td width="87%" valign="top">(prelease 3) Corrected calls to AttachCurrentThread in EventProxy</td> <td width="87%" valign="top">(prelease 3) Corrected calls to AttachCurrentThread in EventProxy</td>
</tr> </tr>
<tr>
<td width="13%" valign="top">1689061 </td>
<td width="87%" valign="top">(prelease 4) C code changes to fix VC2003 compiler warnings.</td>
</tr>
<tr> <tr>
<td width="13%" valign="top">&nbsp;</td> <td width="13%" valign="top">&nbsp;</td>
<td width="87%" valign="top">&nbsp;</td> <td width="87%" valign="top">&nbsp;</td>
@@ -81,6 +85,13 @@
<td width="87%" valign="top"><em>Identified 1.11.1</em> Process affinity may have to be set on <td width="87%" valign="top"><em>Identified 1.11.1</em> Process affinity may have to be set on
dual core machines to avoid com exceptions.</td> dual core machines to avoid com exceptions.</td>
</tr> </tr>
<tr>
<td width="13%" valign="top">no ticket</td>
<td width="87%" valign="top"><em>Identified 1.11.1</em> Versions of JDK 1.5 prior to 1.5_10 are known to leak JNI handles.
See the Sun bug tracking system http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6399321 for more details.
</td>
</tr>
</table> </table>
<!-- --------- --> <!-- --------- -->

View File

@@ -322,7 +322,7 @@ static char* BasicToCharString(const BSTR inBasicString)
size_t len = ::wcstombs(charString, inBasicString, charStrSize); size_t len = ::wcstombs(charString, inBasicString, charStrSize);
} }
else else
charString = ::strdup(""); charString = ::_strdup("");
return charString; return charString;
} }
@@ -334,7 +334,7 @@ static char* CreateErrorMsgFromResult(HRESULT inResult)
FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL, FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL); SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL);
if (msg == NULL) if (msg == NULL)
msg = ::strdup("An unknown COM error has occured."); msg = ::_strdup("An unknown COM error has occured.");
return msg; return msg;
} }
@@ -473,13 +473,13 @@ JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev
{ {
jint *uAE = env->GetIntArrayElements(uArgErr, NULL); jint *uAE = env->GetIntArrayElements(uArgErr, NULL);
hr = pIDispatch->Invoke(dispID,IID_NULL, hr = pIDispatch->Invoke(dispID,IID_NULL,
lcid,wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE); lcid,(WORD)wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE); // SF 1689061
env->ReleaseIntArrayElements(uArgErr, uAE, 0); env->ReleaseIntArrayElements(uArgErr, uAE, 0);
} }
else else
{ {
hr = pIDispatch->Invoke(dispID,IID_NULL, hr = pIDispatch->Invoke(dispID,IID_NULL,
lcid,wFlags,&dispparams,v,&excepInfo, NULL); lcid,(WORD)wFlags,&dispparams,v,&excepInfo, NULL); // SF 1689061
} }
if (num_args) if (num_args)
{ {
@@ -514,7 +514,7 @@ JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev
} else { } else {
dispIdAsName = new char[256]; dispIdAsName = new char[256];
// get the id string // get the id string
itoa (dispID,dispIdAsName,10); _itoa (dispID,dispIdAsName,10);
//continue on mostly as before //continue on mostly as before
buf = CreateErrorMsgFromInfo(hr,&excepInfo,dispIdAsName); buf = CreateErrorMsgFromInfo(hr,&excepInfo,dispIdAsName);
} }

View File

@@ -67,11 +67,11 @@ EventProxy::~EventProxy()
if (vmConnectionStatus == JNI_EDETACHED){ if (vmConnectionStatus == JNI_EDETACHED){
//printf("Unhook: Attaching to current thread using JNI Version 1.2 (%d)\n",vmConnectionStatus); //printf("Unhook: Attaching to current thread using JNI Version 1.2 (%d)\n",vmConnectionStatus);
JavaVMAttachArgs attachmentArgs; JavaVMAttachArgs attachmentArgs;
attachmentArgs.version = JNI_VERSION_1_2; attachmentArgs.version = JNI_VERSION_1_2;
attachmentArgs.name = NULL; attachmentArgs.name = NULL;
attachmentArgs.group = NULL; attachmentArgs.group = NULL;
jvm->AttachCurrentThread((void **)&env, &attachmentArgs); jvm->AttachCurrentThread((void **)&env, &attachmentArgs);
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
} else { } else {
// should really look for JNI_OK versus an error // should really look for JNI_OK versus an error
// started method hooked so no need to attach again // started method hooked so no need to attach again
@@ -144,17 +144,17 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
// attach to the current running thread // attach to the current running thread
//printf("Invoke: Attaching to current thread using JNI Version 1.2\n"); //printf("Invoke: Attaching to current thread using JNI Version 1.2\n");
JavaVMAttachArgs attachmentArgs; JavaVMAttachArgs attachmentArgs;
attachmentArgs.version = JNI_VERSION_1_2; attachmentArgs.version = JNI_VERSION_1_2;
attachmentArgs.name = NULL; attachmentArgs.name = NULL;
attachmentArgs.group = NULL; attachmentArgs.group = NULL;
jvm->AttachCurrentThread((void **)&env, &attachmentArgs); jvm->AttachCurrentThread((void **)&env, &attachmentArgs);
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
if (!eventMethodName) if (!eventMethodName)
{ {
// user did not implement this method // user did not implement this method
//printf("Invoke: didn't find method name\n"); // printf("Invoke: didn't find method name\n");
ThrowComFail(env, "Event method received was not defined as part of callback interface", -1); ThrowComFail(env, "Event method received was not defined as part of callback interface", -1);
// should we detatch before returning?? The old code didn't but I don't see why not. // should we detatch before returning?? The old code didn't but I don't see why not.
@@ -179,7 +179,7 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
//printf("Invoke: Made Variant\n"); //printf("Invoke: Made Variant\n");
jclass variantClass = env->GetObjectClass(aVariantObj); jclass variantClass = env->GetObjectClass(aVariantObj);
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
// create the variant parameter array // create the variant parameter array
// how many params // how many params
@@ -200,7 +200,7 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
VariantCopy(va, &pDispParams->rgvarg[i]); VariantCopy(va, &pDispParams->rgvarg[i]);
// put it in the array // put it in the array
env->SetObjectArrayElement(varr, j, arg); env->SetObjectArrayElement(varr, j, arg);
env->DeleteLocalRef(arg); env->DeleteLocalRef(arg);
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
} }
//printf("Invoke: Filled Array\n"); //printf("Invoke: Filled Array\n");
@@ -215,6 +215,8 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
} }
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
// don't need the first variant we created to get the class // don't need the first variant we created to get the class
// SF 1689061 change not accepted but put in as comment for later reminder
//Java_com_jacob_com_Variant_release(env, aVariantObj);
env->DeleteLocalRef(aVariantObj); env->DeleteLocalRef(aVariantObj);
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();}
@@ -225,17 +227,19 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
VARIANT *java = extractVariant(env, arg); VARIANT *java = extractVariant(env, arg);
VARIANT *com = &pDispParams->rgvarg[i]; VARIANT *com = &pDispParams->rgvarg[i];
convertJavaVariant(java, com); convertJavaVariant(java, com);
// SF 1689061 change not accepted but put in as comment for later reminder
//Java_com_jacob_com_Variant_release(env, arg);
zeroVariant(env, arg); zeroVariant(env, arg);
env->DeleteLocalRef(arg); env->DeleteLocalRef(arg);
} }
// End code from Jiffie team that copies parameters back from java to COM // End code from Jiffie team that copies parameters back from java to COM
// detach from thread // detach from thread
//printf("Invoke: Detatching\n"); //printf("Invoke: Detatching\n");
jvm->DetachCurrentThread(); jvm->DetachCurrentThread();
//fflush(stdout); //fflush(stdout);
return S_OK; return S_OK;
} }
return E_NOINTERFACE; return E_NOINTERFACE;
} }
void EventProxy::convertJavaVariant(VARIANT *java, VARIANT *com) { void EventProxy::convertJavaVariant(VARIANT *java, VARIANT *com) {
@@ -854,4 +858,3 @@ void EventProxy::convertJavaVariant(VARIANT *java, VARIANT *com) {
} }
} }

View File

@@ -562,7 +562,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray
// GetStringUTFChars() replaced with GetStringChars() // GetStringUTFChars() replaced with GetStringChars()
// (Variant modified in previous report) // (Variant modified in previous report)
const jchar *str = env->GetStringChars(s, NULL); const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs(str); CComBSTR bs((LPCOLESTR)str); // SR cast SF 1689061
V_VT(&v) = VT_BSTR; V_VT(&v) = VT_BSTR;
V_BSTR(&v) = bs.Copy(); V_BSTR(&v) = bs.Copy();
long x = i; long x = i;
@@ -577,7 +577,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray
// GetStringUTFChars() replaced with GetStringChars() // GetStringUTFChars() replaced with GetStringChars()
// (Variant modified in previous report) // (Variant modified in previous report)
const jchar *str = env->GetStringChars(s, NULL); const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs(str); CComBSTR bs((LPCOLESTR)str); // SR cast SF 1689061
BSTR bstr = bs.Detach(); BSTR bstr = bs.Detach();
long x = i; long x = i;
SafeArrayPutElement(psa,&x,bstr); SafeArrayPutElement(psa,&x,bstr);
@@ -962,7 +962,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray
return NULL; return NULL;
} }
BSTR bs = V_BSTR(&v); BSTR bs = V_BSTR(&v);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
env->SetObjectArrayElement(iarr, i, js); env->SetObjectArrayElement(iarr, i, js);
} }
return iarr; return iarr;
@@ -973,7 +973,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray
BSTR bs = NULL; BSTR bs = NULL;
long ix = i; long ix = i;
SafeArrayGetElement(sa, &ix, (void*) &bs); SafeArrayGetElement(sa, &ix, (void*) &bs);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
env->SetObjectArrayElement(iarr, i, js); env->SetObjectArrayElement(iarr, i, js);
} }
return iarr; return iarr;
@@ -1618,7 +1618,7 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I
return NULL; return NULL;
} }
BSTR bs = V_BSTR(&v); BSTR bs = V_BSTR(&v);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
// jacob report 1224219 // jacob report 1224219
// SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm // SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm
VariantClear(&v); VariantClear(&v);
@@ -1626,7 +1626,7 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I
} else if (vt == VT_BSTR) { } else if (vt == VT_BSTR) {
BSTR bs = NULL; BSTR bs = NULL;
SafeArrayGetElement(psa, &idx, &bs); SafeArrayGetElement(psa, &idx, &bs);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
// jacob report 1224219 // jacob report 1224219
// SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm // SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm
if (bs) SysFreeString(bs); if (bs) SysFreeString(bs);
@@ -1660,13 +1660,13 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II
return NULL; return NULL;
} }
BSTR bs = V_BSTR(&v); BSTR bs = V_BSTR(&v);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
return js; return js;
} else if (vt == VT_BSTR) { } else if (vt == VT_BSTR) {
long idx[2] = {i, j}; long idx[2] = {i, j};
BSTR bs = NULL; BSTR bs = NULL;
SafeArrayGetElement(psa, idx, &bs); SafeArrayGetElement(psa, idx, &bs);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
return js; return js;
} }
ThrowComFail(env, "safearray cannot get string", 0); ThrowComFail(env, "safearray cannot get string", 0);
@@ -1783,7 +1783,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings
return; return;
} }
BSTR bs = V_BSTR(&v); BSTR bs = V_BSTR(&v);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
env->SetObjectArrayElement(ja, j, js); env->SetObjectArrayElement(ja, j, js);
VariantClear(&v); VariantClear(&v);
} }
@@ -1795,7 +1795,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings
{ {
long ix = i; long ix = i;
SafeArrayGetElement(sa, &ix, (void*) &bs); SafeArrayGetElement(sa, &ix, (void*) &bs);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
env->SetObjectArrayElement(ja, j, js); env->SetObjectArrayElement(ja, j, js);
} }
} else { } else {
@@ -2751,12 +2751,12 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString___3I
return NULL; return NULL;
} }
BSTR bs = V_BSTR(&v); BSTR bs = V_BSTR(&v);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
return js; return js;
} else if (vt == VT_BSTR) { } else if (vt == VT_BSTR) {
BSTR bs = NULL; BSTR bs = NULL;
SafeArrayGetElement(psa, jIndices, &bs); SafeArrayGetElement(psa, jIndices, &bs);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061
return js; return js;
} }
ThrowComFail(env, "safearray cannot get string", 0); ThrowComFail(env, "safearray cannot get string", 0);

View File

@@ -87,7 +87,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init
* Method: zeroVariant * Method: zeroVariant
* Signature: ()V * Signature: ()V
* *
* This should only be used on variant objects created by teh * This should only be used on variant objects created by the
* com layer as part of a call through EventProxy. * com layer as part of a call through EventProxy.
* This zeros out the variant pointer in the Variant object * This zeros out the variant pointer in the Variant object
* so that the calling COM program can free the memory. * so that the calling COM program can free the memory.
@@ -272,7 +272,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantStringRef
// Unicode string (no terminating NULL) provided by GetStringChars // Unicode string (no terminating NULL) provided by GetStringChars
const jsize numChars = env->GetStringLength(s); const jsize numChars = env->GetStringLength(s);
//CComBSTR bs(cStr); //CComBSTR bs(cStr);
CComBSTR bs( numChars, cStr ); CComBSTR bs( numChars, (LPCOLESTR)cStr ); // SR cast SF 1689061
BSTR *pbs = (BSTR *)CoTaskMemAlloc(sizeof(BSTR)); BSTR *pbs = (BSTR *)CoTaskMemAlloc(sizeof(BSTR));
bs.CopyTo(pbs); bs.CopyTo(pbs);
@@ -367,7 +367,7 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getVariantStringRef
return NULL; return NULL;
} }
BSTR *bs = V_BSTRREF(v); BSTR *bs = V_BSTRREF(v);
jstring js = env->NewString(*bs, SysStringLen(*bs)); jstring js = env->NewString((jchar*)*bs, SysStringLen(*bs)); // SR cast SF 1689061
return js; return js;
} }
return NULL; return NULL;
@@ -656,7 +656,7 @@ JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantCurrency
CY cy; CY cy;
cy = V_CY(v); cy = V_CY(v);
jlong jl; jlong jl;
memcpy(&jl, &cy, 64); memcpy(&jl, &cy, 8); // was 64. should be sizeof(x) SF 1689061
return jl; return jl;
} }
return NULL; return NULL;
@@ -683,7 +683,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantCurrencyRef
if (v) { if (v) {
VariantClear(v); // whatever was there before VariantClear(v); // whatever was there before
CY *pf = (CY *)CoTaskMemAlloc(sizeof(CY)); CY *pf = (CY *)CoTaskMemAlloc(sizeof(CY));
memcpy(pf, &cur, 64); memcpy(pf, &cur, 8); // was 64. should be sizeof(x) SF 1689061
V_VT(v) = VT_BYREF|VT_CY; V_VT(v) = VT_BYREF|VT_CY;
V_CYREF(v) = pf; V_CYREF(v) = pf;
} }
@@ -739,7 +739,7 @@ JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getVariantString
return NULL; return NULL;
} }
BSTR bs = V_BSTR(v); BSTR bs = V_BSTR(v);
jstring js = env->NewString(bs, SysStringLen(bs)); jstring js = env->NewString((jchar*)bs, SysStringLen(bs));// SR cast SF 1689061
return js; return js;
} }
return NULL; return NULL;
@@ -762,7 +762,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantString
// Unicode string (no terminating NULL) provided by GetStringChars // Unicode string (no terminating NULL) provided by GetStringChars
const jsize numChars = env->GetStringLength(s); const jsize numChars = env->GetStringLength(s);
//CComBSTR bs(cStr); //CComBSTR bs(cStr);
CComBSTR bs( numChars, cStr ); CComBSTR bs( numChars, (LPCOLESTR)cStr ); // SR cast SF 1689061
V_VT(v) = VT_BSTR; V_VT(v) = VT_BSTR;
V_BSTR(v) = bs.Copy(); V_BSTR(v) = bs.Copy();
@@ -795,7 +795,7 @@ JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantCurrencyRef
CY *cy; CY *cy;
cy = V_CYREF(v); cy = V_CYREF(v);
jlong jl; jlong jl;
memcpy(&jl, cy, 64); memcpy(&jl, cy, 8); // was 64. should be sizeof(x) SF 1689061
return jl; return jl;
} }
return NULL; return NULL;