首页 » 业界动态 » 使用 Windows CE .NET Internet Explorer ActiveX 控件

使用 Windows CE .NET Internet Explorer ActiveX 控件

作者:  时间:2009-05-19 10:01  来源:52RD嵌入式开发

摘要:展示如何使用 eMbedded Visual C++ 来建立一个主控 Windows CE .NET Internet Explorer ActiveX 控件的 MFC 架构应用程序。 

好的,这个月就让我们来看看经常出现在新闻群组,而且就在上个礼拜左右出现的一个问题。这个问题就是:「我如何在 Windows CE 应用程序内使用 Windows CE Microsoft® Internet Explorer 控件?」更重要的是:「我有看过怎么在 Pocket PC 2002 使用,可是就是没办法用 Windows CE .NET 来操作?」为了解答这个问题,我将利用一些去年在「Windows Embedded 开发人员研讨会」上的程序代码和范例,特别是 eMbedded Microsoft® Visual C++® 实机操作,来稍微作弊一下。该项实机操作的内容是由 Doug Boling,杰出的演说家以及《Programming Windows CE Second Edition》(英文) 一书的作者所写成的。您可以在 http://www.bolingconsulting.com/ (英文) 找到 Doug 的相关信息。

为了充分测试本文中所采用的程序代码,我们需要建立一个自订的操作系统映像。您可以一起跟进,我们将使用仿真器来测试程序代码。预先设定的操作系统映像中附有叫做 STANDARDSDK_410 Emulator 的仿真器。不幸的是,标准的 SDK 仿真映像并不包括 Internet Explorer 应用程序,而且在定义上也不包含 Internet Explorer 控件,这就是为什么我们需要建立自订的操作系统映像的原因。

如果您从来没经历过建立 Windows CE .NET 平台的步骤,此处提供建立我们基础映像的步骤,其中包括 Internet Explorer。 

启动 Platform Builder。 
从 [File (档案)] 菜单,按一下 [New Platform (新增平台)]。 
在 [New Platform Wizard (新增平台向导)] 上按一下 [Next (下一步)]。 
从可用的 BSP 清单中,选取 [EMULATOR: X86],再按 [Next (下一步)]。 
从可用的平台设定清单中,按一下 [Web Pad]。 
在 [Platform Name (平台名称)] 方块中键入 IEViewer 作为您的平台名称,再按 [Next (下一步)]。 
从 [Web Pad Device (Web Pad 装置)] 变量清单中,选取 [Web Pad],再按 [Next (下一步)]。 
在 [Application & Media (应用程序与媒体)] 页上,只选取 [Internet Browser (因特网浏览器)]。停用所有其它的选项 (请注意使用组件目录可以新增任一功能)。按 [Next (下一步)]。 
在 [Networking & Communications (网络与通讯)] 页上,停用 Personal Area Network (PAN) | Bluetooth (请注意这可以随时使用组件目录新增);Wide Area Networking 和 TCP/IPV6,按 [Next (下一步)]。 
在 [Congratulations (恭喜)] 页上,按一下 [Done (完成)],并关闭 [Add Platform Wizard (新增平台向导)]。 
从 [Build (建置)] 菜单,按一下 [Set Active Configuration (设成使用中设定)]。 
从平台设定清单中,选取 [EMULATOR: X86 Win32 (WCE emulator) Release (EMULATOR: X86 Win32 (WCE 仿真器) 版本)],再按 [OK (确定)]。 
现在我们要来建置操作系统映像。在 [Build (建置)] 菜单上,按一下 [Build Platform (建置平台)]。建置程序将需要几分钟时间;一旦完成后,需要为我们的平台建立自订的「软件开发套件」(SDK)。这项程序在去年的 Get Embedded 文章:《Creating a Software Development Kit for Windows CE .NET》(英文) 中有详细说明。

随着平台的建置,SDK 的建立和安装,我们现在可以准备来编写我们的应用程序。我们将使用 eMbedded Visual C++ 4.0 来编写一个主控 Internet Explorer 控件的 Microsoft® Foundation Classes (MFC) 应用程序。

首先,将我们自订的操作系统映像下载到仿真器可能是个不错的主意,接着我们就可以开始建置、下载和测试 MFC 应用程序。在 Platform Builder 的 [Target (目标)] 菜单,按一下 [Download (下载)]。您将被提示要设定目标联机。按下 [OK (确定)],选取 [Emulator (仿真器)] 以进行下载和核心传输,再按 [OK (确定)]。在 [KITL Security Warning (KITL安全性警告)] 按一下 [OK (确定)]。

