支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 工作吗?

Ric*_*ers 6 winapi mfc arm windows-10 dragonboard

我试图了解将在 x86 Windows 10 上运行的 C++ MFC 应用程序移植到带有 Snapdragon 的 ARM Windows 10 设备的障碍。

32位应用程序具有以下特点:

  • 带有 C++ 的 MFC 用于用户界面
  • C 用于业务逻辑
  • 源代码分为大约 30 个不同的项目,一些静态库,一些 DLL,一些 EXE
  • 依赖 Windows API 进行多线程、信号量、互斥锁、密码学
  • 使用来自第三方提供商的 COM 对象、OPOS 服务对象和 OPOS 控制对象
  • 依赖于使用 ADO 作为数据库的 SQL Server Express 的本地实例

此应用程序可与针对 x86 和 Windows 10 的 Visual Studio 2015/2017/2019 很好地编译。

我的问题是:使用 Snapdragon 处理器将此应用程序迁移到 ARM Windows 10 的可能障碍什么?

附带问题:Snapdragon 410 处理器是否可以用于初始测试和兼容性检查。我将 Arrow 的 DragonBoard 410C 视为低成本测试平台。https://www.arrow.com/en/products/dragonboard410c/arrow-development-tools

这款基于 96Boards™ 规范的 DragonBoard™ 410C 采用 Qualcomm® Snapdragon™ 410 处理器、四核 ARM® Cortex™ A53,每核时钟速度高达 1.2GHz,能够进行 32 位和 64 位操作。96Boards 是由 Linaro™ 托管的 32 位和 64 位 ARM® 开放平台,旨在为软件/制造商和嵌入式 OEM 社区提供服务。DragonBoard 410C 支持 Android 5.1、基于 Debian 的 Linux 和 Win10 IoT Core 高级处理能力、WLAN、蓝牙和 GPS,所有这些都装在一张信用卡大小的板上。它旨在通过 Qualcomm® Adreno™ 306 GPU、支持多达 13 MP 摄像头的集成 ISP 以及使用 H.264 (AVC) 进行 1080p 高清视频播放和捕获来支持功能丰富的功能,包括多媒体。

DragonBoard 820C 可能是更合适的测试硬件,因为它更接近大多数 Windows 10 ARM Snapdragon 产品随附的产品。 https://www.arrow.com/en/products/dragonboard820c/arrow-development-tools

到目前为止我能找到什么

这个发布的问题,Windows 10 上的 Win32 支持,似乎最接近我的问题,但是没有真正的答案。接受的答案是“根本没有 x86 Win32 仿真。您需要使用为该平台设计的工具集。” 根据以下文章,这似乎是错误的:

现在,使用 ARM 笔记本电脑上的 Windows 10,可以使用仿真运行 32 位 x86 桌面软件,但不能运行专用的 64 位软件,例如 Adob​​e 的 Premiere Pro 视频编辑应用程序。

x86 应用程序仿真使丰富的 Win32 应用程序生态系统在 ARM 上可用。这为用户提供了运行现有 x86 win32 应用程序的神奇体验,而无需对应用程序进行任何修改。该应用程序甚至不知道它在 ARM PC 上的 Windows 上运行,除非它调用特定的 API (IsWoW64Pr​​ocess2)

ARM 上的 Windows 10 [与 Windows/RT] 完全不同。这是完整的 Windows 桌面体验。微软创建了一个特殊的模拟器层,允许传统的 32 位桌面应用程序在 ARM 处理器上运行,所以一切都应该“正常工作”。微软甚至在 ARM 上展示了 Windows 10 Professional 的一个版本,并表示它支持你在 Windows 10 Professional 上可以找到的所有常见的高​​级功能。

仿真对用户和他们运行的程序完全透明。它使用的 WOW(Windows on Windows)技术与当今 Windows 用于在 64 位版本的 Windows 上运行 32 位应用程序相同。但是,x86 到 ARM 的仿真完全在软件中进行。

