【转】使用 AYGShell 实现 Windows CE .NET 和 Pocket PC 2002 外壳兼容性

注:来源于MSDN上的技术文章,特推荐之
使用 AYGShell 实现 Windows CE .NET 和 Pocket PC 2002 外壳兼容性
发布日期 : 7/22/2004 | 更新日期 : 7/22/2004

Mike Hall

Microsoft Corporation

适用于:

Microsoft Windows CE .NET 4.2

Microsoft Windows Powered Pocket PC 2002

摘要

从 Windows CE .NET 4.2 开始,原始设备制造商可以将对 Pocket PC 2002 外壳的 API 兼容性支持包括在他们基于 Windows CE 的平台中。本文描述通过 AYGShell 公开的 API 以及基于 Pocket PC 2002 的应用程序与基于 Windows CE .NET 4.2 的设备之间的应用程序兼容性。

本页内容

简介 简介
Win32 应用程序 Win32 应用程序
MFC 应用程序 MFC 应用程序
小结 小结
其他资源 其他资源

简介

从 Windows CE .NET 4.2 开始,原始设备制造商可以将对 Microsoft Windows Powered Pocket PC 2002 外壳的应用程序编程接口 (API) 兼容性支持包括在他们基于 Windows CE 的平台中。这些对标准 Windows CE .NET 外壳的扩展称为 AYGShell API。有了 AYGShell 支持,大多数基于 Pocket PC 2002 的应用程序在针对 OEM 的、基于 Windows CE 的平台进行重新编译以后,都可以运行在基于 Windows CE 的设备上。本文描述了通过 AYGShell 公开的 API,以及在基于 Windows Powered Pocket PC 2002 的应用程序与基于 Windows CE .NET 4.2 的设备之间的应用程序兼容性。

应用程序的可移植性有两个级别,第一个级别是二进制兼容性,这是能够采用现有的基于 Pocket PC 2002 的应用程序并在基于 Windows CE .NET 4.2 的设备上运行这些应用程序的能力,第二个级别是源代码级别的可移植性。在某种程度上,源代码级别兼容性是一种应当在开始开发应用程序之前作出的设计/开发决策。

可以下载并运行在基于 Pocket PC 2002 的设备上的、基于 Pocket PC 2002 的应用程序几乎有数百个之多。有关可用软件的列表,请参见 http://www.pocketpc.com。为 Pocket PC 2002 开发的应用程序通常是使用 Microsoft eMbedded Visual C++ 3.0 创建的,该工具生成特定于处理器的二进制程序。所有基于 Pocket PC 2002 的设备都使用 ARM 处理器;因此,要实现二进制应用程序可移植性,基于 Windows CE .NET 4.2 的设备也必须在 ARM 处理器上运行。如果设备使用 x86、MIPS 或 SHx,将至少需要重新编译应用程序源代码,以便与设备的相应处理器类型匹配。当然,只有当您有权访问应用程序的源代码时才有可能这样做。

基于 Pocket PC 2002 的应用程序可以利用特定于设备的 API,例如 GAPI(游戏 API)。利用特定于 Pocket PC 2002 的 API 的应用程序将无法运行在基于 Windows CE .NET 4.2 的设备上,所以,想要同时为 Windows CE .NET 4.2 和 Pocket PC 2002 开发应用程序的应用程序开发人员应当在运行时确定设备类型,并使用适当的 API 调用来利用特定于设备的 API。

应用程序开发人员在开发 eMbedded Visual C++ 应用程序时可以选择使用 Microsoft Win32 或 Microsoft 基础类 (MFC),下面将分别讨论它们的二进制兼容性。

Win32 应用程序

使用 Win32 开发的应用程序能够调用在基于 Pocket PC 2002 或 Windows CE .NET 设备上任何或所有已公开的 API。我们已经知道,如果应用程序调用了某些特定于设备的 API,则这些应用程序不可移植到 Windows CE .NET 4.2。Pocket PC 应用程序往往遵守某些规则;例如,应用程序窗口、对话框和消息框通常是全屏的。应用程序开发人员需要小心地将控件放在应用程序的工作区以内,以便在被激活时,软输入面板 (SIP) 不会隐藏控件。在 Pocket PC 设备上,屏幕的有效区受到限制。硬件设计指南规定,Pocket PC 设备的屏幕必须具有 240 X 320 的分辨率。这一限制不适用于基于 Windows CE .NET 4.2 的设备;因此,应用程序窗口和布局应当适当地进行调整。