您可能会怀疑为什么在将操作系统映像下载到仿真器或任何其它 Windows CE .NET 参考板 (Reference Board) 时会收到安全性警告。让我们快速带过这个题外话...

在安全性警告的措词中有暗示,警告对话框的文字如下:「使用 KITL 连接此装置将使该装置可远程访问本机档案系统。」在仿真器中开启我的计算机,您会发现到许多数据夹,其中一个叫做「Release」。如果开启这个数据夹,将会看到好几百个档案,包括 NK.BIN,即您刚刚下载至仿真器的档案。Release 数据夹是桌上型计算机开发环境和目前参考平台之间的共享资料夹。任何我们从 Platform Builder 丢入 _FLATRELEASEDIR (在桌上型计算机上) 的东西都可从仿真器看到 (我们在几个月前的仿真器 WebCam 文章中曾经提到此用法)。「仿真器」桌面有三个图示:资源回收筒、我的计算机和 Internet Explorer。如果您在桌面上有看到这些图示,表示没什么问题。现在,继续回到使用 eMbedded Visual C++ 4.0 编写程序代码的这一步。

启动 eMbedded Visual C++。就桌面而言,此开发环境与 Visual C++ 6.0 非常类似,不过在执行「应用程序向导」时您会发现一些差异。这里是建立应用程序的程序代码草稿所需的步骤, 向导完成后我们将自订应用程序。 

在 [File (档案)] 菜单,按一下 [New (新增)]。这将显示「Application Wizard (应用程序向导)」。您会发现使用此工具只能建立 WCE (Windows CE) 架构的应用程序。 
输入 IEViewer 的应用程序名称。另外,请注意对话框底端的支持处理器清单。由于我们建置的是仿真器,所以应该确认 Win32 Emulator 是处于启用的状态。您可从清单中选择一个以上的处理器。 
选取 [WCE MFC AppWizard (exe)]。我们即将建置 MFC 架构的应用程序。按一下 [OK (确定)]。这将启动 MFC 架构应用程序的「Application Wizard (应用程序向导)」。向导总共有四个步骤: 
应用程序向导步骤 1。使用预设选项:文件检视架构的单一文件。在这里我们可以看到桌面和 Windows CE 应用程序向导之间的主要差异:Windows CE 支持单一文件和对话框架构应用程序,而桌面则还支持 MDI (多重文件接口) 架构应用程序。 
应用程序向导步骤 2。新增 Windows Sockets 和 Microsoft® ActiveX® 控件的支持。 
应用程序向导步骤 3。使用预设选项:批注和共享的 MFC DLL。 
应用程序向导步骤 4。选择检视 (CIEViewerView),并将检视类型从 CView 变更为 CformView。 
按一下 [Finish (完成)]。 
这就建立了程序代码草稿。您可以建置并测试该应用程序。既然我们已经建立新平台 (IEViewer) 和 SDK,我们还需要确定 eMbedded Visual C++ 和执行中的目标之间的联机也没问题。连接至平台的预设选项是 TCP/IP。既然我们从 Platform Builder 已有连至目标的联机,即可从 eMbedded Visual C++ 使用相同的传输。如果没有设定联机就建置和下载应用程序,就会启动仿真器的第二个例项,而这并非理想情况。

若要设定从 eMbedded Visual C++ 的传输,请在 [Tools (工具)] 菜单,按一下 [Configure Platform Manager (设定平台管理员)]。接着找到并展开 IEVIEWER 平台,然后选取 IEVIEWER 仿真器。您接着可以按 [Properties (内容)] 以显示装置内容对话框。将「传输」变更为 [KITL Transport for Windows CE (Windows CE 的 KITL 传输)],并将「起始服务器」变更为 [ CESH Server for Windows CE (Windows CE 的 CESH 服务器)]。按一下 [OK (确定)] 以接受变更。

eMbedded Visual C++ 可使用许多 SDK。在我们的例子中,我们要使用 IEVIEWER SDK。使用建置工具列将平台设定为 IEVIEWER,并将目标设定为 IEVIEWER Emulator。

 图1 eMbedded Visual C++ 建置工具列

现在建置并测试您的应用程序。在 [Build (建置)] 菜单,按一下 [Build IEViewer.exe (建置 IEViewer.exe)]。这将建置和下载该应用程序,也同时会下载 MFC 侦错 Runtime DLL (mfcce400d.dll 和 olece400d.dll)。请注意,MFC Runtime DLL 在 Platform Builder 目录中是以组件的形式存在,所以您可以在建置阶段将 MFC 支持加入平台中。当然也就是 DLL 的发行版本 (mfcce400.dll 和 olece400.dll)。若要关闭应用程序,请在 [File (档案)] 菜单,按一下 [Exit (结束)]。现在加入一些程序代码...

