在Jcom中增加对COM错误信息的支持
在我们的一个项目中,使用了jcom来访问com,jcom可以从http://www.sourceforge.net/projects/jcom中获得,对基于IDispatch的开发提供了较好的支持。
美中不足的是,jcom中没有将com的异常信息完整的抛出到java中,这在java开发时会感觉到很不方便,无法快捷的进行错误的定位。由于是opensource的软件,因此,很容易自己加入这样的一个特性。
原来以为是很简单的事情,但还是搞了好几个小时,主要是对COM的BSTR等数据类型的处理比较生疏,而JNI方法:ThrowException (env, jclassid, char *message)则要求传入的是一个UTF8的字符串,因此,在这里的处理显得比较陌生,但最后还是成功的解决了。
// message 是原来的错误信息,不包括exception等信息
char * tmp_p = message + strlen(message);
// BSTR bstrSource;
//BSTR bstrDescription;
// excepInfo 现在已经作为一个全局的变量,在InvokeHelper中会进行设置。
_bstr_t bstrSource = excepInfo.bstrSource;
_bstr_t bstrDescription = excepInfo.bstrDescription;
_bstr_t msg = message;
msg = msg + excepInfo.bstrSource;
msg = msg + excepInfo.bstrDescription;
// 我们通过BSTR2jstring首先把msg转变成java字符串,然后再转变为UTF8
jstring jsMsg = BSTR2jstring(env, msg);
const char *utf8 = env->GetStringUTFChars(jsMsg, NULL);
//sprintf(tmp_p, " Source=%s Description=%s", (char*)bstrSource2, (char*)bstrDescription2);
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
env->ThrowNew(clsJComException, utf8);
// 记得要释放资源。
env->ReleaseStringUTFChars(jsMsg, utf8);
return NULL;
0 Comments:
张贴评论
<< Home