在现代软件开发中,有时需要在Java应用程序中嵌入ActiveX控件,以实现特定的功能。本文将介绍如何在Java应用程序中嵌入Internet Explorer 5.0,就像嵌入任何其他Java控件一样。要实现这一点,需要解决两个主要问题。
要解决的第一个问题是获取Java重组件的窗口句柄(HWND)。这个问题可以通过Sun公司所有版本的JDK中的未公开API来解决,例如JDK 1.1.8、JDK 1.2.2和JDK 1.3。下面是一个URL,它解释了如何获取java.awt.Canvas对象的HWND,并提供了项目中实现的摘录。
public int getHWND() {
int hwnd = 0;
DrawingSurfaceInfo drawingSurfaceInfo = ((DrawingSurface)(getPeer())).getDrawingSurfaceInfo();
if (null != drawingSurfaceInfo) {
drawingSurfaceInfo.lock();
Win32DrawingSurface win32DrawingSurface = (Win32DrawingSurface)drawingSurfaceInfo.getSurface();
hwnd = win32DrawingSurface.getHWnd();
drawingSurfaceInfo.unlock();
}
return hwnd;
}
这段代码展示了如何获取一个面板的HWND。这是一个hack,它在JDK1.1.8、JDK1.2.2和JDK1.3中有效,但这是未公开的。此外,应该在调用addNotify之后调用这个方法。
第二个问题稍微复杂一些,但MSDN的在线知识库在解决这个问题上提供了很大帮助。下面是一个URL,它解释了如何使用ATL将ActiveX控件作为任何HWND的子控件添加,并提供了项目中实现的概念摘录。
VOID CreateIEControl(ThreadParam *pThreadParam) {
AtlAxWinInit();
printf("Create AtlAxWin Begin...[0x%x][%s]\n", pThreadParam->hwnd, pThreadParam->szURL);
HWND hwndChild = ::CreateWindow(
"AtlAxWin",
"Shell.Explorer.1",
WS_CHILD|WS_VISIBLE,
0,
0,
0,
0,
pThreadParam->hwnd,NULL,
::GetModuleHandle(NULL),
NULL);
IUnknown *pUnk = NULL;
AtlAxGetControl(hwndChild, &pUnk);
printf("Create AtlAxWin Done...[0x%x]\n", pUnk);
CComPtr spBrowser;
pUnk->QueryInterface(IID_IWebBrowser2, (void**)&spBrowser);
if (spBrowser) {
CComVariant ve;
CComVariant vurl(pThreadParam->szURL);
spBrowser->put_Visible(VARIANT_TRUE);
spBrowser->Navigate2(&vurl, &ve, &ve, &ve, &ve);
}
}
这段代码创建了一个IE控件。在第二个参数中,可以使用任何ActiveX控件的ProgID或UUID。然后,它创建了一个子窗口,并获取了一个接口来设置URL。
要构建项目,请编辑并使用可下载的Zip文件中的Build.BAT。