为了说明二进制应用程序的可移植性,我们使用 eMbedded Visual C++ 3.0 构建了一个简单的 Win32 应用程序。代码基于 Pocket PC 2002 SDK Win32 应用程序。该应用程序支持 Pocket PC 设备和 Pocket PC 仿真程序。在这里,Windows CE 仿真程序将用来测试应用程序。

下图显示了运行在仿真程序中的 Pocket PC 应用程序。

1.

您可以使用与 eMbedded Visual C++、Visual Studio .NET 或 Windows CE .NET 开发工具一起安装的 Dumpbin.exe,或 eMbedded Visual C++ 附带的 Depends.exe,来查看应用程序的导入。这将显示应用程序必需的动态链接库 (DLL);大多数 Coredll.dll 导入已经从列表中删除,因为它们对本文并不重要。注意,应用程序还可以通过调用 LoadLibrary 在运行时加载 DLL,Dumpbin 不会列出任何动态加载的 DLL,这意味着基于 Pocket PC 2002 的应用程序可能仍然无法运行在基于 Windows CE .NET 4.2 的设备上。

Dump of file foo.exe
File Type: EXECUTABLE IMAGE
 Section contains the following imports:
    COREDLL.dll
                 13014 Import Address Table
                 1205C Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference
                      Ordinal    95
                      Ordinal    86
    AYGSHELL.dll
                 13000 Import Address Table
                 12048 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference
                      Ordinal    34
                      Ordinal    84
                      Ordinal    83
                      Ordinal    56

注意,基本的 Win32 Pocket PC 应用程序正在从 AYGSHELL.dll 导入四个函数。它们是序号为 34、56、83 和 84 的函数。您可以通过使用 Windows CE .NET 4.2 所附带的共享源代码发现正在导入的是哪些函数。DLL 函数是通过项目 .def 文件导出的,从 aygshell.def 摘录的如下代码描述了这个过程。它显示了 Win32 应用程序正在调用 SHCreateMenuBar、SHInitDialog、SHHandleWMSettingChange 和 SHHandleWMActivate。

C:\WINCE420\PUBLIC\SHELLSDK\OAK\LIB\ARMV4\DEBUG\aygshell.def
; AYGShell.def
LIBRARY     AYGSHELL
EXPORTS
    SHCreateMenuBar             @34
    SHInitDialog                @56
    SHHandleWMSettingChange     @83     NONAME
    SHHandleWMActivate          @84     NONAME

为了测试二进制应用程序的可移植性,我们构建了一个 Windows CE .NET 4.2 调试操作系统映像。该映像基于 Internet 家电平台配置。我们可以使用 Remote File Viewer 应用程序将基于 Pocket PC 2002 的应用程序上载到正在运行的操作系统映像。您可以通过 Windows CE .NET 资源管理器外壳程序来执行这个应用程序;有趣的是,应用程序运行失败。可以使用 Platform Builder 内的调试输出窗口来确定失败原因。下面是 Platform Builder 的输出。

0x83e0d800: DoImport Failed! Unable to import Library 'AYGSHELL.dll' for '\Foo.exe'
0x83e0d800: CreateNewProc failure on \Foo.exe!

调试输出显示,由于没有在设备上找到 AYGSHELL.dll,应用程序未能启动。Windows CE .NET 将 AYGShell 作为组件附带在 Platform Builder 编录中。作为系统创建者,您需要决定是否要为您的平台添加 AYGShell 支持;Platform Builder 报告 AYGShell 使平台增大了大约 58 KB。可以通过从编录中添加 AYGShell 组件或设置 SYSGEN_AYGSHELL sysgen 变量,将AYGShell 支持添加到平台。

将 AYGShell 支持添加到 Windows CE .NET 4.2 平台之后,应用程序将按照期望的那样运行。下面是运行在 Windows CE .NET 4.2 仿真程序中的相同的二进制应用程序。注意,应用程序菜单显示在屏幕底部。这当然是 Pocket PC 应用程序的默认行为。

2.

使用 Platform Builder Dependency Information(右键单击组件,然后单击 Dependencies)。如果将任何以下组件包括到平台中,可以看到 AYGShell 将被添加到平台:Help、Microsoft Pocket Internet Explorer、Standard SDK for Windows CE .NET 和 Pocket Internet Explorer HTML View。

