首页 > 解决方案 > 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是否有效?

问题描述

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

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

此应用程序可与面向 x86 和 Windows 10 的 Visual Studio 2015/2017/2019 一起正常编译。

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

第二个问题是什么是合适的低成本 ARM Windows 10 设备?惠普、三星和联想的大多数 Windows 10 ARM Snapdragon 设备的价格似乎都在 800 美元以上,我想要更便宜的,比如不到 200 美元。

一个附带问题: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

到目前为止我能找到的

这个发布的问题,Win32 support on Windows 10,似乎与我的问题最接近,但没有真正的答案。接受的答案是“根本没有 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 上的 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) 应用程序。

这是一个 Microsoft 门户网站,可在 ARM 文档上访问 Windows 10,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 的此 Developer Minute 视频描述了在 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-开发/

标签: winapimfcwindows-10arm

解决方案


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

  • 使用 Raspberry Pi 4 为 ARM 设备创建低成本 Windows
  • 在该硬件上使用 Windows 10 ARM 测试一个简单的 MFC 应用程序
  • 测试使用 Nullsoft Scriptable Install System (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 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 机箱作为我的引导设备。

我从亚马逊订购了一个 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 文章New script makes it easy(ish) to put Windows 10 or 11 on a Raspberry Pi提到了有关使用预览版 Windows 10 ARM 组件的这个论点:

该脚本的创建者辩称,它不违反任何法律或 Windows 许可协议,因为它直接从 Microsoft 的服务器下载其所有代码,并以未经许可、停用的状态安装 Windows,就像在没有产品密钥的普通 x86 PC 上安装一样。Microsoft 仅向 OEM 销售 ARM 版本的 Windows 许可证。WoR-flasher 已使用 32 位版本的 Raspberry Pi OS 进行了正式测试(这也是我用来创建一些安装媒体的工具),但它应该可以在任何基于 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 内存),它们是从瑞士的第一批可用的,它们都有 9 月 3 日的固件,所以我认为旧固件不是很常见。如果您碰巧有旧版本,更新说明在USB 大容量存储引导中给出 Raspberry Pi 硬件文档的部分。

USB 启动的另一个要求是您必须启动 Raspberry Pi OS 版本 2020-08-20 或更高版本。实际上,这只是意味着您应该使用下载页面中最新的 Raspberry Pi OS 映像(当前为 2020-12-02),或者如果您要复制现有的 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 网络浏览器的标准 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 配置 -> 高级配置并将限制 RAM 更改为 3 GB 以禁用。
  • 按ESC几次返回,然后在提示时按Y保存设置,最后重新启动板。

在 ARM 上使用 Visual Studio 2019 for MFC

我决定将 Visual Studio 2019 社区版用于我的测试 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 Libraries are required for this project

我对 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 并运行了安装程序。这样做之后,使用 MFC.dll作为静态库而不是静态库的测试 MFC 应用程序的版本可以正常运行。该文件的名称是VC_redist.arm64.exe并且可以从 Microsoft 下载最新支持的 Visual C++ 下载,也可以在 Visual Studio 2019 的安装目录中找到。对于社区版,文件夹的路径是

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

Nullsoft 脚本安装系统 (NSIS)

我之前曾在 Intel 上为 Windows 7 和 Windows 10 使用过开源 Windows Installer 构建器、NSIS 或 Nullsoft Scriptable Install System,因此想在 Windows 10 ARM 上尝试相同的软件。

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

支持论坛中的一个线程提到,虽然使用由 NSIS 创建的专门针对 Windows 10 ARM 的安装程序不可用并且可能不可用,但由 NSIS 创建的 Windows 安装程序应该可以在 Windows 10 Intel 和 Windows 10 上运行ARM 具有最新的 Microsoft 更改以支持 Windows 10 ARM 上的 x86 应用程序。

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

我重新编译了 MFC 测试应用程序,然后编译了 NSIS 脚本以创建 Windows 安装程序。我将它转移到运行预览版 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 预览版的一部分。

注意:找到适用于 ARM 的 Visual Studio 2019 C++ Redistributable 并在安装在 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 英特尔或 Windows 10 ARM。


推荐阅读