在Java应用程序中嵌入ActiveX控件

在现代软件开发中,有时需要在Java应用程序中嵌入ActiveX控件,以实现特定的功能。本文将介绍如何在Java应用程序中嵌入Internet Explorer 5.0,就像嵌入任何其他Java控件一样。要实现这一点,需要解决两个主要问题。

问题 #1 - 获取Java重组件的HWND

要解决的第一个问题是获取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之后调用这个方法。

问题 #2 - 如何将ActiveX控件附加为HWND的子控件

第二个问题稍微复杂一些,但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。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485