【问题标题】:How to convert C++ library for use in UWP?如何转换 C++ 库以在 UWP 中使用?
【发布时间】:2020-01-26 02:47:03
【问题描述】:

所以我有一块运行 Windows 10 IoT 并使用 UWP 应用程序的开发板。我在板上运行了特定于板的 IO 的驱动程序,但现在我希望使用提供的库来访问和使用这些 IO。如果您还想查看提供的库,请在此处找到 (https://www.rtd.com/software/CM/CR/aDIO_windows_v05.04.00.zip)

由于我更熟悉只是添加一个 .dll 文件作为参考并继续进行,因此我首先尝试了该方法。收到有关 COM 组件或类似内容的错误。所以我联系了电路板制造商,询问我应该如何继续安装这个库。他们将我发送到此页面 (https://docs.microsoft.com/en-us/cpp/porting/how-to-use-existing-cpp-code-in-a-universal-windows-platform-app?view=vs-2019#targetText=Porting%20a%20C%2B%2B%20Library%20to%20a%20Windows%20Runtime%20Component&targetText=You%20can%20use%20it%20in,app%20code%2C%20regardless%20of%20language),这很有意义,因为驱动程序位于 c++ 库中。

我遵循了在不创建新项目的情况下将本机 DLL 移植到 UWP 部分。我没有问题就进入第6步。在第 6 步之后重建时,我收到一条错误消息,提示 不支持使用静态版本的 C++ 运行时库 (http://prntscr.com/pazh69)。查了一下,它说我需要更改其他设置。

所以我右键单击 Project>Properties>C/C++>Code Generation 并将 RunTime Library 切换到 /MDd。这似乎解决了这个错误。再次尝试重建。

接下来我遇到了一个问题,即 .c 源文件无法与我之前从 microsoft 指南中启用的 /ZW 标志一起使用。因此,我进入了每个源文件并从它们中删除了 /ZW 标志。

最后,再次重建,得到这个错误: http://prntscr.com/pazidr

无法解析的外部符号错误。我还没有找到有效的解决方案,因为这显然不是我的库,我很困惑从哪里开始尝试调试。

我想我的总体问题是: 1. 是否可以将此库转换为在 UWP 中使用? 2. 源文件是 .c 文件而不是 .cpp 文件是否存在问题? 3. 是否有针对此特定问题的解决方案,使我能够拥有一个正常工作的 UWP 库? 4. 是否有不同/更好的流程来完成我想要完成的工作?

非常感谢您,我知道这是一个很重要的问题。

【问题讨论】:

  • UWP 是 Microsoft 为提供可在未来 30 年内持续使用的操作系统 API 所做的努力。 winapi 中给程序员和用户带来无尽痛苦的不良旧做法被彻底消除,注册表接近该列表的顶部。

标签: visual-c++ uwp static-libraries


【解决方案1】:

UWP 应用不支持注册表 API,并且无法使用它们。在为 UWP 构建时,您需要删除它们。考虑类似的事情:

#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) 
// Do stuff that calls Reg* APIs
#endif

UWP 应用不使用CreateFile,它实际上除了文件操作之外还做了很多事情。如果您使用它来打开您可以作为 UWP 访问的磁盘上的文件,那么您可以使用以下内容:

// Reading a file
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
   HANDLE file = CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr);
#else
   HANDLE file = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
#endif

// Creating a file for writing
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
    HANDLE file = CreateFile2(fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr);
#else
    HANDLE file = CreateFileW(fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr);
#endif

您仍需遵守 UWP 文件访问限制。见File access permissions

如果您使用 CreateFile 访问设备,则 UWP 应用不支持此操作。在某些有限的情况下,你可以从 UWP 访问设备驱动程序,但无论如何你都需要使用 Windows 运行时 API 编写不同的实现。见Device Access API

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2020-09-07
    • 2017-10-03
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2019-01-18
    相关资源
    最近更新 更多