使用 VS 2017 为 ARM 编译和软件组件注意事项

本文https://pete.akeo.ie/2017/05/compiling-desktop-arm-applications-with.html提供了有关使用 Visual Studio 2017 为 ARM 编译桌面应用程序的一些详细信息。

这篇文章https://support.microsoft.com/en-us/help/4521606/windows-10-arm-based-pc在关于限制的部分下提到:

硬件、游戏和应用程序的驱动程序只有在专为基于 Windows 10 ARM 的 PC 设计时才有效。有关详细信息,请咨询硬件制造商或开发驱动程序的组织。驱动程序是与硬件设备通信的软件程序——它们通常用于防病毒和反恶意软件、打印或 PDF 软件、辅助技术、CD 和 DVD 实用程序以及虚拟化软件。

如果驱动程序不工作,依赖它的应用程序或硬件也将无法工作(至少不是完全)。外围设备和设备仅在它们所依赖的驱动程序内置于 Windows 10 中,或者硬件开发人员已为该设备发布 ARM64 驱动程序时才能工作。

文章在同一部分还说:

64 位 (x64) 应用程序将无法运行。您将需要 64 位 (ARM64) 应用程序、32 位 (ARM32) 应用程序或 32 位 (x86) 应用程序。您通常可以找到 32 位 (x86) 版本的应用程序,但一些应用程序开发人员仅提供 64 位 (x64) 应用程序。

这是 Windows 10 on ARM 文档的 Microsoft 门户,https://docs.microsoft.com/en-us/windows/arm/包含指向页面上各种资源的链接以及带有附加文档链接的左侧边栏。

一些注意事项和附加信息

SQL Server Express(或任何版本)可以在 RPi 上运行吗? 答案似乎是没有 ARM 版本的 SQL Express。然而,有一条评论说有一个 ARM 版本的 SQL Server Compact。SQL Server Compact 已被 SQL Server localDB 取代,但我不确定是否有 ARM 版本,但它似乎使用了 SQL Server 的一部分,因此 ARM 版本似乎值得怀疑。请参阅https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15

另一方面,看起来微软正在发布可以在 x64 和 ARM64 上运行的 Azure SQL Edge。https://azure.microsoft.com/en-us/services/sql-edge/

Microsoft 的此开发人员纪要视频描述了在 Visual Studio 中启用 ARM64 构建的步骤。https://www.youtube.com/watch?v=OZtVBDeVqCE&feature=youtu.be并且此链接上也有说明https://blogs.windows.com/windowsdeveloper/2018/11/15/official-support-for -windows-10-on-arm-development/

Ric*_*ers 2

这篇文章涵盖了三项相关活动:

  • 使用 Raspberry Pi 4 创建低成本 Windows for ARM 设备
  • 在该硬件上使用 Windows 10 ARM 测试简单的 MFC 应用程序
  • 测试使用 Nullsoft 脚本化安装系统 (NSIS) 创建 Windows 安装程序

一旦我使用更大、更复杂的 MFC 应用程序进行了进一步的测试,本文将更新更多信息。

  • 提取源代码并重新编译 ARM64 的 OPOS 控制对象
  • 使用 ADO 数据库引擎接口进行测试
  • 使用信号量、临界区和多线程

注意:由于在我的测试中,我在不受 Microsoft 或其他供应商支持的设备上使用 Microsoft 不支持的 Windows 10 ARM 预览版,因此我的体验与使用实际 Microsoft 产品之间可能存在一些差异。

问题在于,目前 Windows 10 ARM 并未像 Windows 10 for Intel 那样作为单独的产品出售。它只是 OEM 产品。我发现在廉价设备上使用 Windows 10 ARM 进行测试的唯一方法是使用 Windows 10 ARM 预览版本。

请参阅解释计算机视频“Raspberry Pi 上的 Windows 11 ARM”

