Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

20 Oct 2020

UWP如何兼容C++程序

本文是一下文档的阅读笔记:

文中的很多内容跟C++/CX相关,但是如果使用C++/WinRT的话就不需要太关心那些内容,可以不适用/ZW编译选项。参考Move to C++/WinRT from C++/CX。另外Desktop Bridge的使用也已经不被提倡了,Visual Stduio提供了Packaging Project来帮助打包UWP App。

UWP App是跑在一个沙箱里面的(AppContainer),虽然可以使用Win32、CRT以及COM的API,但是使用上受到沙箱的限制,导致不是所有的API,或者传统的使用方式都受到支持。Windows App Certification Kit可以用来检测UWP App是否使用了某些被禁用的API。目前Visual Studio也已经集成打包和检测的一条龙服务。

Win32 and COM APIs for UWP apps 给出可以在UWP中使用的Win32和COM的API。

CRT functions not supported in Universal Windows Platform apps列举了不能在UWP中使用的C/C++ Runtime函数。

因为有些Win32 API不能用了,Alternatives to Windows APIs in UWP apps列举了一些替换用的WinRT API。

对于第三方库,比如Win32的静态库(.lib),可以直接引用并链接进UWP App。对于Win32的动态库(.dll),则必须作为添加进UWP项目,并作为内容打包到UWP包中,然后通过LoadPackagedLibrary来加载(而不是传统的LoadLibrary和LoadLibraryEx)。

如果UWP App中的DLL需要提供给其他APP使用,那么这个DLL必须是一个Windows Runtime Component,虽然后者也是一个DLL,但是携带元数据(winmd)。

对于EXE或者DLL形式的COM服务端,也可以在UWP App中使用,但是要经过一定处理。首先这个COM必须是registration-free COM component,然后其执行文件必须作为内容打包到UWP包中,然后通过CoCreateInstanceFromApp来实例化。更多参考Using Free-COM DLL in Windows Store C++ Project。或者你也可以把COM转化成Windows Runtime Component。

Visual Studio中定义了若干宏用于区分API:

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)    // UWP可用,只支持PC
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) // UWP可用,只支持手机
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)       // UWP可用,同时支持PC和手机
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)   // WIN32可用

生成在UWP中使用DLL的话,需要在项目上做一些配置(参考To port a native DLL to the UWP without creating a new project):

也就是要将传统Win32项目文具中的WindowsTargetPlatformVersion替换成下面内容:

<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<WindowsTargetPlatformVersion>10.0.10156.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.10156.0</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>

参考链接

(完)

comments powered by Disqus