MFC Doc/View (文件/检视) 程序代码草稿为我们建立了很多类别,包括 CAboutDlg、CIEViewerApp、CIEViewerDoc、CIEViewerView 以及 CMainFrame。针对本文的目的,我们将只修改检视。展开 eMbedded Visual C++ 中的 IEViewer 类别,我们将在 View 类别加入几个成员变量,方法很简单,在 [CIEViewerView] 按一下右键并选择 [Add Member Variable (新增成员变量)],如此会显示一个对话框,提示您输入变量类型和变量名称。


图2 新增 IWebBrowser2 成员变数

我们将使用 IWebBrowser2 接口的指针与 Internet Explorer ActiveX 控件进行沟通,除此,还需要第二个成员变量来包含控件窗口。

再次于 CIEViewerView 类别按一下右键,并新增下列成员变数:

Variable Type: CWnd
Variable Name: m_wndBrowser

如果我们在这时建置应用程序,会得到一大堆错误,这是因为 IWebBrowser2 还没在应用程序中进行定义。我们需要另外包含几个标头档来修复这些错误。

按一下工作区窗口的 [ File View (档案检视)] 索引卷标,展开 [IEViewer] 及 [Header files (标头档)] 节点为您的应用程序开启 stdafx.h。按两下 StdAfx.h。

在这行下方

#include       // MFC 通讯端延伸

新增下列程序代码:

#undef __urlmon_h__
#include "urlmon.h"

#undef _WINNETWK_
#include 

#undef _SHLOBJ_H_
#include 

#undef __AFXHTML_H__
#include "afxhtml.h"

虽然此时还没有加入足够的程序代码可以建立 Internet Explorer 控件,您现在可以建置应用程序而不会出现任何错误。因为我们都是写程序代码的良民,所以我们应该确认初始化变量,并且在完成操作后进行清除。展开 CIEViewerView 类别 (您可能需要切换回 [类别] 检视),接着按两下类别建构函式并初始化 m_pBrowserApp 变量,方法是将下列程序代码

// TODO: 在此处加入建构程序代码

取代为:

m_pBrowserApp = NULL;

现在按两下解构函式并新增下列的清除程序代码:

if (m_pBrowserApp != NULL)
            m_pBrowserApp->Release();

我们现在需要建立窗口。如果是 Win32 架构应用程序,这通常是由 WM_CREATE 处理例程所处理。这会在显示主应用程序窗口之前,给您机会建立任一子窗口。在我们的 MFC 应用程序新增 WM_CREATE 处理例程就蛮直接了当;不过,MFC 提供了一个叫做 Create 的虚拟函式,特别保留用于建立任一子窗口。我们可以透过在 CIEViewerView 类别按一下右键,选择 [Add Virtual Function (新增虚拟函式)],并选取 Create 函式的方式来新增 Create 虚拟函式。按一下 [Add and Edit (新增和编辑)] 来新增 Create 处理例程并编辑程序代码。

将函式中的所有程序代码:

// TODO: 在此加入您自订的程序代码及/或呼叫基础类别

return CFormView::Create(lpszClassName, lpszWindowName, dwStyle,
    rect, pParentWnd, nID, pContext);

以下列程序代码取代:

// 建立检视窗口本身
if (!CView::Create(lpszClassName, lpszWindowName,
                  dwStyle, rect, pParentWnd, nID, pContext))
      return FALSE;

// 设定窗口以包含 ActiveX 控件
AfxEnableControlContainer();

RECT rectClient;
GetClientRect(&rectClient);

// 建立控制窗口
// AFX_IDW_PANE_FIRST 是安全 ID,但非任意 ID
if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindowName,
                                WS_VISIBLE | WS_CHILD,
                                rectClient, this,
                                AFX_IDW_PANE_FIRST))
{
      DestroyWindow();
      return FALSE;
}

// 取得界面指针
LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2,
                                   (void**) &m_pBrowserApp);
if (!SUCCEEDED(hr))
{
      m_pBrowserApp = NULL;
      m_wndBrowser.DestroyWindow();
      DestroyWindow();
      return FALSE;
}
return TRUE;

以上程序代码会建立一个 View 类别窗口,可用于主控 ActiveX 控件。接着会呼叫 AfxEnableControlContainer 函式以启用该窗口来包含 ActiveX 控件。该控件是透过呼叫 m_wndBrowser 的 CreateControl 方法而建立的。建立控件之后,我们透过呼叫 m_wndBrowser.GetControlUnknown() 然后查询 IID_IWebBrowser2 来获取 IWebBrowser2 界面。应用程序将利用此接口与 Internet Explorer ActiveX 控件进行沟通。

