支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是不是有效?

Posted

技术标签:

【中文标题】支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是不是有效?【英文标题】:Support for Windows 10 desktop applications on ARM - MFC and COM and OPOS work?支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是否有效? 【发布时间】:2020-10-17 08:54:37 【问题描述】:

我试图了解将在 x86 Windows 10 上运行的 C++ MFC 应用程序移植到配备 Qualcomm 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 可能存在哪些障碍?

第二个问题是什么是合适的低成本 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 位 operation.96Boards 是一个 32 位和 64 位 ARM® 开放平台,由 Linaro™ 旨在为软件/制造商和嵌入式服务 OEM 社区。 DragonBoard 410C 支持android 5.1,基于Linux Debian 和 Win10 IoT Core 高级处理能力、WLAN、蓝牙、 和 GPS,都装在一张信用卡大小的板上。它是 旨在支持功能丰富的功能,包括多媒体, 使用 Qualcomm® Adreno™ 306 GPU,集成 ISP,最高 13 MP 摄像头支持,以及 1080p 高清视频播放和 H.264 捕捉 (AVC)。

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

到目前为止我能找到什么

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

https://www.techradar.com/news/windows-10-on-arm-is-set-to-become-more-useful-with-emulation-for-traditional-64-bit-apps

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

https://channel9.msdn.com/Events/Build/2017/P4171 是一个提到 x86 仿真的视频

https://docs.microsoft.com/en-us/windows/uwp/porting/apps-on-arm-x86-emulation 讨论 x86 仿真

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

https://www.howtogeek.com/309119/what-is-windows-10-on-arm-and-how-is-it-different-from-windows-rt/

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

模拟对用户和 他们运行的程序。它使用相同的 WOW(Windows 上的 Windows) Windows 用于在 64 位上运行 32 位应用程序的技术 今天的 Windows 版本。然而,x86-to-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/ 包含指向页面上各种资源的链接以及带有其他文档链接的左侧边栏。

一些注意事项和其他信息

Can SQL Server Express (or any version) run on 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-development/

【问题讨论】:

【参考方案1】:

我可能不得不面对的一个障碍是,我使用“Visual Studio 安装程序项目”扩展名来打包/分发我的软件(基于 MFC)以构建“.msi”安装程序文件。

问题在于该扩展(还)不包含针对 ARM64 系统的选项,所以我不得不推荐使用 x86 版本。

但是,我还不能测试这是否有效。该 MSI 文件是否将软件安装在正确的位置? (即“Program Files (x86)”文件夹的相关“Emulation”等效项。)

还有关于应该安装哪个 VC-RunTime Redistributable Package(s) 的问题:x86 或 ARM64,或两者兼而有之?

当然,我可以构建和打包针对 ARM64 的二进制文件,但是没有办法让 MSI 文件将其正确安装到“本机”“程序文件”位置.

【讨论】:

我从您的回答中推断,如果使用 ARM 目标编译,标准 MFC 应用程序将在 Windows 10 ARM 上运行。那么这是否意味着在 Windows 10 ARM 上可以使用 ARM 版本的 MFC DLL? @RichardChambers 呵呵。问题是,我实际上无法访问 Windows-on-ARM64 系统。但是,通过在 VS 中安装相关的构建工具,我可以完全构建具有 ARM64 目标的软件。 (而且我使用非常严格的警告等)另外,我不知道有任何 ARM(32) Windows 系统,所以它总是 ARM64。我需要让我的老板给我买一台备用笔记本电脑……有什么建议吗? 我使用 NSIS 创建我的安装程序,所以我需要检查它是否适用于 ARM Windows 10。我认为所有标准目录和目录结构都将在 ARM Windows 10 安装上,尽管我想它Program Files (x86) 不存在是有道理的。 ARM Windows 10 上的 ARM 目标应用程序的类似目录是什么?我认为这将是两种不同的安装程序,一种用于 x86/x64 Windows 10,另一种用于 ARM Windows 10。 现在似乎有许多配备 Windows 10 的 Snapdragon 850 笔记本电脑和平板电脑。而且我读到有许多中国低成本版本即将推出。我希望使用 Arrow 的 DragonBoard 410 作为测试平台,因为它不到 100 美元而且很小。我还看过一篇关于 ARM Windows 10 的文章,不是 Windows 10 IoT Core,而是 Windows 10 ARM 本身在 Raspberry Pi 3 上使用 1803。 @RichardChambers 请注意,有一个 AMR64 版本的 VC Run-Time redistributables。这个版本是否预装了 Windows 10,我不确定。但是那个包应该使所有 MFC 的东西都能运行。【参考方案2】:

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