另请参阅此解释计算机视频:RK3588 SBC (Orange Pi 5) 上的 ARM Windows 11

在 Raspberry Pi 4 上使用 Windows ARM 进行硬件设置

查看 Windows on Arm 设备的价格,我发现大部分价格都在 500 美元及以上。我确实找到了微软和高通正在开发的低成本开发平台 Snapdragon 开发者套件的公告,但我无法找到可用的地方。

适用于 Windows ARM 的 Snapdragon 开发套件的可用性

因此,我在具有 4GB RAM 和 128GB SSD 的 Raspberry Pi 4 B 上继续使用 Windows 10 ARM,并使用 USB 3.0 转 SATA 外壳作为我的启动设备。

我从 Amazon 订购了 CanaKit,其中包含我需要的一切,包括外壳、电源、带 4GB 内存的 Raspberry Pi 4 B 以及带有 Raspbian 的 microSD 卡。我选择了 4GB 版本,因为这对于 Windows 10 ARM 来说已经足够了,而且我想限制成本。

我组装了 Raspberry Pi 4 和带有风扇和散热器的外壳,插入 microSD 卡,并为 Raspberry Pi 通电。它从 microSD 卡启动,并允许我使用 NOOBS 安装 Raspbian。自从几年前我上次使用 Raspberry Pi 3 B 以来,NOOBS 似乎有所改进。WiFi 可以用,我可以更新 Raspbian。

对于 Windows 10 ARM 的存储,我使用了旧的 128GB SSD,放在 USB 3.0 SATA 转 USB 外壳中。据我了解,microSD 卡和 USB 3.0 上的 SSD 之间的差异相当大。

我使用UUP 转储网站下载必要的组件并.iso为 Windows 10 ARM 的预览版本创建文件。然后,我使用WoR 项目工具.iso从UUP 转储工具创建的文件创建可启动 SSD 。

此过程需要一段时间才能让工具完成其工作,但我发现这些工具的用户友好性令人印象深刻,并且构建预览 Windows 10 ARM.iso文件非常简单。

有一点警告:这些过程的文档似乎是一个不断变化的目标,并且工具正在改进。有关该过程的概述,请参阅以下内容:

这篇 Ars Technica 文章“新脚本使在 Raspberry Pi 上安装 Windows 10 或 11 变得容易”提到了有关使用预览版 Windows 10 ARM 组件的这一论点:

该脚本的创建者辩称,它没有违反任何法律或 Windows 许可协议,因为它直接从 Microsoft 的服务器下载所有代码,并以未经许可、停用的状态安装 Windows,就像在没有产品密钥的情况下在常规 x86 PC 上安装一样。Microsoft 仅向 OEM 出售 ARM 版本 Windows 的许可证。WoR-flasher 已使用 Raspberry Pi 操作系统的 32 位版本进行了正式测试(我也用它来创建一些安装介质),但它在任何基于 Debian 的 Linux 发行版上运行应该没有问题。

虽然提到必须更新 Raspberry Pi 4 固件才能支持从 USB 启动,但我发现我 2021 年 9 月购买的 Raspberry Pi 4 已经具有更新的固件。请参阅从 USB 设备启动我的 Raspberry Pi 4

首先,正如我刚才所说,Pi 4B(顺便说一句,还有 Pi 400)上默认启用 USB 启动,但有一个小警告。某些早期的引导加载程序固件版本似乎无法正确支持此功能,因此您必须确保您的 Raspberry Pi 4 具有 2020 年 9 月 3 日或更高版本的引导加载程序 eeprom 固件。有两种方法可以做到这一点; 取出 microSD 卡然后启动,这样您就可以从诊断屏幕读取固件日期,或者只需运行 vcgencmd bootloader_version. 我有三台 Pi 4 设备(内存为 1GB、2GB 和 4GB),它们是我从瑞士第一批购买的,它们都有 Sep 3 固件,所以我认为旧固件不是很常见。如果您碰巧有旧版本,则 Raspberry Pi 硬件文档的USB 大容量存储启动部分给出了更新说明。

