Win32 C++项目移植到 Win10 UWP

本文可能对谁有帮助

如果你正在做将现有的Win32 静态库DLL 工程移植到Win10 UWP(通用 Windows) 环境,这篇文章可能会对你有帮助。


概述

在VS2015的 新建项目 -> 已安装 -> 模板 -> Visual C++ -> Windows -> 通用 页面,包含几个我们需要关心的工程类型:空白应用(通用 Windows)DLL(通用 Windwos)静态库(通用 Windows)Windows 运行时组件(通用 Windows)

根据工程说明可以知道,DLL(通用 Windwos)静态库(通用 Windows)可以被空白应用(通用 Windows)Windows 运行时组件(通用 Windows)使用,并且是语言相关的,不能跨语言调用。
Windows 运行时组件(通用 Windows)可以被空白应用(通用 Windows)使用,是语言无关的。也就是说,不管是C++还是C#开发的应用都可以调用Windows 运行时组件(通用 Windows)

知道了这一点,那么我们来看下问题,博主(C++程序员,未接触过C#及WinPhone相关开发)遇到的情况是这样的:将现有的 Win32 平台DLL 移植到 UWP 平台,供采用 C# 开发的Win Phone APP使用,而该 DLL 还依赖其它 C++静态LIB库C动态库

我们需要做的包括以下几个方面:

  1. 各类工程到 UWP 的转换
  2. 处理编译问题
  3. 处理磁盘操作问题
  4. 数据类型间的转换
  5. 接口封装问题

开始

首先,请下载Universal Windows Platform (UWP) app samples,将会对你有莫大的帮助。

为方便描述,做如下约定:

  • 被移植的DLL定义为a.dll
  • a.dll依赖的C++静态LIB库定义为c++.lib
  • a.dll依赖的C动态库定义为c.dll
  • 通用 Windows版组件加 _rt 后缀以示区别
  • Windows 运行时组件(通用 Windows)外壳定义为 shell_rt.dll

各类工程到UWP的转换

  我们整体的工程关系转换为:
    a.dll  ->    a_rt.lib
  c++.lib  ->  c++_rt.lib
    c.dll  ->    c_rt.lib
  旧的依赖关系:app 依赖a.dll,a.dll 链接c++.lib,a.dll 依赖c.dll;
  新的依赖关系:app 依赖shell_rt.dll,shell_rt.dll 链接a_rt.lib、c++_rt.lib、c_rt.lib,
              并且shell_rt.dll 负责重新封装a.dll的接口。app 可由 C++ 或 C# 开发。

注意: 创建 Windows 运行时组件(通用 Windows) 工程时,必须保证工程内的最外层命名空间名字和最终生成的dll名字(包括winmd文件)完全一致,这也是官方的要求。

通过阅读 官方文档 得知在不重新创建工程的情况下将现有工程转换为UWP工程的方法,如下:

  1. 打开 DLL 项目中的“项目属性”,并将“配置”设置为“所有配置”;
  2. 在“项目属性”中,在“C/C++”、“常规”选项卡上,将“使用 Windows 运行时扩展”设置为“是 (/ZW)”。这将启用组件扩展 (C++/CX);
  3. 在“解决方案资源管理器”中,选择项目节点,打开快捷菜单,然后选择“重定SDK版本目标”,“确定”;
  4. 在“解决方案资源管理器”中,选择项目节点,打开快捷菜单,然后选择“卸载项目”。然后,在卸载的项目节点上打开快捷菜单,然后选择编辑项目文件。找到WindowsTargetPlatformVersion 元素并将其替换为以下元素。然后关闭 .vcxproj 文件,再次打开快捷菜单,然后选择“重新加载项目”。现在,解决方案资源管理器会将该项目标识为 通用 Windows 项目。
<AppContainerApplication>trueAppContainerApplication>
<ApplicationType>Windows StoreApplicationType>

你可能感兴趣的:(移植,UWP,Win32,C++,DLL,移植)