快速业务通道

集成Windows本地应用到Eclipse RCP程序中 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
些步骤之后就可以运行这个程序:java HelloWorld,运行的结果就是在控制台输出字符串“HelloWorld”。

实现窗口 Reparent

前面部分介绍了如何使用 JNI,接下来介绍如何通过 JNI 启动一个 Windows 的本地应用程序并且将其主窗口设置为指定窗口的子窗口。首先创建一个 Java 类,如下面的清单所示:

public class ReparentUtil {   static{   System.loadLibrary("reparent")}   }   public static native int startAndReparent(int parentWnd,         String command,String wndClass)} }

其中 System.loadLibrary("reparent") 是用来加载名为 reparent 的动态库,我们会在这个动态库中具体实现方法 startAndReparent(…)。

startAndReparent 定义方法来启动 Windows 程序,并且将其窗口 reparent 到我们指定的窗口。其中:

int parentWnd: 父窗口句柄

String command:Windows 程序启动命令

String wndClass:Windows 程序主窗口类型

由于有的程序启动后会创建多个顶级窗口,所以我们在这里要指定一个主窗口类型来区分不同的顶级窗口。这个方法是一个本地方法,我们会用 C++ 生成为一个叫 reparent.dll 的动态库,这个方法即存在于这个动态库中。

这个 Java 函数对应的的 C++ 函数是 Java_com_reparent_ReparentUtil_startAndReparent(JNIEnv *env, jclass classobj, jint parent, jstring command, jstring wndClass), 这个函数主要实现两部分的功能:

启动 Windows 应用程序;

获取 Windows 应用程序的主窗口句柄;

将 Windows 应用主窗口设置成指定窗口的子窗口。

集成Windows本地应用到Eclipse RCP程序中(3)

时间:2011-02-15 IBM 梁骞 李辉

启动 Windows 应用程序

下面我们来看看启动 Windows 应用程序的实现. 我们先将函数传入的 Java 字符串参数转化成 C 字符串。这个过程主要通过 GetStringChars() 来实现。

JNIEXPORT jint JNICALL Java_com_reparent_ReparentUtil_startAndReparent     (JNIEnv *env, jclass classobj, jint parent, jstring command,             jstring wndClass){   jboolean isCopy=FALSE}   PROCESS_INFORMATION  pInfo}   STARTUPINFO          sInfo}   int hParentWnd}   jsize len = ( *env ).GetStringLength(command)}   const jchar *commandstr = (*env).GetStringChars(command,&isCopy)}   const jchar *wndClassStr = NULL}   char commandcstr[200]}   int size = 0}   size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)commandstr,    len, commandcstr,(len*2+1), NULL, NULL )}   (*env).ReleaseStringChars(command, commandstr)}   if(size==0){   return 0}   }   commandcstr[size] = 0}   if(wndClass!=NULL){   wndClassStr = (*env).GetStringChars(wndClass,&isCopy)}   if(wndClassStr!=NULL){    len = (*env).GetStringLength(wndClass)}    size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)wndClassStr,     len, wndClassName,(len*2+1), NULL, NULL )}    wndClassName[size] = 0}    (*env).ReleaseStringChars(wndClass, wndClassStr)}   }   }

接着,我们使用 Windows 的 API:CreateProcess 函数来启动我们要集成的应用程序。

sInfo.cb           =  sizeof(STARTUPINFO)}    sInfo.lpReserved       =  NULL}    sInfo.lpReserved2      =  NULL}    sInfo.cbReserved2      =  0}    sIn

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号