最后的步骤是为控件指示有用的内容,您可在应用程序开始时进行这项操作。OnInitialUpdate 可能是进行这项操作的好地方。让我们新增一个称做 Nav2Url 的函式,我们会从 OnInitialUpdate 呼叫呼叫此函式以浏览我们选择的 URL。

再次于 CIEViewerView 类别上按一下右键,并新增下列成员函式:

Function Type: void
Function Declaration: Nav2URL(LPCTSTR lpszURL)

新增成员函式会在适当的位置开启程序代码编辑器:

COleVariant empty;
CString strURL(lpszURL);
BSTR bstrURL = strURL.AllocSysString();

m_pBrowserApp->Navigate (bstrURL, COleVariant((long) 0, VT_I4),
                         empty, empty, empty);

以上程序代码将 C 字符串 lpszURL 转换成一个用于 ActiveX 控件的 BSTR。Navigate 方法的其它参数并不会用到,所以它们会以零或空白字符串填满。

现在您需要从检视 OnInitialUpdate 函式呼叫 Nav2Url 函式。在 CIEViewerView 类别按一下右键,并选择 [Add Virtual Function (新增虚拟函式)]。选取 OnInitialUpdate,再按 [Add and Edit (新增和编辑)]。再加入下行程序代码您就大功告成了。

 Nav2URL (_T("\Release\test.htm"));

那么,有什么遗漏的吗?当然有!我们没有可以让应用程序指向的 test.htm 页。我们可以在 eMbedded Visual C++ 中建立 test.htm 档案。在 [File (档案)] 菜单,按一下 [New (新增)]。在 [File (档案)] 索引卷标选择 [HTML page (HTML 网页)]。为该页取名为 test.htm,然后按 [OK (确定)]。这将产生外观如下的空白 HTML 网页:

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft eMbedded Visual C++">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>文件標題</TITLE>
</HEAD>
<BODY>

<!-- 在此插入 HTML -->

</BODY>
</HTML>

将 取代为 Hello World 或类似的句子,然后储存档案。现在来点有趣的:我们可以将 test.htm 档案从我们的工作区数据夹复制到 C:wince410publicIEViewerRelDirEMULATOR_X86Release,接着该档案立即可用于我们在仿真器中执行的应用程序。

Windows CE 应用程序预设的堆栈最大大小约为 58K。因为 Internet Explorer ActiveX 控件很容易就使用超过这个数量,所以必须修改项目设定让应用程序有一个更大的堆栈大小最大值。 

在 [Project (项目)] 菜单,按一下 [Settings (设定)]。 
在 [Settings for (设定为)] 方块中的左上角,选择 [All Configurations (所有组态)]。 
按一下 [Link (连结)] 索引卷标。 
在 [Category (类别)] 方块中选取 [Output (输出)]。 
在 [Stack Allocations (堆栈配置)] 下的 [Reserve (保留)] 字段中,输入 0x40000。 
按一下 [OK (确定)]。 
现在让我们建置和执行应用程序。

这就是最后的结果:Internet Explorer ActiveX 控件乃由 MFC eMbedded Visual C++ 应用程序所主控,且该控件正显示着我们自订的 HTML 网页。


图 3 主控 Internet Explorer 控件的 MFC 应用程序

好的,这就是如何使用 eMbedded Visual C++ 来建立主控 Windows CE Internet Explorer 控件的 MFC 架构应用程序。应用程序开发的选 项还有许多,像是使用 eMbedded Visual C++、C/C++ Win32、MFC、ATL 的机器码,或是利用 .NET Compact Framework 和以 Microsoft® C# .NET 及 Microsoft® Visual Basic® .NET 写成的 Managed 程序代码等。下个月我们将扩大介绍可用来建立 Windows CE .NET 应用程序的选择。

相关推荐

Windows 8.1是不是微软的救命稻草?

微软  Windows  2013-08-29

ATM机等嵌入式设备将迎来Windows Blue

嵌入式设备  Windows  2013-05-14

比肩Surface 诺基亚将推WinRT平板电脑

诺基亚  平板电脑  Windows RT  2012-12-27

HTC拟生产Windows平板电脑 采用高通芯片

HTC  平板  Windows RT  2012-12-23

汽车操作系统革命:封闭还是开源?

QNX  移动应用  Windows Embedded  2012-12-23

诺基亚或重启平板计划:正与高通微软谈判

诺基亚  平板  Windows RT  2012-12-20
在线研讨会
焦点