3.

MFC 应用程序

Windows CE .NET 4.2 通过 MFC 编录组件附带了 MFC 支持;该组件将 MFCCE400.dll 添加到嵌入的设备映像,该组件是 MFC for Windows CE 的零售版本。注意,在测试应用程序的调试版本时,eMbedded Visual C++ 4.0 SP2 将把 MFC 的一个调试版本 (MFCCE400D.dll) 下载到平台。

基于 Pocket PC 2002 的设备将 MFCCE300.dll 包含在只读内存 (ROM) 中,使用 Microsoft 基础类为 Pocket PC 2002 而开发的应用程序需要 MFCCE300.dll,而 Windows CE .NET 4.2 附带的是 MFCCE400.dll;因此,为 Pocket PC 2002 开发的 MFC 应用程序将无法运行在基于 Windows CE .NET 4.2 的设备上。此外,用于 Pocket PC 2002 的 MFCCE300.dll 将导入 DocList.dll,这是一个特定于 Pocket PC 2002 的 DLL,但 Windows CE .NET 4.2 没有提供它;因此,Pocket PC 2002 MFC 应用程序将无法“原样”运行在 Windows CE .NET 4.2 上。至少,必须重新编译应用程序源代码。

以下 API 通过 AYGShell 公开。

编程元素

说明

SHChangeNotifyDeregister

该函数禁用窗口接收文件更改通知的功能。

SHChangeNotifyFree

该函数清除文件更改通知。

SHChangeNotifyRegister

该函数登记用于接收更改通知的应用程序。

SHCloseApps

该函数尝试为应用程序释放内存。

SHCreateMenuBar

该函数在屏幕底部创建菜单栏。

SHCreateNewItem

该函数以编程方式创建新的项,好像该项是从全局 NEW 下拉菜单中选择的。

SHDoneButton

该函数允许应用程序基于应用程序的状态动态显示或隐藏 OK 按钮。

SHEnumPropSheetHandlers

该函数通过枚举类项 hkey 下面的子项来支持属性表扩展。

SHFindMenuBar

该函数用来获得菜单栏窗口的句柄。

SHFreeContextMenuExtensions

该函数释放为处理上下文菜单而分配的内存。

SHFullScreen

该函数用来接管某些屏幕区域。

SHGetAppKeyAssoc

该函数用于确定导航控件是否被映射到应用程序。

SHGetAutoRunPath

该函数搜索第一个存储卡,并构造用来查找自动运行文件的路径。

SHHandleWMActivate

该函数用来帮助管理输入面板和您的应用程序。

SHHandleWMSettingChange

该函数用来帮助管理输入面板和您的应用程序。

SHInitDialog

该函数调整对话框的大小,使其适合软件输入面板。

SHInitExtraControls

该函数调整对话框的大小,使其适合软件输入面板。

SHInputDialog

该函数用于处理输入对话框。

SHInvokeContextMenuCommand

该函数调用上下文菜单中的命令。

SHLoadContextMenuExtensions

该函数从指定的上下文和类的配对所对应的注册表中列出的处理程序加载上下文菜单扩展。

SHNotificationAdd

该函数将通知异步地添加到通知栏。

SHNotificationGetData

该函数获得通知的数据。

SHNotificationRemove

该函数删除通知。

SHNotificationUpdate

该函数更新挂起通知的某些方面的内容。

SHRecognizeGesture

该函数被自定义控件用来识别某些笔针的笔势。

SHSetAppKeyWndAssoc

该函数指派某个窗口负责接收特定硬件按键的按键消息。

SHSetNavBarText

该函数设置任务栏中的标题文本。

SHSipInfo

该函数向外壳查询与输入面板和输入方法有关的信息。

SHSipPreference

该函数为输入面板请求位置。

小结

在 Windows CE .NET 4.2 中添加 AYGShell 支持使基于 Pocket PC 2002 的应用程序开发人员还可以为基于 Windows CE .NET 4.2 的嵌入式系统开发程序。为了在基于 Pocket PC 和 Windows CE .NET 的应用程序之间提供源代码级别或二进制级别的兼容性,开发人员应当知道他们的应用程序所调用的 API。

作者彭立云
本文版权归作者所有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-11-14 13:53  寒蝉  阅读(2856)  评论(0编辑  收藏  举报