使用 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 开发工具包的公告,但是我无法找到可用的地方。

Availability of the Snapdragon Development Kit for Windows ARM

因此,我在具有 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 dump website 下载了必要的组件并创建了.iso 文件以用于Windows 10 ARM 的预览版。然后我使用WoR project tool 从 UUP 转储工具创建的.iso 文件创建可启动 SSD。

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

一个警告:这些程序的文档似乎是一个移动的目标,并且工具正在改进。有关该过程的概述,请参见以下内容:

https://raspberrytips.com/install-windows10-raspberry-pi/ https://www.windowslatest.com/2020/07/24/install-windows-10-on-raspberry-pi/

这篇 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 仅将 Windows 的 ARM 版本的许可证出售给 原始设备制造商。 WoR-flasher 已正式测试使用 32 位版本 Raspberry Pi OS(这就是我用来创建一些安装的 媒体),但它应该可以在任何基于 Debian 的 Linux 上正常运行 分布。

虽然有人提到必须更新 Raspberry Pi 4 固件以支持从 USB 启动,但我发现我在 2021 年 9 月购买的 Raspberry Pi 4 已经具有更新的固件。见Booting my Raspberry Pi 4 from a USB device

首先,正如我刚才所说,在 Pi 4B 上默认启用 USB 启动 (顺便说一下,还有 Pi 400),但有一点需要注意。它 似乎一些早期的引导加载程序固件版本没有正确 支持这个,所以你必须确保你的树莓派 4 有 2020 年 9 月 3 日或更晚的引导加载程序 eeprom 固件。那里有两个 做到这一点的方法;要么取出 microSD 卡,然后启动,所以你 可以从诊断屏幕读取固件日期,或者简单地运行 vcgencmd bootloader_version。我有三个 Pi 4 单元(1GB、2GB 和 4GB 内存),这是我从第一批可用的 瑞士,他们都有 9 月 3 日的固件,所以我假设是旧的 固件不是很常见。如果你碰巧有旧版本, 更新说明在USB mass storage boot 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,Only 3 GB of RAM are available. How can I fix this?

插入电源线后继续按 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)

在尝试各种方法来构建 ARM64 MFC 时,我遇到了 MSB8041 链接器错误的问题,请参阅MSB8041: MFC Libraries are required for this project。

我对 Visual Studio 2019 安装进行了几次修改,最终似乎可以工作,并且我能够对生成的 MFC 应用程序源代码主体进行 ARM64 MFC 编译。

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

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

注意:我将 Visual Studio 2019 C++ Redistributable 安装程序的副本传输到 Raspberry Pi 4 并运行安装程序。这样做之后,使用 MFC 作为.dll 而不是作为静态库的测试 MFC 应用程序的版本正确运行。该文件的名称是VC_redist.arm64.exe,可以从Microsoft 的The latest supported Visual C++ downloads 下载,也可以在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 builder、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 应用程序。

我查看了在我的工作站上安装了 Visual Studio 2019 的 MFC .dll 的 ARM 版本,但找不到。我确实为 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 上使用。

【讨论】:

以上是关于支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

在 ARM 上的 Windows 10 上检测 UWP 应用仿真

PC桌面软件的末日,手机移动端App称王写在windows11支持安卓,macOS支持ios,龙芯支持x86和arm指令翻译

PC桌面软件的末日,手机移动端App称王写在windows11支持安卓,macOS支持ios,龙芯支持x86和arm指令翻译

Windows 10 kiosk 模式:启动桌面应用程序但无法设置音量

office365可以安装armwindows

从桌面运行 Windows 应用商店应用程序