USB 启动的另一个要求是您必须启动 Raspberry Pi OS 版本 2020-08-20 或更高版本。实际上,这仅意味着您应该使用下载页面中的最新 Raspberry Pi 操作系统映像(当前为 2020 年 12 月 2 日),或者如果您要复制现有 SD 卡,请检查 /etc/rpi 的内容-问题。我现在不打算讨论启动其他 Linux 发行版,因为我还没有时间亲自尝试。

我关闭了 Raspbian 并关闭了 Raspberry Pi。我用 Raspbian 卸下了 microSD 卡,并将 USB 3.0 SSD 外壳插入 USB 3.0 端口并打开 Raspberry Pi 的电源。Windows 10 ARM 已初始化并启动。

我确实需要执行一些操作才能完成 Windows 10 ARM 安装:

  • 设置区域和键盘
  • 将以太网电缆插入 Raspberry Pi 的 RJ-45 连接器
  • 使用个人 Microsoft 用户帐户

完成后,我就拥有了一个带有 Edge Web 浏览器的标准 Windows 10 桌面。在运行 Edge 的情况下对任务管理器进行简单检查显示我有大约 1GB 的可用内存。

虽然任务管理器报告安装了 4 GB 内存,但 Raspberry Pi 4 上的 Windows 10 ARM 预览版本似乎仅使用了 3 GB 内存。我看到有人提到需要更改 BIOS 才能使用所有 4 GB 内存。

注意:看起来这里需要更改 BIOS,只有 3 GB 的 RAM 可用。我怎样才能解决这个问题?

  • 插入电源线后按住 ESC 键,直到看到 UEFI 设置屏幕。
  • 转到“设备管理器”->“Raspberry Pi 配置”->“高级配置”并将“Limit RAM to 3 GB”更改为“Disabled”。
  • 按 ESC 几次返回,然后在出现提示时按 Y 保存设置,最后重新启动开发板。

在 ARM 上使用 Visual Studio 2019 for MFC

我决定使用 Visual Studio 2019 Community Edition 来测试 MFC 应用程序。

我使用 Visual Studio 创建了一个 MFC 项目。然后我尝试更改为 ARM64 版本,但失败了。

首先,我必须修改 Visual Studio 2019 安装以包含 ARM MFC 功能。这要求我使用控制面板的“应用程序和功能”面板中提供的 Visual Studio 2019 安装程序。

按修改按钮并向下滚动到安装程序的“单个组件”选项卡底部附近。选择C++v14.29 MFC for v142 build tools (ARM)C++v14.29 MFC for v142 build tools (ARM64)

按下“修改”按钮后 Visual Studio 2019 安装程序的屏幕截图

在尝试各种方法来构建 ARM64 MFC 期间,我遇到了 MSB8041 链接器错误的问题,请参阅MSB8041:此项目需要 MFC 库

我对 Visual Studio 2019 安装进行了几次修改,它似乎终于起作用了,我能够对生成的 MFC 应用程序源代码体进行 ARM64 MFC 编译。

我将 MFC 应用程序 .exe 传输到 Raspberry Pi 4,当我尝试运行它时,收到一条.dll未找到 MFC 的错误。

然后,我修改了构建属性以使用 MFC 库作为静态库,将生成的 MFC.exe文件传输到 Raspberry Pi 4,然后就可以运行它了。

注意:我将 Visual Studio 2019 C++ Redistributable 安装程序的副本传输到 Raspberry Pi 4 并运行该安装程序。.dll执行此操作后,使用 MFC 作为而不是作为静态库的测试 MFC 应用程序版本可以正确运行。该文件的名称为,VC_redist.arm64.exe可以从 Microsoft 下载最新支持的 Visual C++下载,也可以在 Visual Studio 2019 的安装目录中找到。对于 Community Edition,该文件夹的路径为

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\v142

