[原创] 修正com.ibm.rcp.activex不能打开中文路径bug

[原创] 修正com.ibm.rcp.activex不能打开中文路径bug

IBM Container for ActiveX Documents - Eclipse Version

但是我发现如果使用它打开含有中文名称的文档,就会抛异常,看了它的代码,发现

JNIEXPORT jint JNICALL Java_com_ibm_rcp_activex_ActivexDocumentWidget_createControl
    (JNIEnv 
*  env, jclass that, jint hwndParent, jstring filename, jstring progid, jint hwndShell,
    jintArray fileMenu, jintArray containerMenu, jintArray windowMenu,
    jint indexHelpMenu, jstring helpMenuItemPrefix)
{
    ADD_TO_TRACE();
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    
if  (NULL  ==  progid)
    {
        
return   0 ;
    }

    
const   char   *  lpszProgid  =  env -> GetStringUTFChars(progid,  0 );

    
const   char   *  lpszFileName  =  NULL;

    
if  (NULL  !=  filename)
    {
        lpszFileName 
=  env -> GetStringUTFChars(filename,  0 );
    }

这样会引发jni的字符乱码问题,在参考了《〈Java与C之间通过JNI传递中文字符串〉》的解决方案后
做了如下的改写:
char *  jstringToWindows( JNIEnv  * env, jstring jstr );


if  (NULL  !=  filename)
    {
        lpszFileName 
=  jstringToWindows( env, filename );
        
// lpszFileName = env->GetStringUTFChars(filename, 0);
    }


char *  jstringToWindows(JNIEnv *  env,jstring jstr)
{
    
int  length = (env) -> GetStringLength(jstr);
    
const  jchar *  jcstr = (env) -> GetStringChars(jstr, 0 );
    
char *  rtn = ( char * )malloc(length * 2 + 1 );
    
int  size = 0 ;
    size
= WideCharToMultiByte(CP_ACP, 0 ,(LPCWSTR)jcstr,length,rtn,(length * 2 + 1 ),NULL,NULL);
    
if (size <= 0 )
    
return  NULL;
    (env)
-> ReleaseStringChars(jstr,jcstr);
    rtn[size]
= 0 ;
    
return  rtn;
}

成功编译后,可以正常使用了。


你可能感兴趣的:([原创] 修正com.ibm.rcp.activex不能打开中文路径bug)