Nullsoft 脚本化安装系统 (NSIS)

我之前曾在 Intel 上使用过适用于 Windows 7 和 Windows 10 的开源 Windows Installer 构建器、NSIS 或 Nullsoft 脚本安装系统,因此想在 Windows 10 ARM 上尝试使用相同的软件。

我认为可能有某种脚本编译器开关或设置来创建 Windows 10 ARM 安装程序,但是阅读文档并查看支持论坛,在进行构建时似乎没有可用的 Windows 10 ARM 目标。

支持论坛中的一个主题提到,虽然使用 NSIS 创建的专门针对 Windows 10 ARM 的安装程序不可用并且可能不可用,但 NSIS 创建的 Windows Installer 应该适用于 Windows 10 Intel 以及 Windows 10 ARM 进行了最新的 Microsoft 更改,以支持 Windows 10 ARM 上的 x86 应用程序。

我从旧脚本开始创建了一个简单的 NSIS 脚本,用于另一种更复杂的 Windows x86 应用程序。我使用了 ARM64 编译/行输出文件夹的路径,而不是解决方案编译/链接输出文件夹的标准路径。

我重新编译了 MFC 测试应用程序,然后编译了 NSIS 脚本来创建 Windows Installer。我将其转移到运行 Windows 10 ARM 预览版本的 Raspberry Pi 4。然后我运行安装程序并成功完成。

MFC 测试程序显示在“开始”菜单中,我可以通过从“开始”菜单中选择应用程序来运行它。

然后我使用 Windows 控制面板卸载它,并且卸载正确。

此测试的构建组件是使用 MFC 作为 .dll 编译的单个 MFC 应用程序。构建中只有两个文件:MFC 应用程序的 .exe 和要放入同一文件夹中的短文本文件。我没有使用标准 Windows 应用程序路径进行此测试,而是使用C:\framework\saratoga正确创建的路径。

附加说明和注意事项

UUP 的 Windows 10 ARM 预览版缺少 MFC .dll

根据我的经验,UUP 为 Raspberry Pi 4 构建的 Windows 10 ARM 预览版缺少 MFC .dll。我不知道三星、惠普、联想和微软等不同制造商提供的 Snapdragon 设备的标准 Windows 10 ARM 版本是否具有 MFC .dll。

解决方法是使用静态 MFC 库编译 MFC 应用程序。

我查看了.dll我的工作站上安装的 Visual Studio 2019 是否有 ARM 版本的 MFC,但未能找到。我确实找到了 ARM 的可再发行运行时安装程序,所以也许 MFC.dll就在其中。我没有使用可再发行运行时安装程序,因此标准 Visual Studio 2019 C++ 运行时似乎是 UUP 的 Windows 10 ARM 预览版的一部分。

注意:找到 Visual Studio 2019 C++ Redistributable for ARM 并在 Raspberry Pi 4 上安装的 Windows 10 ARM 上运行它后,MFC .dll 现在可用,并且测试应用程序的非静态链接版本运行良好。

Windows 10 ARM 预览版本处于测试模式

UUP 的 Windows 10 ARM 预览版在桌面右下角有一条注释,表明它处于“测试模式”,并附加一条注释,表明 Windows 需要激活。

我不知道这是否意味着此 Windows 安装将在一定时间内变得无法使用。

Nullsoft 脚本化安装系统

使用 NSIS 创建 Windows 应用程序安装程序似乎可以创建适用于 Intel 上的 Windows 以及 Windows 10 ARM 的安装程序。

据我所知,随着 Windows 10 ARM 的最新增强和对 x86 应用程序的支持,任何使用为 x86 编译的引擎(不是 64 位应用程序)的 Windows Installer 创建程序都可以在Windows 10 Intel 或 Windows 10 ARM。